Clipper On Line • Ver Tópico - Meu modo de trabalho

Meu modo de trabalho

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Meu modo de trabalho

Mensagempor JoséQuintas » 23 Mar 2020 19:44

Mexi na minha atualização de DBFs.

STATIC FUNCTION JPFORPAGCreateDbf( nVersaoDBF )

   LOCAL aStruList := { ;
      { "IDFORPAG",   "C", 6 }, ;
      { "FPDESCRI",   "C", 80 } }

   hb_Default( @nVersaoDbf, AppVersaoDbfAnt() )
   IF nVersaoDBF < 20200315
      AAdd( aStruList, { "FPNUMLAN",   "C", 6 } )
   ENDIF

   SayScroll( "JPFORPAG, verificando atualizações" )

   IF ! ValidaStru( "jpforpag", aStruList )
      MsgStop( "jpforpag não disponível!" )
      QUIT
   ENDIF
   CLOSE DATABASES
   IF nVersaoDBF >= 20200315
      RETURN NIL
   ENDIF
   SayScroll( "Atualizando JPFORPAG.DBF" )
   IF ! UseSoDbf( "jpforpag", , .T. )
      QUIT
   ENDIF
   GOTO TOP
   GrafTempo( "JPFORPAG" )
   DO WHILE ! Eof()
      GrafTempo( RecNo(), LastRec() )
      IF Val( jpforpag->idForPag ) == 0
         RecLock()
         REPLACE jpforpag->idForPag WITH jpforpag->fpNumLan
      ENDIF
      SKIP
   ENDDO
   CLOSE DATABASES
   JPFORPAGCreateDbf( 20200315 )

   RETURN NIL


Notem que a atualização chama ela mesma novamente no final.

Então: dividi a atualização em duas partes.

A primeira é essa:

Ela faz tudo que precisa no DBF.
Acrescenta campos novos (e/ou antigos), se precisar.
Faz a conversão, se precisar.
E no final chama ela mesma, pra retirar o lixo antigo da estrutura.
Ou seja, entrou aí do jeito velho, sai do jeito novo, e fim.

A segunda é com atualizações por data.

Antes:

- acrescentava campos novos em todos os arquivos
- rodava atualizações especiais por data, em todos os arquivos
- no final, apagava os campos antigos "lixo" de todos os arquivos

Problema que surgiu:
Pra gravar no MySQL, que ficava nas atualizações por data (no meio), não podia ter campo "lixo".
Isso complicou, acabei fazendo novas atualizações antes de salvar, mas tava quase perdendo o controle.

Nova atualização:
- acrescenta campos novos num arquivo
- faz o que tem que fazer com o arquivo
- assim que acabou com esse arquivo, já remove campos "lixo".
- Pode processar normalmente as atualizações por data depois, e pronto.

Essas por data, pode ser por exemplo: isso de salvar no MySQL, ou outras coisas não relacionadas a apenas estrutura, ou que dependem de mais de um arquivo ao mesmo tempo.

É o jeito... pra tudo se atualizar sozinho, a qualquer data, só assim mesmo.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 14:44

Este é o meu esquema, com minha classe, com meus arquivos.
Pode não servir pra outros, mas pode dar uma idéia.
Mudando pra gravação dupla, por enquanto.

Tô mexendo também na estrutura, então atualização do DBF
Vai alterar o campo MCNUMLAN pra IDMDFCAB
MDF porque é o MDFE, e CAB porque é o cabeçalho do MDFE.

STATIC FUNCTION JPMDFCABCreateDbf( nVersaoDBF )

   LOCAL aStruList := { ;
      { "IDMDFCAB",  "C", 6 }, ;
      { "MCDATEMI",  "D", 8 }, ;
      { "MCCHAVE",   "C", 44 }, ;
      { "MCUFORI",   "C", 2 }, ;
      { "MCUFDES",   "C", 2 }, ;
      { "MCVEICULO", "C", 6 }, ;
      { "MCMOTORI",  "C", 6 }, ;
      { "MCSTATUS",  "C", 6 }, ;
      { "MCINFINC",  "C", 80 }, ;
      { "MCINFALT",  "C", 80 } }

   hb_Default( @nVersaoDbf, AppVersaoDbfAnt() )
   IF nVersaoDBF < 20200324
      AAdd( aStruList, { "MCNUMLAN", "C", 6 } )
   ENDIF
   SayScroll( "JPMDFCAB.DBF, Verificando atualizações" )

   IF ! ValidaStru( "jpmdfcab", aStruList )
      MsgStop( "jpmdfcab não disponível!" )
      QUIT
   ENDIF
   IF nVersaoDBF >= 20200324
      RETURN NIL
   ENDIF
   IF ! UseSoDbf( "jpmdfcab", .T. )
      QUIT
   ENDIF
   GOTO TOP
   DO WHILE ! Eof()
      IF Empty( jpmdfcab->IdMdfCab )
         RecLock()
         REPLACE jpmdfcab->idMdfCab WITH StrZero( Val( jpmdfcab->mcNumLan ), 6 )
      ENDIF
      SKIP
   ENDDO
   CLOSE DATABASES
   JPMDFCABCreateDBF( 20200324 )

   RETURN NIL


E alterei o respectivo fonte, já alterando a variável mIdMdfCab pra numérica.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 14:46

Próximo passo, criar estrutura no MySQL
Meio compatível ainda.

STATIC FUNCTION JPMDFCABCreateSQL()

   RETURN ;
      "CREATE TABLE IF NOT EXISTS JPMDFCAB ( " + ;
      "IDMDFCAB INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, " + ;
      "MCDATEMI DATE NULL, " + ;
      "MCCHAVE VARCHAR(44) NOT NULL DEFAULT '', " + ;
      "MCUFORI VARCHAR(2) NOT NULL DEFAULT '', " + ;
      "MCUFDES VARCHAR(2) NOT NULL DEFAULT '', " + ;
      "MCVEICULO VARCHAR(6) NOT NULL DEFAULT '', " + ;
      "MCMOTORI VARCHAR(6) NOT NULL DEFAULT ''," + ;
      "MCSTATUS VARCHAR(6) NOT NULL DEFAULT ''," + ;
      "MCINFINC VARCHAR(80) NOT NULL DEFAULT ''," + ;
      "MCINFALT VARCHAR(80) NOT NULL DEFAULT ''," + ;
      "PRIMARY KEY ( IDMDFCAB ) " + ;
      ") COLLATE=latin1_swedish_ci ENGINE=InnoDB"
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 14:47

E a transferência dos dados atuais para o MySQL
Só transferir, normal....

STATIC FUNCTION Update0324()

   IF AppConexao() == NIL
      RETURN NIL
   ENDIF

   SayScroll( "2020/03/24 Copiando JPMDFCAB.DBF para JPMDFCAB.SQL" )
   CopyDBFToMySQL( "JPMDFCAB", .T., .F., .T. )

   RETURN NIL
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 14:50

Alterar a parte de gravação:

   WITH OBJECT ::cnSQL
      :QUeryAdd( "MCDATEMI", mmcDatEmi )
      :QueryAdd( "MCUFORI",  mmcUfOri )
      :QueryAdd( "MCUFDES",  mmcUfDes )
      :QueryAdd( "MCVEICULO", StrZero( mIdVeiculo, 6 ) )
      :QueryAdd( "MCMOTORI",  StrZero( mIdMotori, 6 ) )
      :QueryAdd( "MCSTATUS",  mmcStatus )
      IF ::cOpc == "I"
         mIdMdfCab := ::axKeyValue[ 1 ]
         :QueryAdd( "MCINFINC", LogInfo() )
         IF mIdMdfCab == 0
            mIdMdfCab := :QueryExecuteInsert( "JPMDFCAB" )
            :QueryAdd( "IDMDFCAB", StrZero( mIdMdfCab, 6 ) )
         ELSE
            :QueryAdd( "IDMDFCAB", StrZero( mIdMdfCab, 6 ) )
            :QueryExecuteInsert( "JPMDFCAB" )
         ENDIF
         :DBFQueryExecuteInsert()
         @ ::RowIni() + 1, 22 SAY mIdMdfCab PICTURE "999999"
      ELSE
         :QueryAdd( "MCINFALT", LogInfo() )
         :DBFQueryExecuteUpdate( "JPMDFCAB" )
         :QueryExecuteUpdate( "JPMDFCAB", "IDMDFCAB = " + NumberSQL( mIdMdfCab ) )
      ENDIF
   ENDWITH


É um array com campo/conteúdo.
:DBFQueryExecuteInsert() grava no DBF
:QueryExecuteInsert() grava no MySQL
:DBFQueryExecuteUpdate() grava no DBF
:QueryExecuteUpdate() grava no MySQL

Aqui, já pegando o retorno do insert no MySQL, porque o campo é incremental, e o MySQL vai numerar.
Opcionalmente, o usuário pode escolher um número (sempre tem exceções)
Obrigatoriamente o DBF precisa estar posicionado.
Ok, trabalhando com a dupla DBF + MySQL, nada fora do comum os dois "andarem sincronizados".

A partir deste momento, DBF e MySQL tem o mesmo conteúdo.
Falta a parte de exclusão.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 15:01

E não é que a exclusão tava errada.
Só estava excluindo manifesto, mas não os detalhes do manifesto (as notas)

METHOD Delete() CLASS JPMDFCABClass

   LOCAL mIdMdfCab

   IF AppUserLevel() > 1
      MsgExclamation( "Não autorizado a excluir lançamento" )
      RETURN NIL
   ENDIF
   mIdMdfCab := ::axKeyValue[ 1 ]
   IF ! MsgYesNo( "Confirma a exclusão?" )
      RETURN NIL
   ENDIF
   WITH OBJECT ::cnSQL
      :ExecuteCmd( "DELETE FROM JPMDFDET WHERE MDMDFNUM = " + NumberSQL( mIdMDFCab ) )
      :ExecuteCmd( "DELETE FROM JPMDFCAB WHERE IDMDFCAB = " + NumberSQL( mIdMDFCab ) )
      DO WHILE .T.
         IF ! Encontra( StrZero( mIdMdfCab, 6 ), "jpmdfdet", "mdf" )
            EXIT
         ENDIF
         jpmdfdet->( RecDelete() )
      ENDDO
      Encontra( StrZero( mIdMdfCab, 6 ), "jpmdfcab", "primary" )
      RecDelete()
   ENDWITH

   RETURN NIL


Agora sim, os dois vão ficar totalmente sincronizados, DBF e MySQL, seja inclusão, alteração ou exclusão.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 15:05

Já que posso usar qualquer um dos dois, DBF ou MySQL, porque não já agilizar o browse?

METHOD GridSelection() CLASS JPMDFCABClass

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

   WITH OBJECT cnSQL
      :cSQL := "SELECT IDMDFCAB, MCDATEMI, MCUFORI, MCOFDES, MCSTATUS, MCCHAVE" + ;
         " FROM JPMDFCAB" + ;
         " ORDER BY IDMDFCAB DESC"
      :Execute()
      oTBrowse := { ;
         { "NÚMERO",  { || Str( :Number( "IDMDFCAB" ), 6 ) } }, ;
         { "EMISSÃO", { || :Date( "MCDATEMI" ) } }, ;
         { "ORIGEM",  { || :String( "MCUFORI", 2 ) } }, ;
         { "DESTINO", { || :String( "MCUFDES", 2 ) } }, ;
         { "STATUS",  { || jpmdfStatus( :String( "MCSTATUS", 2 ) ) } }, ;
         { "CHAVE",   { || :String( "MCCHAVE", 44 ) } } }
      BrowseADO( cnSQL, oTBrowse, "", { || StrZero( :Number( "IDMDFCAB" ), 6 ) } )
   ENDWITH

   RETURN NIL


Opcionalmente, posso deixar só os últimos 1000, pra ficar mais rápido. Vejo depois que testar.
Nem sei pra que serve guardar os antigos, muito menos ficar consultando ... rs
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 15:18

mdf.png


Estou com muita vontade de mudar pelo menos esses browses pra GUI, mas me segurando pra não mexer nisso antes de terminar tudo.

Quem usa DBF... vai dizer que o cara do SQL é louco em trazer 10.000 registros
Já quem usa SQL... vai dizer que o cara do DBF é louco kkkk

MEIO SEGUNDO.
O cara do SQL não é louco, mas o cara do DBF precisa ver para acreditar.
Manter a rede ocupada no browse pra que? se posso trazer tudo em meio segundo
Vários anos de manifesto em MEIO SEGUNDO !!!!

Pensei que ia demorar mais, baseado em outros, mas é porque este não tem relacionamento com nada, é só ele mesmo.
Mesmo assim, limitar aos 1.000 últimos.

Exagerei um pouco, não são 10.000 registros em meio segundo, são só 9.381.... rs
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 15:28

Agora começar a eliminar o uso do DBF.
Alterar rotinas que trabalham com ele em uso, e posicionado, pra receber a ID do manifesto e usar o MySQL.

Alterar isso antes de mexer no detalhe do manifesto, pra não correr riscos.
Mas eliminar os dois de uma vez depois.

Acabei desviando minha migração, pra fazer esses dois primeiros.
Eles tem pouco uso, praticamente uma única tela, vai dar pra eliminar rápido os dois DBFs.

Diferente de trabalhar com DBF:
Trabalhar com DBF: é trabalhar SEMPRE com o DBF aberto e posicionado, os fontes seguem isso.
Trabalhar com SQL: é praticamente trabalhar com NADA aberto, sempre com uma variável de ID, pra permitir buscar informações sobre o registro atual.

Parece uma diferença simples, mas sabemos que nossos fontes sempre foram direcionados pra DBF aberto, posicionado, e usando os campos de DBF.
Pra relatórios... sem problema... sempre buscamos tudo.
Mas pra telas de digitação.... precisa muito cuidado nas alterações, porque não vai mais estar posicionado no registro.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 15:37

mdfe.png


Ainda no MDF, vejam lá:
- Exclui
- Altera
- Emite
- Encerra
- VerPDF
- Cancela

Todas essas rotinas trabalham encima do registro atual do DBF.

Então, vou alterar uma de cada vez, pra usar o ID do manifesto como referência.
Assim que terminar, só apagar o DBF.

Mas como MDFCAB e MDFDET são ligados, vou procurar eliminar os dois de uma vez, até pra simplificar os comandos SQL.
Só questão de tempo e paciência agora.
Só tomar cuidado.

Mas.... já posso instalar nos clientes, mesmo não tendo terminado !!!!
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 16:05

JoséQuintas escreveu:Mas.... já posso instalar nos clientes, mesmo não tendo terminado !!!!


Esta parte é a interessante:
Se eu alterar os fontes daqui pra frente, pra usar só MySQL, só preciso trocar o EXE nos clientes.
E quando terminar, só preciso apagar o DBF.

Como eu digo por aqui, NÃO tenho problema com DBF.
Então, fazer isso é tranquilo.

Quem tá com problema em DBF, seria interessante procurar resolver, antes de fazer isso.
Porque se tiver problema.... pode ser o mesmo que tinha com DBF, ou pode ser um novo... não vai saber.

Mas é mais tranquilo desse jeito, porque tem todo tempo daqui pra frente pra testar/trocar.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 16:24

Uma parte interessante:

São 5 linhas juntas, TODAS usando o DBF só por causa do número.

      hb_MemoWrit( "NFE\MDFE-" + jpmdfcab->idMdfCab + "-02-SemAssinatura.xml",  cXml )
      hb_MemoWrit( "NFE\MDFE-" + jpmdfcab->idMdfCab + "-03-Assinado.xml",  oSefaz:cXmlDocumento )
      hb_MemoWrit( "NFE\MDFE-" + jpmdfcab->idMdfCab + "-04-Recibo.xml",    oSefaz:cXmlRecibo )
      hb_MemoWrit( "NFE\MDFE-" + jpmdfcab->idMdfCab + "-05-Protocolo.xml", oSefaz:cXmlProtocolo )
      hb_MemoWrit( "NFE\MDFE-" + jpmdfcab->idMdfCab + "-06-Retorno.xml",   oSefaz:cXmlRetorno )


Agora, mesmo que ainda não esteja pra MySQL, só resta uma linha pra resolver

     mIdMdfCab := jpmdfcab->idMdfCab
      hb_MemoWrit( "NFE\MDFE-" + midMdfCab + "-02-SemAssinatura.xml",  cXml )
      hb_MemoWrit( "NFE\MDFE-" + midMdfCab + "-03-Assinado.xml",  oSefaz:cXmlDocumento )
      hb_MemoWrit( "NFE\MDFE-" + midMdfCab + "-04-Recibo.xml",    oSefaz:cXmlRecibo )
      hb_MemoWrit( "NFE\MDFE-" + midMdfCab + "-05-Protocolo.xml", oSefaz:cXmlProtocolo )
      hb_MemoWrit( "NFE\MDFE-" + midMdfCab + "-06-Retorno.xml",   oSefaz:cXmlRetorno )


Preciso reduzir o uso NOS FONTES.
É assim que vou fazendo, reduzindo aos poucos a necessidade do DBF.
Desse jeito fica mais "sob controle".
Quanto menos coisa pra resolver, mais fácil.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 18:44

Um erro interessante:

Esqueci que a autorização, o encerramento, o cancelamento, etc. causam alteração do manifesto.
Então... o MySQL já ficaria errado, diferente do correto que tá no DBF.

Até aí, tudo bem, corrijo os que faltaram, e posso transferir novamente o DBF que está correto.

Então... a gravação dupla serve até pra corrigir gravação errada no MySQL.
Por isso é bom que DBF funcione direito, porque é a base do MySQL.

Por enquanto o importante é:
DBF e MySQL precisam estar exatamente iguais, como prova de funcionamento.

E ir eliminando o DBF, confirmando/revisando se tudo ok mesmo, e se não vai fazer falta.

Terminado isso sim, vai ser só apagar o DBF.

A vantagem de poder instalar antecipado no cliente é que o uso vai ser mais pesado, e vai ter mais informação pra conferir/validar, pra ver se realmente tudo está ok.
Nesse caso, por exemplo, esqueci de algumas situações importantes que atualizam informação.
Mas não causa nenhum problema, porque o DBF ainda está lá.

Nota: descobri ainda mexendo nos fontes, ainda não instalei em lugar nenhum.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 24 Mar 2020 19:19

Mais ajustes.
Se vou alterar o campo pra numérico, é melhor garantir que só tenha número antes de enviar pro MySQL.
Assim NÃO tenho imprevistos depois.

   REPLACE ;
            jpmdfcab->idMdfCab WITH StrZero( Val( jpmdfcab->mcNumLan ), 6 ), ;
            jpmdfcab->mcMotori WITH StrZero( Val( jpmdfcab->mcMotori ), 6 ), ;
            jpmdfcab->mcVeiculo WITH StrZero( Val( jpmdfcab->mcVeiculo ), 6 )
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Convertendo manifesto pra ADO-SQL

Mensagempor JoséQuintas » 25 Mar 2020 09:16

Já fiz do outro relacionado, o detalhe do manifesto.
Neste aqui criei um campo que não existia o ID
Gravar o default como RecNo()
Esse campo vai ser a chave pra atualizar MySQL

STATIC FUNCTION JPMDFDETCreateDbf( nVersaoDBF )

   LOCAL aStruList := { ;
      { "IDMDFDET",  "C", 6 }, ;
      { "MDMDFNUM",  "C", 6 }, ;
      { "MDNUMDOC",  "C", 9 }, ;
      { "MDDATEMI",  "D", 8 }, ;
      { "MDUF",      "C", 2 }, ;
      { "MDCIDADE",  "C", 21 }, ;
      { "MDCLIENTE", "C", 6 }, ;
      { "MDPESO",    "N", 6 }, ;
      { "MDVALMER",  "N", 12, 2 }, ;
      { "MDCHAVE",   "C", 44 }, ;
      { "MDINFINC",  "C", 80 }, ;
      { "MDINFALT",  "C", 80 } }

   hb_Default( @nVersaoDBF, AppVersaoDbfAnt() )
   SayScroll( "JPMDFDET.DBF, Verificando atualizações" )

   IF ! ValidaStru( "jpmdfdet", aStruList )
      MsgStop( "jpmdfdet não disponível!" )
      QUIT
   ENDIF

   IF nVersaoDBF >= 20200324
      RETURN NIL
   ENDIF
   IF ! UseSoDbf( "jpmdfdet", .T. )
      QUIT
   ENDIF
   GrafTempo( "JPMDFDET" )
   DO WHILE ! Eof()
      GrafTempo( RecNo(), LastRec() )
      RecLock()
      REPLACE ;
         jpmdfdet->mdCliente WITH StrZero( Val( jpmdfdet->mdCliente ), 6 ), ;
         jpmdfdet->IdMdfDet WITH StrZero( RecNo(), 6 ), ;
         jpmdfdet->mdmdfnum WITH StrZero( Val( jpmdfdet->mdMdfNum ), 6 ), ;
         jpmdfdet->mdNumDoc WITH StrZero( Val( jpmdfdet->mdNumDoc ), 9 )
      SKIP
   ENDDO
   CLOSE DATABASES
   JPMDFDETCreateDbf( 20200324 )

   RETURN NIL


Quase que preciso trocar no cliente agora há pouco pra resolver outro problema.
Por isso vou fazendo em partes, mesmo que não instale no cliente, porque nunca se sabe.

Aqui, como NÃO alterei o número de versão, essas rotinas são executadas SEMPRE, a cada carga do aplicativo.
Assim que ok, altero o controle de versão pra 2020.03.25, assim converte e transfere uma vez só.
Enquanto está em testes.... pode acontecer qualquer coisa de errado, então vou repetindo como teste.

E antes de instalar nos clientes, é onde rodo em todos os backups, pra ver se a conversão vai gerar algum problema por causa de algum detalhe em algum cliente que posso não ter previsto.

Pelo backup, assim como nos clientes, cada aplicativo de cada cliente está em uma versão diferente.
Vai que tem diferença de conversão conforme a versão... já vou ficar sabendo...
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14353
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Anterior Próximo



Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro