Função: TCGenQry
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 o 3o parâmetro da função DbUseArea() -- que corresponderia ao nome da tabela.
TCGenQry ( [ xPar1], [ xPar2], < cQuery> ) --> cRet
Nome | Tipo | Descrição | Obrigatório | Referência |
xPar1 | Nulo | Compatibilidade. | ||
xPar2 | Nulo | Compatibilidade. | ||
cQuery | Caracter | Indica a expressão da query que será aberta. | X |
- (caracter)
- Retorna sempre uma string vazia.
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().
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.
User Function LeSX2()
Local cQuery := 'SELECT X2_CHAVE CHAVE, R_E_C_N_O_ RECNO from SX2990'
// Função do Framework AdvPL, "ajusta" a query para sintaxes e ajustes
// específicos de acordo com o banco de dados da conexão atual
cQuery := ChangeQuery(cQuery)
dbUseArea(.T., 'TOPCONN', TCGenQry(,,cQuery),'TRB', .F., .T.)
While !Eof()
conout("Registro do SX2: "+TRB->CHAVE)
dbSkip()EndDo
dbCloseArea()
Return
O mesmo exemplo acima, a função DbUseArea() poderia ser substituída pelo comando USE, com a seguinte sintaxe:
USE (TcGenQry(,,cQuery)) ALIAS TRB NEW VIA "TOPCONN"