Meu modo de trabalho
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
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
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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
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.
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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
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 !!!!
- 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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
Esta parte é a interessante:JoséQuintas escreveu:Mas.... já posso instalar nos clientes, mesmo não tendo terminado !!!!
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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
Uma parte interessante:
São 5 linhas juntas, TODAS usando o DBF só por causa do número.
Agora, mesmo que ainda não esteja pra MySQL, só resta uma linha pra resolver
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.
São 5 linhas juntas, TODAS usando o DBF só por causa do número.
Código: Selecionar todos
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 )
Código: Selecionar todos
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 )
É 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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
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.
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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
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.
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.
Código: Selecionar todos
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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Convertendo manifesto pra ADO-SQL
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
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...
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
Código: Selecionar todos
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
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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Finalmente o Windows parece normal.
Hoje foi complicado... o dia inteiro perdido por causa do Windows.
Só agora testando a atualização nos backups.
Hoje foi complicado... o dia inteiro perdido por causa do Windows.
Só agora testando a atualização nos backups.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Menos dois.
Agora MDFE é totalmente SQL.
Esses JPMDFCAB e JPMDFDET não são mais usados.
Os demais maiores, continuo eliminando o uso do DBF.
Agora MDFE é totalmente SQL.
Esses JPMDFCAB e JPMDFDET não são mais usados.
Os demais maiores, continuo eliminando o uso do DBF.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Um relatório simples, alterado pra MySQL.
A parte de escolha de opções... sem alteração.
A configuração do relatório, cabeçalho, etc. relativamente sem alterações
A preparação do que vai imprimir, com certeza mudou.
E a impressão, agora pegando do MYSQL
A parte de escolha de opções... sem alteração.
Código: Selecionar todos
#include "inkey.ch"
#include "josequintas.ch"
MEMVAR nOpcOrdem, acTxtOrdem, midProdutoi, midProdutof, nOpcProDep, acTxtProDep, nOpcProduto
MEMVAR acTxtProduto, nOpcTipoEstoque, acTxtTipoEstoque, mIdProDep
MEMVAR nOpcProSec, acTxtProSec, nOpcProGru, acTxtProGru, mIdProSec, mIdProGru, nOpcPrinterType
PROCEDURE LJPITEM
LOCAL nOpcGeral := 1, acTxtGeral := Array(8), nOpcTemp
PRIVATE nOpcOrdem := 1, acTxtOrdem := { "Código", "Alfabética", "Depto+Seção+Grupo", "Tributação" }
PRIVATE nOpcProduto := 1, mIdProdutoi := 0, midProdutof := 0, acTxtProduto := { "Todos", "Intervalo" }
PRIVATE nOpcProDep := 1, mIdProDep := 0, acTxtProDep := { "Todos", "Específico" }
PRIVATE nOpcProSec := 1, mIdProSec := 0, acTxtProSec := { "Todos", "Específico" }
PRIVATE nOpcProGru := 1, mIdProGru := 0, acTxtProGru := { "Todos", "Específico" }
PRIVATE nOpcTipoEstoque := 1, acTxtTipoEstoque := { "Todos", "Sim (Vendas)", "Não (Vendas)", "Inativo", "Ativo (Bens)", "Uso" }
PRIVATE nOpcPrinterType := AppPrinterType()
IF ! AbreArquivos( "jpempresa" )
RETURN
ENDIF
WOpen( 5, 4, 7 + Len( acTxtGeral ), 45, "Opções disponíveis" )
DO WHILE .T.
acTxtGeral := { ;
TxtImprime(), ;
"Ordem.....: " + acTxtOrdem[ nOpcOrdem ], ;
"Intervalo.: " + iif( nOpcProduto == 1, acTxtProduto[ 1 ], StrZero( midProdutoi, 6 ) + " A " + StrZero( midProdutof, 6 ) ), ;
"Tipo Estoq: " + acTxtTipoEstoque[ nOpcTipoEstoque ], ;
"Depto.....: " + Iif( nOpcProDep == 1, acTxtProDep[ nOpcProDep ], Str( mIdProDep, 6 ) ), ;
"Seção.....: " + iif( nOpcProSec == 1, acTxtProSec[ nOpcProSec ], Str( mIdProSec, 6 ) ), ;
"Grupo.....: " + iif( nOpcProGru == 1, acTxtProGru[ nOpcProGru ], Str( mIdProGru, 6 ) ), ;
"Saída.....: " + TxtSaida()[ nOpcPrinterType ] }
FazAchoice( 7, 5, 6 + Len( acTxtGeral ), 44, acTxtGeral, @nOpcGeral )
nOpcTemp := 1
DO CASE
CASE LastKey() == K_ESC
EXIT
CASE nOpcGeral == nOpcTemp++
IF ConfirmaImpressao()
imprime()
ENDIF
CASE nOpcGeral == nOpcTemp++
WAchoice( nOpcGeral + 6, 25, acTxtOrdem, @nOpcOrdem, "Ordem" )
CASE nOpcGeral == nOpcTemp++
JPPRODUTOClass():Intervalo( nOpcGeral + 6, 25, @nOpcProduto, @midProdutoi, @midProdutof )
CASE nOpcGeral == nOpcTemp++
WAchoice( nOpcGeral+6, 25, acTxtTipoEstoque, @nOpcTipoEstoque, "Tipo de Estoque" )
CASE nOpcGeral == nOpcTemp++
AUXPRODEPClass():Intervalo( nOpcGeral + 6, 25, @nOpcProDep, @mIdProDep )
CASE nOpcGeral == nOpcTemp++
AUXPROSECClass():Intervalo( nOpcGeral + 6, 25, @nOpcProSec, @mIdProSec )
CASE nOpcGeral == nOpcTemp++
AUXPROGRUClass():Intervalo( nOpcGeral + 6, 25, @nOpcProGru, @mIdProGru )
CASE nOpcGeral == nOpcTemp
WAchoice( nOpcGeral+6, 25, TxtSaida(), @nOpcPrinterType, "Saída" )
AppPrinterType( nOpcPrinterType )
ENDCASE
ENDDO
WClose()
RETURN
Código: Selecionar todos
STATIC FUNCTION imprime()
LOCAL oPDF, mProDep, mProSec, mProGru, mTripro, nKey
LOCAL cnSQL := ADOClass():New( AppConexao() )
oPDF := PDFClass():New()
oPDF:SetType( nOpcPrinterType )
oPDF:Begin()
nKey = 0
oPDF:acHeader := {"","",""}
oPDF:acHeader[ 1 ] = "LISTAGEM DO CADASTRO DE PRODUTOS"
oPDF:acHeader[ 3 ] = Space(15) + "-PRODUTO/" + Pad( "DESCRICAO", 65, "-" ) + " UN PESO_LIQ PESO_BRU MEDIDAS"
oPDF:acHeader[ 2 ] := "Ordem:" + acTxtOrdem[ nOpcOrdem ]
IF nOpcProduto != 1
oPDF:acHeader[ 2 ] := oPDF:acHeader[ 2 ] + ", de: " + StrZero( midProdutoi, 6 ) + " ate: " + StrZero( midProdutof, 6 )
ENDIF
oPDF:acHeader[ 2 ] += ", Est:"+iif( nOpcTipoEstoque == 1, "Todos", acTxtTipoEstoque[ nOpcTipoEstoque ] )
IF nOpcProDep == 2
oPDF:acHeader[ 2 ] += ", Depto " + NumberSQL( mIdProDep )
ENDIF
IF nOpcProSec == 2
oPDF:acHeader[ 2 ] += ", Secao " + NumberSQL( mIdProSec )
ENDIF
IF nOpcProGru == 2
oPDF:acHeader[ 2 ] += ", Grupo " + NumberSQL( mIdProGru )
ENDIF
Código: Selecionar todos
WITH OBJECT cnSQL
:cSQL := "SELECT" + ;
" IDPRODUTO, IEPRODEP, IEPROSEC, IEPROGRU, IETIPO, IETRIPRO, IEDESCRI," + ;
" IELARGURA, IEALTURA, IEPROFUND, IEUNID, IEPESLIQ, IEPESBRU," + ;
" PRODEP.AXDESCRI AS PRODEPDESCRI," + ;
" PROSEC.AXDESCRI AS PROSECDESCRI," + ;
" PROGRU.AXDESCRI AS PROGRUDESCRI," + ;
" TRIPRO.AXDESCRI AS TRIPRODESCRI" + ;
" FROM JPITEM" + ;
" LEFT JOIN JPAUXILIAR AS PRODEP ON PRODEP.AXTABELA = " + StringSQL( AUX_PRODEP ) + ;
" AND PRODEP.AXCODIGO = JPITEM.IEPRODEP" + ;
" LEFT JOIN JPAUXILIAR AS PROSEC ON PROSEC.AXTABELA = " + StringSQL( AUX_PROSEC ) + ;
" AND PROSEC.AXCODIGO = JPITEM.IEPROSEC" + ;
" LEFT JOIN JPAUXILIAR AS PROGRU ON PROGRU.AXTABELA = " + StringSQL( AUX_PROGRU ) + ;
" AND PROGRU.AXCODIGO = JPITEM.IEPROGRU" + ;
" LEFT JOIN JPAUXILIAR AS TRIPRO ON TRIPRO.AXTABELA = " + StringSQL( AUX_TRIPRO ) + ;
" AND TRIPRO.AXCODIGO = JPITEM.IETRIPRO" + ;
" WHERE 1 = 1"
IF nOpcProduto == 2
:cSQL += " AND IDPRODUTO BETWEEN " + NumberSQL( mIdProdutoi ) + " AND " + NumberSql( mIdProdutof )
ENDIF
IF nOpcProDep == 2
:cSQL += " AND IEPRODEP = " + NumberSQL( mIdProDep )
ENDIF
IF nOpcProSec == 2
:cSQL += " AND IEPROSEC = " + NumberSQL( mIdProSec )
ENDIF
IF nOpcProGru == 2
:cSQL += " AND IEPROGRU = " + NumberSQL( mIdProGru )
ENDIF
IF nOpcTipoEstoque != 1
:cSQL += " AND IETIPO = " + StringSQL( Substr( "XSNIAU", nOpcTipoEstoque, 1 ) )
ENDIF
DO CASE
CASE nOpcOrdem == 1; :cSQL += " ORDER BY IDPRODUTO"
CASE nOpcOrdem == 2; :cSQL += " ORDER BY IEDESCRI"
CASE nOpcOrdem == 3; :cSQL += " ORDER BY PRODEPDESCRI, PROSECDESCRI, PROGRUDESCRI, IEDESCRI"
CASE nOpcOrdem == 4; :cSQL += " ORDER BY IETRIPRO"
ENDCASE
:Execute()
Código: Selecionar todos
mProDep := 0
mProSec := 0
mProGru := 0
mTriPro := 0
DO WHILE nKey != K_ESC .AND. ! :Eof()
nKey = Inkey()
oPDF:MaxRowTest()
IF nOpcOrdem == 3 .AND. :Number( "IEPRODEP" ) != mProDep
oPDF:DrawText( oPDF:nRow + 1, 0, "D:" + Str( :Number( "IEPRODEP" ), 6 ) + " - " + :String( "PRODEPDESCRI" ) )
mProDep := :Number( "IEPRODEP" )
mProSec := 0
mProGru := 0
oPDF:nRow += 3
oPDF:MaxRowTest()
ENDIF
IF nOpcOrdem == 3 .AND. :Number( "IEPROSEC" ) != mProSec
oPDF:DrawText( oPDF:nRow+1, 5, "S:" + Str( :Number( "IEPROSEC" ), 6 ) + " - " + :String( "PROSECDESCRI" ) )
mProSec := :Number( "IEPROSEC" )
mProGru := 0
oPDF:nRow += 2
oPDF:MaxRowTest()
ENDIF
IF nOpcOrdem == 3 .AND. :Number( "IEPROGRU" ) != mProGru
oPDF:DrawText( oPDF:nRow+1, 10, "G:" + Str( :Number( "IEPROGRU" ), 6 ) + " - " + :String( "PROGRUDESCRI" ) )
mProGru := :Number( "IEPROGRU" )
oPDF:nRow += 2
oPDF:MaxRowTest()
ENDIF
IF nOpcOrdem == 4 .AND. :Number( "IETRIPRO" ) != mTriPro
oPDF:DrawText( oPDF:nRow+1, 15, "T:" + Str( :Number( "IETRIPRO" ), 6 ) + " - " + :String( "TRIPRODESCRI" ) )
mTriPro := :Number( "IETRIPRO" )
oPDF:nRow += 3
oPDF:MaxRowTest()
ENDIF
oPDF:DrawText( oPDF:nRow, 20, Str( :Number( "IDPRODUTO" ), 6 ) )
oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, :String( "IEDESCRI", 60 ) )
oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, :String( "IEUNID", 6 ) )
oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, :Number( "IEPESLIQ" ), PicVal( 9, 3 ) )
oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, :Number( "IEPESBRU" ), PicVal( 9, 3 ) )
oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, Ltrim( Str( :Number( "IEALTURA" ) ) ) + "x" + ;
Ltrim( Str( :Number( "IELARGURA" ) ) ) + "x" + Ltrim( Str( :Number( "IEPROFUND" ) ) ) )
oPDF:nRow += 1
:MoveNext()
ENDDO
:CloseRecordset()
ENDWITH
oPDF:End()
RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Comentários sobre o relatório anterior:
Em DBF, abria produtos (JPITEM) e JPAUXILIAR pras tabelas auxiliares.
Acho que nem precisa dizer, mas precisava posicionar departamento, seção, grupo, tributação. (SEEK com o índice correto).
Também precisava indexar, conforme a ordem.
E mais os IFs. conforme a seleção, para os filtros.
Em SQL... os IFs continuam, mas pra montagem do comando SQL.
E o comando SQL substituiu tudo.
Nenhum arquivo aberto, nenhuma preocupação com índice, apenas um comando SQL que pede tudo e vém pronto.
É praticamente um comando SQL, e imprimir.
Dá até pra pensar em expandir as opções, porque vai ser mexer no comando SQL, e mexer na impressão.
No final, relatório de cadastro, ou um mais "sofisticado", podem ficar relativamente iguais.
Lógico, sempre tem exceções, mas na regra geral seria isso.
Acaba se tornando relativamente mais fácil fazer manutenção em um relatório. (ou pra apresentação em tela com um browse).
Está aí, não tinha pensado nisso, mas.....
Agora poderia dar a opção de fazer um browse ao invés do relatório, usando o resultado do comando SQL !!!
Ou pra gerar em Excel !!!
Vixe... ainda migrando e novas possibilidades aparecendo....
Pois é... chamar a atenção de novo pra isso: só trocando DBF pra MySQL, e facilidades começando a aparecer.
De repente, qualquer relatório pra Excel ou outra coisa...
Em DBF, abria produtos (JPITEM) e JPAUXILIAR pras tabelas auxiliares.
Acho que nem precisa dizer, mas precisava posicionar departamento, seção, grupo, tributação. (SEEK com o índice correto).
Também precisava indexar, conforme a ordem.
E mais os IFs. conforme a seleção, para os filtros.
Em SQL... os IFs continuam, mas pra montagem do comando SQL.
E o comando SQL substituiu tudo.
Nenhum arquivo aberto, nenhuma preocupação com índice, apenas um comando SQL que pede tudo e vém pronto.
É praticamente um comando SQL, e imprimir.
Dá até pra pensar em expandir as opções, porque vai ser mexer no comando SQL, e mexer na impressão.
No final, relatório de cadastro, ou um mais "sofisticado", podem ficar relativamente iguais.
Lógico, sempre tem exceções, mas na regra geral seria isso.
Acaba se tornando relativamente mais fácil fazer manutenção em um relatório. (ou pra apresentação em tela com um browse).
Está aí, não tinha pensado nisso, mas.....
Agora poderia dar a opção de fazer um browse ao invés do relatório, usando o resultado do comando SQL !!!
Ou pra gerar em Excel !!!
Vixe... ainda migrando e novas possibilidades aparecendo....
Pois é... chamar a atenção de novo pra isso: só trocando DBF pra MySQL, e facilidades começando a aparecer.
De repente, qualquer relatório pra Excel ou outra coisa...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Um outro fonte alterado.
Apesar de relativamente simples, é mais interessante.
O que ele usa:
- JPITPED - produtos dos pedidos
- JPPEDIDO - pedidos
- JPCADASTRO - cadastros
- JPTRANSA - transação
- JPITEM - produtos
- JPUF - pra UFs
- JPAUXILIAR - para descrição de tributação de UF
- JPAUXILIAR - pra descrição de tributação de cadastro
- JPAUXILIAR - pra descrição de tributação de produto
Por isso é interessante: são 7 DBFs, mas equivalente a 9 DBFs.
Como ficou em SQL: o de sempre, o comando e o uso do resultado.
Parece complicado, mas é o de sempre.
SELECT com a seleção dos campos que interessam
" JPPEDIDO.PDTRANSA, JPTRANSA.TRDESCRI," + ;
" JPPEDIDO.PDCADASTRO, JPCADASTRO.CDNOME, JPCADASTRO.CDTRICAD, TRICAD.AXDESCRI AS TRICADDESCRI," + ;
" JPCADASTRO.CDUF, JPUF.UFTRIUF, TRIUF.AXDESCRI AS TRIUFDESCRI," + ;
" JPITPED.IPPRODUTO, JPITEM.IEDESCRI, JPITEM.IETRIPRO, TRIPRO.AXDESCRI AS TRIPRODESCRI" + ;
se quiser comparar com DBF, seria só trocar o ponto pelo ->
por exemplo, jpcadastro.cdnome, equivale a jpcadastro->cdnome, seria o campo CDNOME que está na tabela JPCADASTRO
FROM com a indicação de onde vém
FROM JPITPED - vém dos produtos dos pedidos (itens do pedido)
LEFT JOIN é o relacionamento, pra "ensinar" o MySQL qual a ligação/relacionamento entre os arquivos
" LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPITPED.IPPEDIDO" + ;
vai usar o campo jpitped->ipPedido pra procurar nos pedidos o jppedido->idPedido com mesmo número
WHERE pra indicar o filtro
" WHERE JPITPED.IDITPED = " + NumberSQL( midItPed )
Vai procurar o lançamento de produto para um pedido, aonde a identificação desse lançamento é esse número
Em termos práticos: a partir do lançamento no pedido, vai pesquisar todas as informações relacionadas a ele. (as que interessam neste fonte)
E isso é feito usando um único comando SQL.
Então, o comando diz qual a informação, e como o servidor vai fazer pra pegar a informação.
O comando grande não significa que vai demorar mais.
Por último: o retorno, NESSE CASO, é apenas um registro com todo conteúdo indicado.
A partir daí, só usar o registro.
Nota:
Só lembrando que eu decidi fazer desse jeito, não significa que é a única forma de fazer isso.
E esses relacionamentos poderiam já ter sido definidos previamente na própria base de dados, e nem precisar colocar no comando.
É só uma das muitas possibilidades de se fazer isso.
Ainda estou saindo dos DBFs... vou fazendo do jeito que conheço...
Apesar de relativamente simples, é mais interessante.
Código: Selecionar todos
FUNCTION MsgSemRegra( cModulo )
LOCAL cTexto := ""
hb_Default( @cModulo, m_Prog )
cTexto += "REGRA DE TRIBUTAÇÃO:" + hb_eol()
cTexto += hb_eol()
cTexto += "Transação..........: "
IF Empty( jppedido->pdTransa )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jppedido->pdTransa + " " + DescricaoJPTRANSA( jppedido->pdTransa )
ENDIF
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação UF......: "
IF Empty( jpuf->ufTriUf )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jpuf->ufTriUf + " " + Trim( AUXTRIUFClass():Descricao( jpuf->ufTriUf ) )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + jpcadastro->cdUf
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação Cadastro: "
IF Empty( jpcadastro->cdTriCad )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jpcadastro->cdTriCad + " " + Trim( AUXTRICADClass():Descricao( jpcadastro->cdTriCad ) )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + jpcadastro->idCadastro + " " + jpcadastro->cdNome
cTexto += hb_eol() + hb_eol()
Encontra( jpcadastro->cdUf, "jpuf", "numlan" )
cTexto += "Tributação Produto.: "
IF Empty( jpitem->ieTriPro )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jpitem->ieTriPro + " " + Trim( AUXTRIPROClass():Descricao( jpitem->ieTriPro ) )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + jpitem->idProduto + " " + jpitem->ieDescri
cTexto += hb_eol() + hb_eol()
IF Empty( jpitped->ipPisCst )
cTexto += "*** produto sem CST PIS ***" + hb_eol()
ENDIF
cTexto += "Posição:" + cModulo + hb_eol()
cTexto += hb_eol()
cTexto += "Não foi encontrada uma regra de tributação para essa combinação de informações" + hb_eol()
cTexto += "Pode ser alguma informação errada, ou falta cadastrar uma regra de tributação com esta combinação" + hb_eol()
cTexto += "Se for na confirmação do pedido, pode faltar passar na digitação de produto pra atualizar pedido" + hb_eol()
MsgWarning( cTexto )
RETURN NIL
- JPITPED - produtos dos pedidos
- JPPEDIDO - pedidos
- JPCADASTRO - cadastros
- JPTRANSA - transação
- JPITEM - produtos
- JPUF - pra UFs
- JPAUXILIAR - para descrição de tributação de UF
- JPAUXILIAR - pra descrição de tributação de cadastro
- JPAUXILIAR - pra descrição de tributação de produto
Por isso é interessante: são 7 DBFs, mas equivalente a 9 DBFs.
Como ficou em SQL: o de sempre, o comando e o uso do resultado.
Código: Selecionar todos
FUNCTION MsgSemRegra( mIdItPed, cModulo )
LOCAL cTexto := ""
LOCAL cnSQL := ADOClass():New( AppConexao() )
hb_Default( @cModulo, m_Prog )
WITH OBJECT cnSQL
:cSQL := "SELECT" + ;
" JPPEDIDO.PDTRANSA, JPTRANSA.TRDESCRI," + ;
" JPPEDIDO.PDCADASTRO, JPCADASTRO.CDNOME, JPCADASTRO.CDTRICAD, TRICAD.AXDESCRI AS TRICADDESCRI," + ;
" JPCADASTRO.CDUF, JPUF.UFTRIUF, TRIUF.AXDESCRI AS TRIUFDESCRI," + ;
" JPITPED.IPPRODUTO, JPITEM.IEDESCRI, JPITEM.IETRIPRO, TRIPRO.AXDESCRI AS TRIPRODESCRI" + ;
" FROM JPITPED" + ;
" LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPITPED.IPPEDIDO" + ;
" LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
" LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
" LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA" + ;
" LEFT JOIN JPUF ON JPUF.UFUF = JPCADASTRO.CDUF" + ;
" LEFT JOIN JPAUXILIAR AS TRICAD ON TRICAD.AXTABELA = " + StringSQL( AUX_TRICAD ) + ;
" AND TRICAD.AXCODIGO = JPCADASTRO.CDTRICAD" + ;
" LEFT JOIN JPAUXILIAR AS TRIPRO ON TRIPRO.AXTABELA = " + StringSQL( AUX_TRIPRO ) + ;
" AND TRIPRO.AXCODIGO = JPITEM.IETRIPRO" + ;
" LEFT JOIN JPAUXILIAR AS TRIUF ON TRIUF.AXTABELA = " + StringSQL( AUX_TRIUF ) + ;
" AND TRIUF.AXCODIGO = JPUF.UFTRIUF" + ;
" WHERE JPITPED.IDITPED = " + NumberSQL( midItPed )
:Execute()
cTexto += "REGRA DE TRIBUTAÇÃO:" + hb_eol()
cTexto += hb_eol()
cTexto += "Transação..........: "
IF :Number( "PDTRANSA" ) == 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "PDTRANSA" ), 6 ) + " " + :String( "TRDESCRI" )
ENDIF
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação UF......: "
IF :Number( "UFTRIUF" ) = 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "UFTRIUF" ), 6 ) + " " + :String( "TRIUFDESCRI" )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + :String( "CDUF", 2 )
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação Cadastro: "
IF :Number( "CDTRICAD" ) == 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "CDTRICAD" ), 6 )+ " " + :String( "TRICADDESCRI" )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + Str( :Number( "PDCADASTRO" ), 6 ) + " " + :String( "CDNOME" )
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação Produto.: "
IF :Number( "IETRIPRO" ) == 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "IETRIPRO" ), 6 ) + " " + :String( "TRIPRODESCRI" )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + Str( :Number( "IPPRODUTO" ), 6 ) + " " + :String( "IEDESCRI" )
cTexto += hb_eol() + hb_eol()
cTexto += "Posição:" + cModulo + hb_eol()
cTexto += hb_eol()
cTexto += "Não foi encontrada uma regra de tributação para essa combinação de informações" + hb_eol()
cTexto += "Pode ser alguma informação errada, ou falta cadastrar uma regra de tributação com esta combinação" + hb_eol()
cTexto += "Se for na confirmação do pedido, pode faltar passar na digitação de produto pra atualizar pedido" + hb_eol()
:CloseRecordset()
ENDWITH
MsgWarning( cTexto )
RETURN NIL
SELECT com a seleção dos campos que interessam
" JPPEDIDO.PDTRANSA, JPTRANSA.TRDESCRI," + ;
" JPPEDIDO.PDCADASTRO, JPCADASTRO.CDNOME, JPCADASTRO.CDTRICAD, TRICAD.AXDESCRI AS TRICADDESCRI," + ;
" JPCADASTRO.CDUF, JPUF.UFTRIUF, TRIUF.AXDESCRI AS TRIUFDESCRI," + ;
" JPITPED.IPPRODUTO, JPITEM.IEDESCRI, JPITEM.IETRIPRO, TRIPRO.AXDESCRI AS TRIPRODESCRI" + ;
se quiser comparar com DBF, seria só trocar o ponto pelo ->
por exemplo, jpcadastro.cdnome, equivale a jpcadastro->cdnome, seria o campo CDNOME que está na tabela JPCADASTRO
FROM com a indicação de onde vém
FROM JPITPED - vém dos produtos dos pedidos (itens do pedido)
LEFT JOIN é o relacionamento, pra "ensinar" o MySQL qual a ligação/relacionamento entre os arquivos
" LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPITPED.IPPEDIDO" + ;
vai usar o campo jpitped->ipPedido pra procurar nos pedidos o jppedido->idPedido com mesmo número
WHERE pra indicar o filtro
" WHERE JPITPED.IDITPED = " + NumberSQL( midItPed )
Vai procurar o lançamento de produto para um pedido, aonde a identificação desse lançamento é esse número
Em termos práticos: a partir do lançamento no pedido, vai pesquisar todas as informações relacionadas a ele. (as que interessam neste fonte)
E isso é feito usando um único comando SQL.
Então, o comando diz qual a informação, e como o servidor vai fazer pra pegar a informação.
O comando grande não significa que vai demorar mais.
Por último: o retorno, NESSE CASO, é apenas um registro com todo conteúdo indicado.
A partir daí, só usar o registro.
Nota:
Só lembrando que eu decidi fazer desse jeito, não significa que é a única forma de fazer isso.
E esses relacionamentos poderiam já ter sido definidos previamente na própria base de dados, e nem precisar colocar no comando.
É só uma das muitas possibilidades de se fazer isso.
Ainda estou saindo dos DBFs... vou fazendo do jeito que conheço...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Este tive que apelar pra algum método de debug, porque estava falhando.
Agora resolvido.
Acho que o nome diz tudo.
É o uso do anterior, regra de tributação, e algo mais.
Por enquanto me limitando a converter de DBF pra MySQL.
Provavelmente não precisaria fazer um produto por vez, mas preciso alterar com cuidado, e por enquanto ainda tem a gravação em DBF compatível.
Depois.... quando não precisar mais do DBF, e apagar o DBF, aí vou repassar pra fazer mais coisas por vez.
Agora resolvido.
Acho que o nome diz tudo.
Código: Selecionar todos
METHOD CalculaImpostosProduto( mIdItPed ) CLASS SubPedidoClass
LOCAL mipIcmBas, mipIcmAli, mipIcmRed, mipIcmVal, mipCfop, mipTribut, mipIpiCst, mipIpiEnq
LOCAL mipFcpAli, mipFcpVal, mipIcmCst, mipPisCst, mipPisEnq, mipCofCst, mipCofEnq
LOCAL mipIpiBas, mipIpiAli, mipIpiVal, mipImpAli, mipImpVal
LOCAL mipIssBas, mipIssAli, mipIssVal
LOCAL mipPisBas, mipPisAli, mipPisVal
LOCAL mipCofBas, mipCofAli, mipCofVal
LOCAL mipSubBas, mipSubIva, mipSubAli, mipSubRed, mipSubVal
LOCAL mipValNot, mipIIBas, mipIIVal
LOCAL mipIcsBas, mipIcsVal, mipIcsAli, mipIpiIcm
LOCAL mipValPro, mipValFre, mipValSeg, mipValOut, nCont, mipLeis, mTmpLei, mipValExt
LOCAL mipValDes, mipIIAli, mipDifAlii, mipDifAliu, mipDifAlif, mipDifVali, mipDifValf, mipDifBas, mipDifCal
LOCAL cnSQL := ADOClass():New( AppConexao() )
IF mIdItPed == 0
RETURN NIL
ENDIF
WITH OBJECT cnSQL
:cSQL := ;
" SELECT JPITPED.*," + ;
" JPPEDIDO.PDTRANSA," + ;
" JPCADASTRO.CDUFENT, JPCADASTRO.CDTRICAD," + ;
" JPITEM.IETRIPRO," + ;
" JPUF.UFTRIUF," + ;
" JPTRANSA.TRREACAO," + ;
" JPIBPT.IBNACALI," + ;
" JPIBPT.IBIMPALI," + ;
" JPIMPOSTO.*" + ;
" FROM JPITPED" + ;
" LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPITPED.IPPEDIDO" + ;
" LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
" LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
" LEFT JOIN JPUF ON JPUF.UFUF = JPCADASTRO.CDUFENT" + ;
" LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA" + ;
" LEFT JOIN JPIMPOSTO" + ;
" ON JPIMPOSTO.IMTRANSA = JPPEDIDO.PDTRANSA" + ;
" AND JPIMPOSTO.IMTRIUF = JPUF.UFTRIUF" + ;
" AND JPIMPOSTO.IMTRICAD = JPCADASTRO.CDTRICAD" + ;
" AND JPIMPOSTO.IMTRIPRO = JPITEM.IETRIPRO" + ;
" LEFT JOIN JPIBPT ON JPIBPT.IBCODIGO = JPITEM.IENCM" + ;
" WHERE IDITPED = " + NumberSQL( midItPed )
:Execute()
MsgExclamation( ;
"pdtransa: " + :String( "PDTRANSA" ) + hb_Eol() + ;
"triuf: " + :String( "UFTRIUF" ) + hb_Eol() + ;
"tricad:" + :String( "CDTRICAD" ) + hb_Eol() + ;
"tripro:" + :String( "IETRIPRO" ) + hb_Eol() + ;
"tribut:" + :String( "IDIMPOSTO" ) + hb_Eol() + ;
"ok" )
...
Por enquanto me limitando a converter de DBF pra MySQL.
Provavelmente não precisaria fazer um produto por vez, mas preciso alterar com cuidado, e por enquanto ainda tem a gravação em DBF compatível.
Depois.... quando não precisar mais do DBF, e apagar o DBF, aí vou repassar pra fazer mais coisas por vez.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Meu modo de trabalho
Só a título de curiosidade:
Seria fácil alterar o primeiro IF pra ADO.
Mas o segundo IF, e provavelmente mais coisas no fonte, dependem do posicionamento do cliente, que é feito no primeiro IF.
É por isso que as alterações precisam ser feitas devagar.
Lógico... um SELECT detalhado no MySQL pode acabar atendendo o fonte inteiro.
Por isso, às vezes é melhor reorganizar o fonte primeiro, pra facilitar o que vém depois.
De repente até ajeitar o fonte para pegar tudo do dbf logo no começo, e depois só substituir para um comando SQL.
Cada caso é um caso.... cada fonte é um fonte, que pode ter solução igual ou diferente do que já foi feito antes.
Lembrando: no meu caso, tem tudo no DBF ou no MySQL, então estou eliminando a necessidade de pegar do DBF - mantendo posicionamento do DBF apenas aonde grava - enquanto precisa dele.
Devagar tá indo...
Código: Selecionar todos
IF ! Encontra( jppedido->pdCadastro, "jpcadastro", "numlan" ) .AND. jppedido->pdConf != "S"
MsgWarning( "INVÁLIDO! Cliente sem cadastro!" )
RETURN .F.
ENDIF
IF ! jpcadastro->cdSitFaz $ " 1"
MsgStop( "INVÁLIDO! Irregularidade do cadastro na SEFAZ!" )
RETURN .F.
ENDIF
Mas o segundo IF, e provavelmente mais coisas no fonte, dependem do posicionamento do cliente, que é feito no primeiro IF.
É por isso que as alterações precisam ser feitas devagar.
Lógico... um SELECT detalhado no MySQL pode acabar atendendo o fonte inteiro.
Por isso, às vezes é melhor reorganizar o fonte primeiro, pra facilitar o que vém depois.
De repente até ajeitar o fonte para pegar tudo do dbf logo no começo, e depois só substituir para um comando SQL.
Cada caso é um caso.... cada fonte é um fonte, que pode ter solução igual ou diferente do que já foi feito antes.
Lembrando: no meu caso, tem tudo no DBF ou no MySQL, então estou eliminando a necessidade de pegar do DBF - mantendo posicionamento do DBF apenas aonde grava - enquanto precisa dele.
Devagar tá indo...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/