Neste caso, como sempre... Invertendo ou escondendo o jogo.
Eu não falei que ADO é melhor ou pior que coisa alguma.
Eu estou dizendo que prefiro usar SQLMIX.
Porquê ? Bem para demonstrar isso é mais simples ainda...
É impossÃvel vc ou qualquer outro fazer isso com ADO.
dbUseArea( .T., , "SELECT * FROM country", "country" )
BROWSE()
Para fazer isso, é preciso criar alguma coisa, para fazer a mesma coisa que o SQLMIX está fazendo. Quanto a rotina de GRAVAR/ALTERAR é SQL e temos que fazer a formatação dos dados, que é a mesma coisa do ADO e outros acessos nativos. Mas neste caso todas as linguagens fazem algo similar.
Já tem meses nesta discussão inútil... Vc se prendendo na parte de formatação dos dados e eu demonstrando que por mais que vc queira o RecordSet, não é DBF!
Minha pequena rotina de hoje, pra opção de DBF e MySQL.
cFileDbf := "corre" + Right( StrZero( nCont, 4 ), 2 )
IF .NOT. File( cFileDbf + ".DBF" )
cnMySql:cSql := "SELECT * FROM CORRENTE WHERE ANOBASE=" + StringSql( StrZero( nCont, 4 ) ) + " AND LOCOD=" + Ltrim( Str( mLocad00Cod ) ) + ;
" ORDER BY ANOBASE, LOCOD, NEXTRA, DB, DATA"
cnMySql:Execute()
cFileDbf := cnMySql:SqlToDbf( .T. )
cnMySql:Rs:Close()
ENDIF
Relendo tudo novamente para transformar em DBF, reinventando a roda simplesmente para não da o braço a torcer.
Por mais que vc queira esconder, não tem MOVEFIRST(), MOVENEXT, MOVELAST()..., vc está reescrevendo tudo que o SQLMIX faz transparentemente apenas para provar sua afirmação;
METHOD SQLToDBF() CLASS ADOClass
LOCAL nSelect, cDbfFile, nCont
nSelect := Select()
cDbfFile := MyTempFile( "dbf" )
SELECT 0
dbCreate( cDbfFile, ::oStructure )
USE ( cDbfFile ) ALIAS SqlToDbf
DO WHILE .NOT. ::Rs:Eof()
RecAppend()
FOR nCont = 1 TO Len( ::oStructure )
DO CASE
CASE ::oStructure[ nCont, 2 ] == "N"
FieldPut( nCont, ::NumberSql( ::oStructure[ nCont, 1 ] ) )
CASE ::oStructure[ nCont, 2 ] == "D"
FieldPut( nCont, ::DateSql( ::oStructure[ nCont, 1 ] ) )
OTHERWISE
FieldPut( nCont, ::StringSql( ::oStructure[ nCont, 1 ] ) )
ENDCASE
NEXT
::Rs:MoveNext()
ENDDO
::Rs:Close()
USE
SELECT ( nSelect )
RETURN cDbfFile
Esses códigos para transformar em DBF, ou simular no RecordSet um DBF...
METHOD MoveFirst() CLASS frmCadastroClass
IF ::cnMySql == NIL
GOTO TOP
ELSE
::cnMySql:cSql := "SELECT " + ::cMySqlField + " FROM " + ::cMySqlTable + " ORDER BY " + ::cMySqlField + " LIMIT 1"
::cn:Execute()
IF .NOT. ::cn:Eof()
::axKeyValue[ 1 ] := ::cn:StringSql( ::cMySqlField )
ENDIF
::cn:rs:Close()
ENDIF
RETURN NIL
Vai rodar, rodar e acabar fazendo um SQLMIX a lá Quintas!!! e depois ir dizendo que é tudo igual.
Saudações,
Itamar M. Lins Jr.