Histórico da Página
Composition Setup |
---|
import.css=/download/attachments/327912/newLayout.css |
...
Pagetitle | ||||
---|---|---|---|---|
|
...
Função: TCGenQry
Permite
...
a
...
abertura de
...
uma
...
query
...
diretamente
...
no
...
banco
...
de
...
dados
...
utilizado
...
na
...
conexão
...
atual,
...
mediante
...
uso
...
da
...
RDD
...
TOPCONN.
Sintaxe
Bloco de código | ||
---|---|---|
| ||
TCGenQry( |
...
< xPar1 >, < xPar2 >, < cQuery > )
|
Parâmetros
...
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. |
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
...
efetiva da query, foi adotada a convenção de
...
chamar a função TCGenQry
...
como terceiro parâmetro para a função
...
A string contendo a query a ser aberta é enviada diretamente ao
...
Inclusão de trecho | ||||||
---|---|---|---|---|---|---|
|
...
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
...
.
...
Nota | ||||
---|---|---|---|---|
| ||||
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: DBSkip(), 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 leitura de registros – queries iniciadas com SELECT. |
Exemplos
...
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#include 'totvs.ch' #include 'topconn.ch' USER FUNCTION TEST() Local cAlias := "JOIN" Local cTable1 := "T1" Local cTable2 := "T2" Local cQry := |
...
"SELECT |
...
T1_ |
...
NOME, |
...
T1_TIPO FROM T1 LEFT JOIN T2 on T1.T1_NOME = T2.T2_NICK" TCLink() IF TcCanOpen(cTable1) TCDelFile(cTable1) Endif IF TcCanOpen(cTable2) TCDelFile(cTable2) Endif DBCreate(cTable1, {{"T1_NOME", "C", 10, 0}, ; {"T1_TIPO", "C", 10, 0}}, "TOPCONN") DBCreate(cTable2, {{"T2_NICK", "C", 10, 0}, ; {"T2_AGE", "C", 10, 0}}, "TOPCONN") DBUseArea(.T., "TOPCONN", cTable1, (cTable1), .F., .F. ) (cTable1)->( DBAppend( .F. ) ) (cTable1)->T1_NOME := "JOHN" (cTable1)->T1_TIPO := "PESSOA" (cTable1)->( DBCommit() ) DBCloseArea() DBUseArea(.T., |
...
"TOPCONN |
...
", TCGenQry(NIL,NIL, |
...
cQry), |
...
(cAlias) , .F., .T. ) |
...
WHILE !Eof() CONOUT("T1_NOME = " + (cAlias)->T1_NOME) CONOUT("T1_TIPO = |
...
...
" + (cAlias)->T1_TIPO)
DbSkip()
ENDDO
DBCloseArea()
TCUnlink()
RETURN
|
O mesmo exemplo acima também pode ser escrito com COMANDOS do
Inclusão de trecho | ||||||
---|---|---|---|---|---|---|
|
Exemplo com comandos
Bloco de código |
---|
#include 'totvs.ch'
#include 'topconn.ch'
USER FUNCTION TEST()
Local cAlias := "JOIN"
Local cTable1 := "T1"
Local cTable2 := "T2"
Local cQry := "SELECT T1_NOME, T1_TIPO FROM T1 LEFT JOIN T2 ON T1.T1_NOME = T2.T2_NICK"
TCLink()
IF TcCanOpen(cTable1)
TCDelFile(cTable1)
Endif
IF TcCanOpen(cTable2)
TCDelFile(cTable2)
Endif
DBCreate(cTable1, {{"T1_NOME", "C", 10, 0}, ;
{"T1_TIPO", "C", 10, 0}}, "TOPCONN")
DBCreate(cTable2, {{"T2_NICK", "C", 10, 0}, ;
{"T2_AGE", "C", 10, 0}}, "TOPCONN")
USE (cTable1) ALIAS (cTable1) EXCLUSIVE NEW VIA "TOPCONN"
DBAppend( .F. )
REPLACE T1_NOME WITH "JOHN"
REPLACE T1_TIPO WITH "PESSOA"
DBCommit()
USE
TCQUERY (cQry) ALIAS (cAlias) NEW
WHILE !Eof()
CONOUT("T1_NOME = " + (cAlias)->T1_NOME)
CONOUT("T1_TIPO = " + (cAlias)->T1_TIPO)
DbSkip()
ENDDO
USE
TCUnlink()
RETURN
|
Veja também
- TCGenQry2
- TCSetField
- TCLink
- TCUnlink
- DBUseArea
- DBStruct
- DBCreate
- DBCloseArea
- DBSkip
- TCDelFile
- Comando USE
- Comando TCQUERY