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 Itamar M. Lins Jr. » 11 Mar 2020 10:34

Ola!
Eternamente esperar XBASE ou.... deixar pronto pra qualquer coisa que exista?
Então... menos fonte Harbour significa cada vez mais pronto pra qualquer coisa.


Pois é! vc está vendo isso mudando para SQL. "Back-end"
A mesma coisa se for usar HTML+CSS para "Front-end"

Quanto mais aprendemos, OOP, SQL, HTML, CSS, Javascript, vamos nos tornando mais exigentes, e aumentando a nossa visão do Harbour por exemplo.
Muitos programas, frameworks por exemplo são feitos com HTML+CSS, não usam nem windows(api) ou alguma coisa grafica do Linux(KDE/Gnome...) roda pelo browse. HeidiSQL só windows(api), PHPMyAdmin via navegador Web.

Saudações,
Itamar M. LIns Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 12 Mar 2020 13:36

Ontem aconteceu um problema grave:
Alterar um produto, e salvar encima de outro - NO DBF

Fiz a correção do fonte, troquei versão, e a solução foi:
Entrar nos dois produtos, pedir pra alterar, e salvar sem mexer em nada.
No MySQL estava certo, a alteração toma como base o MySQL, então só precisava salvar no DBF pra corrigir.

Comentei em outro post:

Tenho ID única para todos os registros, uso no MySQL, e isso deixa o MySQL sempre certo.
No DBF os fontes "estão acostumados" a usar o registro atual, então o fonte está preso a primeiro posicionar no DBF antes de salvar.

Mas é como eu disse no começo: fui eliminando as partes simples, e estou chegando nas que precisam de muito mais atenção.
E é engraçado: o problema não está no uso do MySQL, mas sim de continuar usando DBF kkkk

A parte mais legal é que isso não desanima, pelo contrário, não vejo a hora de acabar com esses DBFs !!!!

Mesmo esquema de sempre: vou alterando e instalando, ou melhor, os clientes vão atualizando pra nova versão.
Só obriguei a última, porque depois dessa começa o..... apagar coisas do DBF...

Só pra recapitular, acho que é importante:

Pra mim DBF não é problema, sempre funcionou direito.
Comecei a alterar pra MySQL porque eu queria.
Confiei no DBF pra salvar simultâneo no MySQL, e agora confiando no MySQL pra salvar no DBF.
A diferença está sendo mesmo em VELOCIDADE.
Por isso continuo alterando tranquilo, e tranquilo tudo dá certo, ou quase kkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 13 Mar 2020 10:53

Bati o recorde de erro agora:

Comecei a remover o uso de um DBF... produtos de pedido.
Seria normal.... se ele já estivesse no MySQL, mas ainda não está kkkk
É comecei e não terminei e aí achei que já tinha terminado...

Ainda bem que deu tempo de retornar versão anterior no cliente, após problemas pra emitir nota.....

Aproveitar pra mostrar como estou fazendo:

1. Criei a tabela/DBF no MySQL
Aqui, ao trocar versão no cliente, só aparece uma tabela nova no MySQL

2. Criei o campo que vai ser o equivalente ao incremental do MySQL, não existia antes
Aqui, ao trocar versão no cliente, é um campo a mais sem uso.

3. Comecei/continuei a alterar a gravação simultânea DBF/MySQL, usando o incremental do MySQL como referência para o DBF
Aqui, ao trocar versão no cliente, pode até ficar errado no MySQL, não importa por enquanto, mas vou testando as rotinas alteradas, e os produtos de novos pedidos vão sendo gravados no MySQL

4. Terminadas as alterações de fonte em inclusão/alteração/exclusão, começo a conferir o conteúdo da tabela do MySQL comparando com DBF
Aqui, já com versão instalada em cliente

5. Posso também já transferir tudo do DBF para o MySQL, assim as IDs ficam idênticas, e mais prático comparar TODO conteúdo de DBF e MySQL pra ver se sempre estarão 100% iguais.
Aqui, já com versão instalada em cliente

6. Se tudo ok, começo a eliminar a leitura do DBF e passando a fazer no MySQL
Aqui, instalando e acompanhando no cliente

7. Se tudo ok, apago toda gravação de DBF.

8. Na última etapa, só por precaução, vou conferindo o DBF com o MySQL e apagando o conteúdo, porque não precisa mais
Se sobrar alguma coisa, verifico porque está diferente

E fim.

No momento estão em gravação dupla: pedidos, financeiro, cadastros, e produtos de pedido

O de notas fiscais entrou na fase de apagar DBF.
O aplicativo vai conferindo/apagando 100 notas por vez, assim fica um processo rápido, sem atrapalhar o cliente.
A cada 5.000 notas apagadas, o aplicativo vai fazer um PACK, pra evitar que fique lento o processo de checagem.
Cismei de fazer assim, em último caso só o computador que vai perder tempo, então que seja pouco tempo por vez.

09/03/2020  12:04        10.946.384 jpcadastro.DBF
04/03/2020  17:38        16.037.090 jpbancario.dbf
09/03/2020  17:47       114.975.659 jpfinan.DBF
09/03/2020  22:08       162.660.754 JPPEDIDO.DBF
09/03/2020  22:08       176.127.995 jpitped.DBF
13/03/2020  07:03       236.190.407 JPNOTFIS.DBF
              38 arquivo(s)    730.188.657 bytes


Olhem lá, total 730MB em DBF.
Sendo apagado jpnotfis.dbf, 236MB, significa que praticamente já reduziu pra 494MB em DBFs

Por enquanto o objetivo é apagar JPITPED.DBF, 176MB, vai reduzir pra 318MB em DBFs
Parece que vai ser o mais fácil de apagar.... rs

Mas também estão sendo eliminados JPPEDIDO.DBF e JPFINAN.DBF, mais 276MB, vai reduzir pra 46MB em DBF
Já reduzi muito o uso desses DBF, mas ainda não totalmente.
Acho que faltavam os produtos de pedido em MySQL, pra fazer uma eliminação mais radical.

Aí vém aquela bost. de atualização do Windows 10 derrubando conexões, pra atrapalhar uso de MySQL...
Coisas de Microsoft....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 15 Mar 2020 14:31

JoséQuintas escreveu:Olhem lá, total 730MB em DBF.
Sendo apagado jpnotfis.dbf, 236MB, significa que praticamente já reduziu pra 494MB em DBFs


15/03/2020  10:36         1.246.217 jppretab.DBF
03/03/2020  02:33         1.254.539 jpcidade.dbf
11/03/2020  17:44         1.370.469 jpitem.DBF
11/03/2020  14:58         2.247.920 jpmdfcab.dbf
11/03/2020  14:33         5.887.930 jpmdfdet.dbf
11/03/2020  23:50        10.946.384 jpcadastro.DBF
04/03/2020  17:38        16.037.090 jpbancario.dbf
11/03/2020  18:09       115.022.587 jpfinan.DBF
11/03/2020  17:44       162.752.554 JPPEDIDO.DBF
15/03/2020  14:21       176.209.043 jpitped.DBF
              27 arquivo(s)    494.157.038 bytes


E não é que reduziu pra 494MB mesmo... rs
E de 38 arquivos DBF, reduziu pra 27, porque tinha deixado alguns lá só pra efeito de conversão.
Comecei a apagar conversões, porque "acho" que não vou precisar mais.
E começando novas conversões kkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor asimoes » 15 Mar 2020 19:28

Quintas,

Você não trabalha com controle de transação: BeginTrans, CommitTrans e RollBackTrans ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 16 Mar 2020 02:25

asimoes escreveu:Você não trabalha com controle de transação: BeginTrans, CommitTrans e RollBackTrans ?


Não se esqueça que sou principiante no SQL, ainda estou passando de DBF pra SQL.
Só vou pensar em usar algo mais em SQL depois que a migração estiver concluída.
E depois que aprender a usar kkkkk

Pelos seus comentários, já está acostumado a usar SQL com Oracle, e já faz parte do seu dia a dia.
Eu não quero começar a usar alguma coisa que tenha que voltar atrás depois, por não ter planejado direito.

Por enquanto melhor eu terminar a migração, e não arrumar nada que atrapalhe.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Meu modo de trabalho

Mensagempor asimoes » 16 Mar 2020 09:09

JoséQuintas escreveu:Não se esqueça que sou principiante no SQL, ainda estou passando de DBF pra SQL.
Só vou pensar em usar algo mais em SQL depois que a migração estiver concluída.
E depois que aprender a usar kkkkk


Se você ainda está no mix sql/dbf não convém usar controle de transação.

   
   oConexao:BeginTrans // inicia o controle de transação
   BEGIN SEQUENCE WITH __BREAKBLOCK()
      oConexao:CommitTrans // efetiva a transação de update, insert ou delete
   RECOVER USING oErro
      oConexao:RollBackTrans // Deu erro, anula update, insert ou delete se foi chamado
   END   


O committrans e rollbacktrans finalizam o begintrans
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 17 Mar 2020 14:45

Erro de hoje:

Não deveria indicar decimal
Called from ADOCLASS:NUMBER(388)
Called from PJPIMPOSTO(39)
Called from DO(0)
Called from RUNMODULE(104)
Called from BOXMENU(758)
Called from BOXMENU(745)
Called from MENUPRINC(593)
Called from SISTEMA(87)
Called from (b)MAIN(58)


É proposital, é que coloquei errado em certos fontes.
Então.... coloquei pro aplicativo me avisar aonde está errado kkkk

   IF ValType( nLen ) == "N" .AND. ValType( nDec ) != "N"
      Errorsys_WriteErrorLog( "Não deveria indicar decimal", 3 )
   ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 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 12 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