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