Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Pagetitle
TCGenQry
TCGenQry

Permite a abertuda abertura 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

Bloco de código
collapsefalse
TCGenQry( < xPar1 >, < xPar2 >, < cQuery > )

...

Nome

Tipo

Descrição

Obrigatório

Referência

xPar1

nil

Compatibilidade.

X

 

xPar2

nil

Compatibilidade.

X

 

cQuery

caractere

String contendo a query que será aberta.

X

 

Retorno

Nome

Tipo

Descrição

cRet

caractere

Retorna sempre uma string vazia.

...

Nota
icontrue
titleAtenção

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

Devido aos campos do tipo "D" Data em AdvPL serem gravados no SGDB usando um campo do tipo "C" Caractere, este campo será retornado ao AdvPL como sendo um Caractere. É possível recuperar este campo com o tipo "D" Data do AdvPL usando a função TCSetField.

Uma Query aberta no AdvPL cria um cursor de leitura, que permite apenas duas instruções de navegação: DBKSip(), para avançar para o próximo registro do cursor, e DBGoTop() – que fecha o cursor e abre novamente, submetendo a query novamente ao Banco de Dados. Um cursor no AdvPL não permite alteração (DBRLock, REPLACE, FieldPut), não permite voltar para registro anterior – DbSkip(-1) – e não permite ir direto ao último registro – DBGoBottom().

A TCGenQry só suporta statements de query (SELECT).

Exemplos

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
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

...