Boa tarde Rochinha.
Creia-me, antes de colocar a minha postagem anterior, fiz tantos testes com os co0mandos ADO que já nem sei mais quantos,
e sempre tem algum detalhe que não funciona.
Abaixo segue a parte inicial do código. Vejamos:
Código: Selecionar todos
**
#include "adoXb.ch"
#include "AdoXb.prg"
*
#Include 'Inkey.ch'
#Include 'i_keybd.ch'
#include "MiniGUI.ch"
#include "ado.ch"
#include "set.ch"
#include "common.ch"
#include "directry.ch"
#include "fileio.ch"
#include "hbcompat.ch"
#include "hbwin.ch"
*
*STATIC oWnd, oClients, oClient, oName
*STATIC cName
*STATIC oSplit
*
REQUEST HB_GT_WIN_DEFAULT && Janela DOS - Temporário para testes.
*
*
*==================================================================================================
FUNCTION Main()
*
LOCAL oError := ErrorBlock( { | oError | MyErrorFunc( oError ) } )
*
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
HB_LANGSELECT("PT")
HB_CDPSELECT( "PT850" ) //pt850
*
SET DATE TO BRIT
SET CENTURY ON
*
Clear
*
PUBLIC StrDatabas := "C:\Teste\Small_ajustado.gdb"
PUBLIC StrConnect := "DRIVER=Firebird/InterBase(r) driver; UID=sysdba; PWD=masterkey; DBNAME="+StrDatabas
*
// Necessária para criar objetos e variaveis visíveis o tempo todo
ADOSetRDD( "ACCESS" )
*
ADOSetRDD( "FIREBIRD" ) // ADOGDB
ADORDDDefault( "FIREBIRD" ) // ADOGDB
cADORDD := "FIREBIRD"
*
SET_CORES()
*
Clear
*
ADO CONNECT StrConnect
*
? "Is ADOConnected:> "
?? ADOConnected()
*
ADO USE CliFor
? "ADOAreas:=>", Str( ADOAreas(), 04 ), "= ADOAlias:=>", ADOAlias()
WAIT
/*
Resposta do print acima:
Is ADOConnected:> .T.
ADOAreas:=> 1 = ADOAlias:=> CliFor
Press any key to continue...
*/
Então o sistema está conectado ao GDB e a tabela CLIFOR aberta. Esta tabela tem mais de 50 campos, mas para efeito de testes
vamos acessar somente as 3 primeiras colunas (com LEFT para caber na tela).
Como já relatado anteriormente,o ADOEof() não funciona. Entra em loop infinito quando chega no último registro.
WHILE ! ADOEof()
? Alltrim( Str( ADORecno() ) ),Left( ADOFIELD("NOME"), 20 ), Left( ADOFIELD( "CIDADE" ), 15 ), ADOFIELD( "CGC" )
ADOSkip()
ENDDO
Desativei essa rotina acima e estou usando a seguinte, que é uma gambiarra mas que, para os propósitos atuais funciona bem.
Código: Selecionar todos
WHILE .T.
? Alltrim( Str( ADORecno() ) ),Left( ADOFIELD("NOME"), 20 ), Left( ADOFIELD( "CIDADE" ), 15 ), ADOFIELD( "CGC" )
IF ADORecno() = ADORecCount()
EXIT
ENDIF
ADOSKIP()
ENDDO
RETURN( NIL )
Usando esta rotina de listagem acima, irei anexar alguma funções descritas no ADOxb.prg e relatar as dificuldades que encontrei.
Código: Selecionar todos
ADOLocate( 'NOME = "Maria"' )
? ADOFound(), "-", ADORecno(), "-", ADOField( 'NOME' ), ADOField( "CGC" )
ADOLocate( 'NOME = "Maria*"' )
? ADOFound(), "-", ADORecno(), "-", ADOField( 'NOME' ), ADOField( "CGC" )
ADOFind( "NOME = 'Maria'" )
? ADOFound(), "-", ADORecno(), "-", ADOField( 'NOME' ), ADOField( "CGC" )
ADOFind( "NOME = 'Maria*'" )
? ADOFound(), "-", ADORecno(), "-", ADOField( 'NOME' ), ADOField( "CGC" )
ADOFind( "NOME like 'Adriane Maria'" )
? ADOFound(), "-", ADORecno(), "-", ADOField( 'NOME' ), ADOField( "CGC" )
wait
WHILE .T.
? Alltrim( Str( ADORecno() ) ),Left( ADOFIELD("NOME"), 20 ), Left( ADOFIELD( "CIDADE" ), 15 ), ADOFIELD( "CGC" )
IF ADORecno() = ADORecCount()
EXIT
ENDIF
ADOSKIP()
IF ADORecno() = 10
WAIT
ENDIF
ENDDO
Veja o print gerado até no WAIT da linha 11:
.T. - 1 - Adalzira Muller Hefter 969.985.049-34
.T. - 1 - Adalzira Muller Hefter 969.985.049-34
.T. - 1 - Adalzira Muller Hefter 969.985.049-34
.T. - 1 - Adalzira Muller Hefter 969.985.049-34
.T. - 1 - Adalzira Muller Hefter 969.985.049-34
Press any key to continue...
Em todos os casos o ADOFound() informa que encontrou o alvo, pois tem mais de 20 Maria cadastradas, mas o apontador não foi deslocado para lá, e desta forma sempre o primeiro registro da tabela é apresentado.
O loop de listagem seguinte inicia no primeiro registro também.
Tenho mais uma dezena de dificuldades, mas acredito que uma vez solucionados e apontados os meus erros, os demais também serão corrigidos.
Me perdoe o tamanho desta mensagem, mas foi a única maneira de apresentar o problema todo. Caso haja necessidade posso enviar o arquivo GDB.