Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 7 Próxima »

Permite a abertuda de uma query diretamente no banco de dados utilizado na conexão atual, mediante uso da RDD TOPCONN. O retorno desta função deve ser passado como 3º parâmetro da função DbUseArea, conforme exemplo abaixo.

Sintaxe

TCGenQry( < xPar1 >, < xPar2 >, < cQuery > )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

xPar1

nil

Compatibilidade.

X

 

xPar2

nil

Compatibilidade.

X

 

cQuery

caractere

Indica a expressão da query que será aberta.

X

 

Retorno

Nome

Tipo

Descrição

cRet

caractere

Retorna sempre uma string vazia.

Observações

Essa função determina que a próxima chamada à função DbUseArea será a abertura de uma query na conexão atual com um SGBD, e não de uma tabela física, quando utilizada a RDD "TOPCONN". Devido à dependência direta da chamada subsequente da função DbUseArea para a abertura efetifva da query, foi adotada a convenção de chamar a função TCGenQry como terceiro parâmetro para a função DbUseArea.

A string contendo a query a ser aberta é enviada diretamente ao DBAccess, que por sua vez fará a execução do statement diretamente no SGBD em uso pela conexão, fará um "describe" das colunas de retorno do statement, e retornará em caso de sucesso a definição de colunas retornadas pela query. O Application Server, por sua vez, ao receber a confirmação de sucesso da operação e a definição de colunas, vai abrir a query como se fosse uma tabela física normal, sob o alias especificado como parâmetro para a função DbUseArea(), onde a estrutura de dados dessa tabela "virtual" corresponde a uma definição similar à retornada pela função DbStruct.

Atenção

Logo, ao abrirmos uma query no AdvPL, podemos retornar diretamente apenas campos "caractere" (Char ou VarChar do SGBD) e numéricos (INT e/ou FLOAT). Caso alguma coluna selecionada não atenda estes quesitos, ela será removida da estrutura de retorno no momento da abertura da query.

Exemplos

USER FUNCTION TEST()

  Local cJoin  := "JOIN"
  Local cTable := "T1"
  Local cQry   := "SELECT field_name, field_type FROM t1 left join t2 on t1.field_name = t2.field_nick"
  
  TcLink()
  
  TCDelFile("T1")
  TCDelFile("T2")
  
  DBCreate("T1", {{"FIELD_NAME", "C", 10, 0}, ;
                  {"FIELD_TYPE", "C", 10, 0}}, "TOPCONN")
                  
  DBCreate("T2", {{"FIELD_NICK", "C", 10, 0}, ;
                  {"FIELD_AGE", "C", 10, 0}}, "TOPCONN")
                  
  DBUseArea(.T., "TOPCONN", cTable, (cTable), .F., .F. )
  
  (cTable)->( DBAppend( .F. ) )
  (cTable)->FIELD_NAME := "NOME"
  (cTable)->FIELD_TYPE := "TIPO"
  (cTable)->( DBCommit() )
  
  DBCloseArea()
  
  DBUseArea(.T., "TOPCONN", TCGenQry(NIL,NIL,cQry), (cJoin) , .F., .T. )
  
  WHILE !Eof()
    CONOUT("FIELD_NAME = " + (cJoin)->FIELD_NAME)
    CONOUT("FIELD_TYPE = " + (cJoin)->FIELD_TYPE)
    DbSkip()
  ENDDO
  
  DBCloseArea()
  
  TCUnlink()
  
RETURN

Veja também

  • Sem rótulos