Página 1 de 1

Minha classe intermediária pra ADO

Enviado: 10 Abr 2024 16:58
por JoséQuintas
Primeiro entenda o ADO e SQL, depois use a classe.
Basicamente é só um wrapper, só rotinas intermediárias.

Primeira coisa: precisa da variável com conexão, pública ou outro modo pra multithread.

Código: Selecionar todos

AppConexao := ConexaoMySQL() // crie conforme seu servidor

Código: Selecionar todos

PROCEDURE LISTASIMPLES

   LOCAL cnSQL := ADOClass():New( AppConexao )

   WITH OBJECT cnSQL
      :cSQL := "SELECT * FROM CLIENTES ORDER BY NAME"
      Execute()
      DO WHILE ! :Eof()
           ? :String( "NOME", 30 )
           ? :String( "ENDERECO", 30 )
          ? :String( "CIDADE", 30 )
         :MoveNext()
    ENDDO
   :CloseRecordset()
   ENDWITH
RETURN
Em tbrowse, semelhante, seja console, gtwvg, hwgui, minigui, ou outra.

Pra facilitar conversão, tem rotina pra DBF e SQL.
É trocar o REPLACE campo WITH conteudo por :QueryAdd( "campo", conteudo )

Código: Selecionar todos

WITH OBJECT cnSQL
   :QueryCreate()
   :QueryAdd( "CODIGO", nCodigo )
   :QueryAdd( "NOME", cNome )
   :QueryAdd( "ENDERECO", cEndereco )
   :DBFQueryExecuteInsert() // em DBF
   :QueryExecuteInsert( "CLIENTES" ) // MySQL
   // tem também DBFQueryExecuteUpdate()
   // e QueryExecuteUpdate( "CLIENTES", "codigo=5" ) // pra atualizar o SQL precisa saber a chave
ENDWITH
Durante a migração pode:

a) Executar somente o de DBF
Continua tudo funcionando, apenas trocou o fonte. continua rodando nos clientes normalmente

b) Depois pode executar DBF e SQL
Continua tudo funcionando, mas agora também salva no MySQL
Pode instalar nos clientes e acompanhar o funcionamento
Pode alterar o fonte que quiser, da tabela que quiser, pra deixar de usar DBF e usar MySQL, afinal, tem tudo nos dois

c) Depois deixa só o SQL
Quando não precisar mais do DBF, apenas apaga a linha de salvar em DBF
Já vai estar tudo testado e funcionando.

A classe está mais voltada pra MySQL, mas não impede o uso em outras bases de dados

Com certeza essa é apenas uma parte das funcionalidades.
Mas se aí faz leitura e gravação (inclusão/atualização).... acho que tem a parte mais importante.

Lógico, precisa entender de ADO, SQL, e da base que vai usar, afinal, vai criar tabelas, criar índices, definir o tipo de cada campo como incremental, int, double, decimal, char, varchar, text, date, datetime, etc., codepage do banco de dados, codepage da conexão, etc. precisa conhecer essas coisas primeiro, pra não ter problemas depois.

Minha classe intermediária pra ADO

Enviado: 11 Abr 2024 08:31
por malcarli
Bom dia Mestre, está classe está disponível?

obrigado

Minha classe intermediária pra ADO

Enviado: 11 Abr 2024 11:25
por JoséQuintas
Vou deixar mais independente do aplicativo pra colocar no github.

Eu tinha feito browse em hwgui e minigui, mas não sei se ainda estão por aqui.
Só passei a salvar testes a partir do dlgauto.

Minha classe intermediária pra ADO

Enviado: 11 Abr 2024 11:52
por JoséQuintas
De repente até altero o dlgauto pra gerar automático pra SQL além de DBF....

Código: Selecionar todos

METHOD First() CLASS frm_Class

   IF ::lIsSQL
      ::cn:Execute( "SELECT " + ::cDataField + " FROM " + ::cDataTable + " ORDER BY " + ::cDataField + " LIMIT 1" )
      //
      ::cn:CloseRecordset()
   ELSE
      GOTO TOP
   ENDIF
   ::UpdateEdit()

   RETURN Nil

METHOD Last() CLASS frm_Class

   IF ::lIsSQL
      ::cn:Execute( "SELECT " + ::cDataField + " FROM " + ::cDataTable + " ORDER BY " + ::cDataField + " DESC LIMIT 1" )
      //
      ::cn:CloseRecordset()
   ELSE
      GOTO BOTTOM
   ENDIF
   ::UpdateEdit()

   RETURN Nil

METHOD Next() CLASS frm_Class

   IF ::lIsSQL
      ::cn:Execute( "SELECT " + ::cDataField + " FROM " + ::cDataTable + " WHERE " + ::cDataField + ;
         " > " + ::axKeyValue + " ORDER BY " + ::cDataField + " DESC LIMIT 1" )
      //
      ::cn:CloseRecordset()
   ELSE
      SKIP
      IF Eof()
         GOTO BOTTOM
      ENDIF
   ENDIF
   ::UpdateEdit()

   RETURN Nil

METHOD Previous() CLASS frm_Class

   IF ::lIsSQL
      ::cn:Execute( "SELECT " + ::cDataField + " FROM " + ::cDataTable + " WHERE " + ::cDataField + ;
         " < " + ::axKeyValue + " ORDER BY " + ::cDataField + " LIMIT 1" )
      //
      ::cn:CloseRecordset()
   ELSE
      SKIP -1
      IF Bof()
         GOTO TOP
      ENDIF
      ::UpdateEdit()
   ENDIF

   RETURN Nil
Por enquanto só está anotado.
No dlgauto tem a situação de trabalhar sem chave de acesso, e não pensei como resolver essa questão.

Minha classe intermediária pra ADO

Enviado: 17 Abr 2024 20:49
por fladimir
qual odbc instala pra usar com ela?
uma vez cheguei a tentar testar, mas não funcionou

Minha classe intermediária pra ADO

Enviado: 17 Abr 2024 21:19
por JoséQuintas
fladimir escreveu:qual odbc instala pra usar com ela?
uma vez cheguei a tentar testar, mas não funcionou
Qualquer uma, mas tenho usado MySQL 5.3, tanto pra MySQL quando MariaDB.

Lembrando: harbour 32 bits, é tudo 32 bits, incluindo o ODBC.

É só fazer um teste sem a classe, se funcionar sem a classe também funciona com a classe.

Código: Selecionar todos

oConexao := win_OleCreateObject( "ADODB.Connection" )
oConexao:ConnectionString := "string" // conforme o odbc
oConexao:CursorLocation := 3
oConexao:Open()
oRs := oConexao:Execute( "SELECT 10 AS QTD" )
? oRs:Fields( "QTD" ):Value
oRs:Close()
oConexao:Close()
Isso acima é sem a classe.
Se isso funcionar, a máquina tá pronta pra ADO e pra classe.

O que a classe vai usar é a conexão, a mesma criada aí encima.

Se criar pra Excel, SQLite, PostGres, MySQL, SQLServer, Access, DBF, tanto faz.