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 » 08 Out 2021 21:46

cobranca.png


Só digo uma coisa:

Tudo bem, enquanto funciona bem.

Pra procurar erros.... pode ser complicado.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 08 Out 2021 22:30

Curiosidade:

22/09/2021  17:02            18.375 ze_spedxmlmdfe.prg


Na verdade a rotina é pra gerar XML de muitas notas a partir de uma data e de um número.
Inicialmente tinha 61kb, agora com 18kb
A parte que saiu, agora está em SQL.
Ainda não terminei.

Ainda não sei dizer se é vantagem, já que pra debug é complicado.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 08 Out 2021 22:47

Simplifiquei mais ainda:

   SET cXml := CONCAT( '<PISOutr>',
      ze_XmlTag( 'CST',  cPisCst ),
      ze_XmlTag( 'vBC',  nPisBas ),
      ze_XmlTag( 'pPIS', nPisAli ),
      ze_XmlTag( 'vPIS', nPisVal ),
      '</PISOutr>' );


Pensei que ia dar erro, por ter definido o parâmetro como VARCHAR(), mas funciona normalmente.
O MySQL já formata conforme o tipo numérico, quanto a decimais.
E o mesmo com datas.

Nunca ficou tão fácil gerar XML.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 08 Out 2021 22:53

E se fosse pra não depender de função, poderia ser assim:

   SET cXml := CONCAT( '<PISOutr>',
      '<CST>', cPisCst, '</CST>',
      '<vBC>', nPisBas, '</vBC>',
      '<pPIS>', nPisAli, '</pPIS>',
      '<vPIS>', nPisVal, '</vPIS>',
     '</PISOutr>' )


Não sei porque ainda tem gente que prefere usar INI ou TXT.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 09 Out 2021 12:11

Pra gerar o XML de todos os produtos, iria ficar complicado deixar numa function.
Então... gera um produto de cada vez, e vai juntando tudo.

CREATE FUNCTION ze_XmlNfeProdutoList( nIdNotFis INT(11) )
RETURNS VARCHAR(10000)

BEGIN

DECLARE cXml VARCHAR(2000) DEFAULT '';
DECLARE nIdItPed, nContador INT(11) DEFAULT 0;
DECLARE nCursorEOF INT(11) DEFAULT 0;
DECLARE SP_CURSOR CURSOR FOR
   SELECT IDITPED FROM JPITPED WHERE IPPEDIDO =
      ( SELECT NFPEDIDO FROM JPNOTFIS WHERE NFPEDIDO != 0 AND IDNOTFIS = nIdNotFis );
DECLARE CONTINUE HANDLER FOR NOT FOUND SET nCursorEOF = 1;

OPEN SP_CURSOR;

THIS:WHILE nCursorEof != 1 DO
   FETCH SP_CURSOR INTO nIdItPed;

   SET nContador := nContador + 1;
   SET cXml := CONCAT( cXml, ze_XmlNfeProduto( nIdItPed, nContador ) );

END WHILE;

CLOSE SP_CURSOR;

RETURN cXml;

END


nIdItPed é a chave única dos produtos dos pedidos.
Esta função pega a lista e vai repassando pra outra que gera somente de um produto.

Ainda em Harbour o bloco de ID, e o que junta tudo.
09/10/2021  11:45             8.711 ze_spedxmlnfe.prg


 Pasta de d:\fontes\integra\sql\function

08/10/2021  22:35             2.737 ze_XmlNfeCobranca.sql
08/10/2021  04:28             2.555 ze_XmlNfeDestinatario.sql
08/10/2021  04:28             2.074 ze_XmlNfeEmitente.sql
08/10/2021  10:01             1.725 ze_XmlNfeEntrega.sql
09/10/2021  11:04               247 ze_XmlNfeGTIN.sql
08/10/2021  11:42            11.049 ze_XmlNfeInfAdic.sql
09/10/2021  11:30             2.898 ze_XmlNfeProduto.sql
05/10/2021  11:11               118 ze_XmlNfeProdutoArmamento.sql
08/10/2021  22:44             1.544 ze_XmlNfeProdutoCofins.sql
05/10/2021  11:13               845 ze_XmlNfeProdutoCombustivel.sql
08/10/2021  22:44            10.678 ze_XmlNfeProdutoIcms.sql
05/10/2021  11:12               109 ze_XmlNfeProdutoII.sql
05/10/2021  11:12               116 ze_XmlNfeProdutoImporta.sql
08/10/2021  22:44             1.118 ze_XmlNfeProdutoipi.sql
05/10/2021  11:12               209 ze_XmlNfeProdutoISS.sql
09/10/2021  11:41               702 ze_XmlNfeProdutoList.sql
05/10/2021  11:12               120 ze_XmlNfeProdutoMedicamento.sql
08/10/2021  22:44             1.493 ze_XmlNfeProdutoPis.sql
05/10/2021  11:12               116 ze_XmlNfeProdutoVeiculo.sql
09/10/2021  00:34             1.187 ze_XmlNfeReferenciadas.sql
08/10/2021  22:33             2.204 ze_XmlNfeTotais.sql
08/10/2021  22:44             2.734 ze_XmlNfeTransporte.sql
09/09/2021  17:17               740 ze_XmlNode.sql
03/10/2021  23:45               332 ze_XmlTag.sql
              24 arquivo(s)         47.650 bytes


Esses arquivos SQL são os que criam as FUNCTIONs na base de dados.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 11 Out 2021 12:16

Hoje entrou pra valer a parte de geração de XML por STORED PROCEDURE/FUNCTION o próprio MySQL fazendo isso.
Apesar de alguns imprevistos, já está instalado.

Situação atual:

Todo cálculo de pedido feito pelo MySQL.
A grande maioria da geração do XML de NFE feita pelo MySQL.

O aplicativo tá virando mais SQL do que Harbour.

Mas parei com a geração de XML e voltei à contabilidade, porque pode acabar virando urgente.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 11 Out 2021 13:14

Aproveitando...
A geração de XML de NFE era o segundo maior fonte do aplicativo.

A posição atual, entre os maiores.

d:\fontes\integra>dir *.prg /o-s | find /n /i "xmlnfe"
...
[93]11/10/2021  07:02             8.715 ze_spedxmlnfe.prg
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 12 Out 2021 20:35

Quanto ao EXE, pouca mudança, só reduziu uns 200kb, porque sempre adiciono rotinas de conversão.
E não quero retirar 1.5MB de ícones do resource.

12/10/2021  20:18         1.901.488 jpa.exe
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 15 Out 2021 17:23

xml.png


Alterei tudo pra TEXT, pra precaução, pra não ter limites.
Gerei pouco mais de 5.000 XMLs pra teste, e tudo ok.

15/10/2021  15:49         1.896.880 jpa.exe


E conforme vou mexendo na contabilidade pra SQL, o EXE vai reduzindo um pouco mais.
O módulo de contabilidade está começando a ter alguma coisa funcionando.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 18 Out 2021 12:26

Dando uma geral em tudo.

Alterando campos pra DECIMAL. - só TODOS.
Só causei um pequeno desastre, porque tinha esquecido do DEFAULT ao alterar estruturas.
Mas agora tudo voltou ao normal.
STATIC FUNCTION Update1018()

   LOCAL cnSQL := ADOLocal(), cName

   WITH OBJECT cnSQL
      IF :FieldExists( "PCVALOR", "JPPREHIS" )
         :ExecuteCmd( "ALTER TABLE JPPREHIS CHANGE COLUMN PCVALOR PHVALOR DECIMAL(15,4) DEFAULT '0'" )
      ENDIF
      IF ! :FieldExists( "CBS10IPIBAR", "JPCOMBUSTIVEL" )
         :ExecuteCmd( "ALTER TABLE JPCOMBUSTIVEL ADD COLUMN CBS10IPIBAR DECIMAL(8,5) DEFAULT '0'" )
      ENDIF
      IF ! :FieldExists( "CBS500IPIBAR", "JPCOMBUSTIVEL" )
         :ExecuteCmd( "ALTER TABLE JPCOMBUSTIVEL ADD COLUMN CBS500IPIBAR DECIMAL(8,5) DEFAULT '0'" )
      ENDIF
      IF ! :FieldExists( "CBS10PETSAO", "JPCOMBUSTIVEL" )
         :ExecuteCmd( "ALTER TABLE JPCOMBUSTIVEL ADD COLUMN CBS10PETSAO DECIMAL(8,5) DEFAULT '0'" )
      ENDIF
      IF ! :FieldExists( "CBS10SHESAO", "JPCOMBUSTIVEL" )
         :ExecuteCmd( "ALTER TABLE JPCOMBUSTIVEL ADD COLUMN CBS10SHESAO DECIMAL(8,5) DEFAULT '0'" )
      ENDIF
      :ExecuteCmd( "ALTER TABLE JPBAAUTO" + ;
         " CHANGE COLUMN BUVALOR BUVALOR DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPBANCARIO" + ;
         " CHANGE COLUMN BAVALOR BAVALOR DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN BASALDO BASALDO DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPCADASTRO" + ;
         " CHANGE COLUMN CDLIMCRE CDLIMCRE DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN CDVALMES CDVALMES DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPCOMBUSTIVEL" + ;
         " CHANGE COLUMN CBS10PETSAO CBS10PETSAO DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS10SHESAO CBS10SHESAO DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS10IPISAO CBS10IPISAO DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS10PETCUB CBS10PETCUB DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS10IPICUB CBS10IPICUB DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS10PETBAR CBS10PETBAR DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS10IPIBAR CBS10IPIBAR DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500PETSAO CBS500PETSAO DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500SHESAO CBS500SHESAO DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500IPISAO CBS500IPISAO DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500PETCUB CBS500PETCUB DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500IPICUB CBS500IPICUB DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500PETBAR CBS500PETBAR DECIMAL(8,5) DEFAULT '0'," + ;
         " CHANGE COLUMN CBS500IPIBAR CBS500IPIBAR DECIMAL(8,5) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPCOMISSAO" + ;
         " CHANGE COLUMN CMVALOR CMVALOR DECIMAL(7,3) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPESTOQUE" + ;
         " CHANGE COLUMN ESQTDE ESQTDE DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN ESVALOR ESVALOR DECIMAL(15,5) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPFINAN" + ;
         " CHANGE COLUMN FIVALOR FIVALOR DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN FIJURDES FIJURDES DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPFISCAL" + ;
         " CHANGE COLUMN LFVALCON LFVALCON DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFICMBAS LFICMBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFICMALI LFICMALI DECIMAL(7,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFICMSUB LFICMSUB DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFICMOUT LFICMOUT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFICMNAO LFICMNAO DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFIPIBAS LFIPIBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFIPIVAL LFIPIVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFIPIOUT LFIPIOUT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN LFIPINAO LFIPINAO DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPFISICA" + ;
         " CHANGE COLUMN FSQTDDIG1 FSQTDDIG1 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDDIG2 FSQTDDIG2 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDDIG3 FSQTDDIG3 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDDIG4 FSQTDDIG4 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDJPA1 FSQTDJPA1 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDJPA2 FSQTDJPA2 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDJPA3 FSQTDJPA3 DECIMAL(14,4) DEFAULT '0'," + ;
         " CHANGE COLUMN FSQTDJPA4 FSQTDJPA4 DECIMAL(14,4) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPIMPOSTO" + ;
         " CHANGE COLUMN IMIIALI IMIIALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMIPIALI IMIPIALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMIPSALI IMIPSALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMICMRED IMICMRED DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMICMALI IMICMALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMICSALI IMICSALI DECIMAL(9,5) DEFAULT '0'," + ;
         " CHANGE COLUMN IMFCPALI IMFCPALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMSUBIVA IMSUBIVA DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMSUBRED IMSUBRED DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMSUBALI IMSUBALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMDIFALII IMDIFALII DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMDIFALIU IMDIFALIU DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMDIFALIF IMDIFALIF DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMISSALI IMISSALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMPISALI IMPISALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IMCOFALI IMCOFALI DECIMAL(6,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPITEM" + ;
         " CHANGE COLUMN IERES1 IERES1 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IERES2 IERES2 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IERES3 IERES3 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD1 IEQTD1 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD2 IEQTD2 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD3 IEQTD3 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD4 IEQTD4 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD5 IEQTD5 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD6 IEQTD6 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD7 IEQTD7 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD8 IEQTD8 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTD9 IEQTD9 DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEQTDMIN IEQTDMIN DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEVALOR IEVALOR DECIMAL(15,5) DEFAULT '0'," + ;
         " CHANGE COLUMN IEPESBRU IEPESBRU DECIMAL(9,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEPESLIQ IEPESLIQ DECIMAL(9,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IEVALCUS IEVALCUS DECIMAL(15,5) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPITPED" + ;
         " CHANGE COLUMN IPPRECUS IPPRECUS DECIMAL(16,5) DEFAULT '0'," + ;
         " CHANGE COLUMN IPPREPED IPPREPED DECIMAL(16,5) DEFAULT '0'," + ;
         " CHANGE COLUMN IPQTDE IPQTDE DECIMAL(14,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALCUS IPVALCUS DECIMAL(15,5) DEFAULT '0'," + ;
         " CHANGE COLUMN IPPRENOT IPPRENOT DECIMAL(15,5) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALADI IPVALADI DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALFRE IPVALFRE DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALSEG IPVALSEG DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALOUT IPVALOUT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALEXT IPVALEXT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALADU IPVALADU DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALIOF IPVALIOF DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALDES IPVALDES DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALPRO IPVALPRO DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPVALNOT IPVALNOT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIIBAS IPIIBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIIALI IPIIALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIIVAL IPIIVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIPIBAS IPIPIBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIPIALI IPIPIALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIPIVAL IPIPIVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICMBAS IPICMBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICMALI IPICMALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICMRED IPICMRED DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICMVAL IPICMVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPFCPALI IPFCPALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPFCPVAL IPFCPVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICSBAS IPICSBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICSALI IPICSALI DECIMAL(6,3) DEFAULT '0'," + ;
         " CHANGE COLUMN IPICSVAL IPICSVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPSUBIVA IPSUBIVA DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPSUBBAS IPSUBBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPSUBRED IPSUBRED DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPSUBALI IPSUBALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPSUBVAL IPSUBVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPDIFBAS IPDIFBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPDIFALIF IPDIFALIF DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPDIFALIU IPDIFALIU DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPDIFALII IPDIFALII DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPDIFVALI IPDIFVALI DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPDIFVALF IPDIFVALF DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPPISBAS IPPISBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPPISALI IPPISALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPPISVAL IPPISVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPCOFBAS IPCOFBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPCOFALI IPCOFALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPCOFVAL IPCOFVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPISSBAS IPISSBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPISSALI IPISSALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPISSVAL IPISSVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIMPALI IPIMPALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IPIMPVAL IPIMPVAL DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPMDFDET" + ;
         " CHANGE COLUMN MDVALMER MDVALMER DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPNOTFIS" + ;
         " CHANGE COLUMN NFVALPRO NFVALPRO DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALNOT NFVALNOT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALFRE NFVALFRE DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALSEG NFVALSEG DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALOUT NFVALOUT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALEXT NFVALEXT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALDES NFVALDES DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALADU NFVALADU DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFVALIOF NFVALIOF DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFIPIBAS NFIPIBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFIPIVAL NFIPIVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFICMBAS NFICMBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFICMVAL NFICMVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFFCPVAL NFFCPVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFSUBBAS NFSUBBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFSUBVAL NFSUBVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFDIFVALI NFDIFVALI DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFDIFVALF NFDIFVALF DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFPISBAS NFPISBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFPISVAL NFPISVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFCOFBAS NFCOFBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFCOFVAL NFCOFVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFISSBAS NFISSBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFISSVAL NFISSVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFICSBAS NFICSBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFICSALI NFICSALI DECIMAL(6,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFICSVAL NFICSVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFIMPVAL NFIMPVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFPESBRU NFPESBRU DECIMAL(8,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFPESLIQ NFPESLIQ DECIMAL(8,2) DEFAULT '0'," + ;
         " CHANGE COLUMN NFIIVAL NFIIVAL DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPPEDIDO" + ;
         " CHANGE COLUMN PDPERDES PDPERDES DECIMAL(5,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDPERADI PDPERADI DECIMAL(5,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALCUS PDVALCUS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALPRO PDVALPRO DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALNOT PDVALNOT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALFRE PDVALFRE DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALSEG PDVALSEG DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALOUT PDVALOUT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALEXT PDVALEXT DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALDES PDVALDES DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALADI PDVALADI DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALADU PDVALADU DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDVALIOF PDVALIOF DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDIIBAS PDIIBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDIIVAL PDIIVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDIPIBAS PDIPIBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDIPIVAL PDIPIVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDICMBAS PDICMBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDICMVAL PDICMVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDFCPVAL PDFCPVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDSUBBAS PDSUBBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDSUBVAL PDSUBVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDDIFVALI PDDIFVALI DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDDIFVALF PDDIFVALF DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDISSBAS PDISSBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDISSVAL PDISSVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDPISBAS PDPISBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDPISVAL PDPISVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDCOFBAS PDCOFBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDCOFVAL PDCOFVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDICSBAS PDICSBAS DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDICSVAL PDICSVAL DECIMAL(14,2) DEFAULT '0'," + ;
         " CHANGE COLUMN PDIMPVAL PDIMPVAL DECIMAL(14,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPPRECO" + ;
         " CHANGE COLUMN PCVALOR PCVALOR DECIMAL(15,4) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPPREHIS" + ;
         " CHANGE COLUMN PHVALOR PHVALOR DECIMAL(15,4) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPTABFORPAG" + ;
         " CHANGE COLUMN FPALIADI FPALIADI DECIMAL(8,3) DEFAULT '0'," + ;
         " CHANGE COLUMN FPALIDES FPALIDES DECIMAL(8,3) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPTABIBPT" + ;
         " CHANGE COLUMN IBNACALI IBNACALI DECIMAL(7,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IBIMPALI IBIMPALI DECIMAL(7,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IBALIFEDN IBALIFEDN DECIMAL(7,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IBALIFEDI IBALIFEDI DECIMAL(7,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IBALIEST IBALIEST DECIMAL(7,2) DEFAULT '0'," + ;
         " CHANGE COLUMN IBALIMUN IBALIMUN DECIMAL(7,2) DEFAULT '0'" )
      :ExecuteCmd( "ALTER TABLE JPVENDEDOR" + ;
         " CHANGE COLUMN VDCOMISSAO VDCOMISSAO DECIMAL(7,3) DEFAULT '0'" )
   ENDWITH


Apagando tabelas que viraram lixo

   WITH OBJECT cnSQL
      :ExecuteCmd( "DROP TABLE IF EXISTS JPCTLOTES" )
      :ExecuteCmd( "DROP TABLE IF EXISTS JPTABINFADI" )
      :ExecuteCmd( "DROP TABLE IF EXISTS JPMANIFESTACAO" )
      :ExecuteCmd( "DROP TABLE IF EXISTS JPCTHISTO" )
      :ExecuteCmd( "DROP TABLE IF EXISTS JPTABANPATI" )
   ENDWITH


Apagando STORED PROCEDURE/FUNCTION que viraram lixo
Reduzindo o número de procedure/function, juntando várias.

   WITH OBJECT cnSQL
      FOR EACH cName IN { "zeexists", "ze_margemcusto", "ze_NfeBlocoProdutoIcms", ;
            "ze_NfeBlocoProdutoIcms00", "ze_XmlNumberToXml", "ze_XmlNfeProdutoii", ;
            "ze_XmlNfeProdutoiss", "ze_XmlNfeProdutoArmamento", "ze_XmlNfeProdutoCombustivel", ;
            "ze_XmlNfeProdutoImporta", "ze_XmlNfeProdutoMedicamento", "ze_XmlNfeProdutoVeiculo", ;
            "ze_ValidIeAM", "ze_ValidIeCE", "ze_ValidIeES", "ze_ValidIeMS", "ze_ValidIeMT", ;
            "ze_ValidIePA", "ze_ValidIePB", "ze_ValidIePI", "ze_ValidIeRN", "ze_ValidIeRS", ;
            "ze_ValidIeSC", "ze_ValidIeSE", "ze_ValidIeTO", "ze_XmlNumber", "ze_saldodebito", ;
            "ze_saldocredito", "ze_NumberToXml", "SaldoConta", "ze_xmlnfeprodutoicms", ;
            "ze_xmlnfeprodutoipi", "ze_xmlnfeprodutocofins", "ze_xmlnfeprodutopis" }
         :ExecuteCmd( "DROP FUNCTION IF EXISTS " + cName )
         :ExecuteCmd( "DELETE FROM JPBINARY WHERE BINNAME=" + StringSQL( cName ) +  " AND BINTYPE='function'" )
      NEXT
      FOR EACH cName IN { "ze_PedidoCalculoDifal", "ze_PedidoCalculoFcp", "ze_PedidoCalculoIcms", ;
            "ze_PedidoCalculoIi", "ze_PedidoCalculoImportacao", "ze_PedidoCalculoImposto", ;
            "ze_PedidoCalculoIpi", "ze_PedidoCalculoIss", "ze_PedidoCalculoPis", ;
            "ze_PedidoCalculoRateioExtras", "ze_PedidoCalculoRateioOficial", "ze_PedidoCalculoSimples", ;
            "ze_PedidoCalculoSt", "ze_PedidoCalculoTotais", "ze_PedidoCalculoTributacao", ;
            "ze_PedidoLeis", "ze_CalculaPedido", "ze_CalculaPedidoImportacao", ;
            "ze_PedidoCalculoRateioExtras", "ze_PedidoCalculoRateioOficial", ;
            "ze_PedidoCalculoTributacao", "ze_PedidoCalculoDImposto", "ze_PedidoCalculoZTotais", ;
            "ze_ProdutoUltimaEntrada", "ze_SaldoContabil", "ze_produtocustocontabil", ;
            "ze_produtoultimasaida", "ze_contabilexemplosintetica", "ze_patrimoniolicmixupdate", ;
            "ze_patrimoniolixmixupdate", "ze_bancariorecalcula", "ze_financeiroaberto", ;
            "ze_pedidcalculoipi", "ze_pedidocalculoeii", "ze_pedidovaloremaberto", "ze_pedidoclonar", ;
            "ze_bancorecalcula" }
         :ExecuteCmd( "DROP PROCEDURE IF EXISTS " + cName )
         :ExecuteCmd( "DELETE FROM JPBINARY WHERE BINNAME=" + StringSQL( cName ) +  " AND BINTYPE='procedure'" )
      NEXT
   ENDWITH

   RETURN Nil


Pois é.... pelo menos no aplicativo principal, acho que não faltou nenhum.
Achei até uma alíquota (percentual) que tinha colocado como (14,2)... milhões de %, espero não precisar nunca disso.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Out 2021 09:09

Cheguei na última parte de gerar XML de NFE em SQL.

último fonte original Harbour (foi tendo ajustes)
FUNCTION ze_XmlNfe( nIdNotFis, cXml, nIdEmpresa, cVersaoJPA )

   LOCAL nSelect, mTexto, nCont, mChaveDigital, cTipoEmissao
   LOCAL cnSQL := ADOLocal()

   nSelect := Select()
   cXml    := ""

   WITH OBJECT cnSQL
      :Execute( "SELECT SEFAZNFEAMBIENTE, SEFAZNFETIPOEMISSAO" + ;
         " FROM JPTABSEFAZ" )
      cTipoEmissao := :String( "SEFAZNFETIPOEMISSAO" )
      :CloseRecordset()

      :Execute( "SELECT NFNOTFIS, NFDATEMI, NFCADASTRO, NFPEDIDO, NFFILIAL," + ;
         " JPEMPRESA.EMCNPJ" + ;
         " FROM JPNOTFIS" + ;
         " LEFT JOIN JPEMPRESA ON JPEMPRESA.IDEMPRESA = " + NumberSQL( nIdEmpresa ) + ;
         " WHERE IDNOTFIS = " + NumberSQL( nIdNotFis ) )
      mChaveDigital := "35" // UF Ibge
      mChaveDigital += Substr( StrZero( Year( :Date( "NFDATEMI" ) ), 4 ), 3, 2 ) + StrZero( Month( :Date( "NFDATEMI" ) ), 2 )
      mChaveDigital += SoNumeros( :String( "EMCNPJ" ) )         // Cnpj
      mChaveDigital += "55"                                     // Modelo de Docto Fiscal
      mChaveDigital += "001"                                    // Serie Docto Fiscal
      mChaveDigital += StrZero( :Number( "NFNOTFIS" ), 9 )      // NF 9 digitos
      mChaveDigital += cTipoEmissao                   // Tipo de Emissao Normal/Contingencia (começou na NFE 2.00)
      mChaveDigital += Right( StrZero( :Number( "NFCADASTRO" ), 6 ), 2 ) + StrZero( :Number( "NFCADASTRO" ), 6 ) // Chave Aleatoria // reduzido 1 posicao
      mChaveDigital := mChaveDigital + CalculaDigito( mChaveDigital, "11" )
      :CloseRecordset()
   ENDWITH

   cXml += [<NFe xmlns="http://www.portalfiscal.inf.br/nfe">]
   cXml += [<infNFe Id="NFe] + mChaveDigital + [" versao="4.00">]

   cXml += cnSQL:ReturnFunction( "ze_XmlNfeIde", mChaveDigital, nIdNotFis, nIdEmpresa, "JPA " + AppVersaoExe() )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeEmitente", nIdEmpresa )
   //NfeBlocoNotaAvulsa( @cXml )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeDestinatario", nIdNotFis )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeEntrega", nIdNotFis )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeProdutoList", nIdNotFis )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeTotais", nIdNotFis )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeTransporte", nIdNotFis )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeCobranca", nIdNotFis )
   cXml += cnSQL:ReturnFunction( "ze_XmlNfeInfAdic", nIdNotFis )
   cXml += [<infRespTec>]
   cXml += XmlTag( "CNPJ", "000" )
   cXml += XmlTag( "xContato", "Jose M C Quintas" )
   cXml += XmlTag( "email", "xxx@gmail.com" )
   cXml += XmlTag( "fone", "999" )
   cXml += [</infRespTec>]
   cXml += [</infNFe>]
   cXml += [</NFe>]

   RETURN Nil


e o fonte equivalente em SQL

CREATE FUNCTION ze_XmlNfe(
   nIdNotFis INT(11),
   nIdEmpresa INT(11),
   cVersaoJPA CHAR(100)
   )
RETURNS TEXT

BEGIN

DECLARE cXml TEXT;
DECLARE cChave VARCHAR(50);
DECLARE cTipoEmissao VARCHAR(1);
DECLARE dEmissao DATE;
DECLARE cCnpj VARCHAR(20);
DECLARE nNumNotFis, nIdCadastro INT(11);

SELECT
   NFNOTFIS, NFDATEMI, NFCADASTRO, EMCNPJ, SEFAZNFETIPOEMISSAO
   FROM JPNOTFIS
   LEFT JOIN JPEMPRESA ON JPEMPRESA.IDEMPRESA = nIdEmpresa
   JOIN JPTABSEFAZ
   WHERE IDNOTFIS = nIdNotFis LIMIT 1
INTO nNumNotFis, dEmissao, nIdCadastro, cCnpj, cTipoEmissao;

SET cChave := CONCAT(
      '35',
      LPAD( MOD( YEAR( dEmissao ), 100 ), 2, '0' ),
      LPAD( MONTH( dEmissao ), 2, '0' ),
      LPAD( ze_SoNumeros( cCnpj ), 14, '0' ),
      '55',
      '001',
      LPAD( nNumNotFis, 9, '0' ),
      cTipoEmissao,
      RIGHT( LPAD( nIdCadastro, 6, '0' ), 2 ),
      LPAD( nIdCadastro, 6, '0' ) );
SET cChave := CONCAT( cChave, ze_CalculaDigito( cChave, '11' ) );

SET cXml := CONCAT(
   '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">',
   '<infNFe Id="NFe', cChave, '" versao="4.00">',
   ze_XmlNfeIde( cChave, nIdNotFis, nIdEmpresa, cVersaoJPA ),
   ze_XmlNfeEmitente( nIdEmpresa ),
   ze_XmlNfeDestinatario( nIdNotFis ),
   ze_XmlNfeEntrega( nIdNotFis ),
   ze_XmlNfeProdutoList( nIdNotFis ),
   ze_XmlNfeTotais( nIdNotFis ),
   ze_XmlNfeTransporte( nIdNotFis ),
   ze_XmlNfeCobranca( nIdNotFis ),
   ze_XmlNfeInfAdic( nIdNotFis ),
   '<infRespTec>',
   ze_XmlTag( 'CNPJ', '000' ),
   ze_XmlTag( 'xContato', 'Jose M C Quintas' ),
   ze_XmlTag( 'email', 'xxx@gmail.com' ),
   ze_XmlTag( 'fone', '000' ),
   '</infRespTec>',
   '</infNFe>',
   '</NFe>' );

RETURN cXml;

END


Fui fazendo o ajuste das sub-rotinas, migrando uma parte de cada vez, e agora é a final geral.
Agora sim, XML de NFE completo pelo SQL.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Out 2021 13:10

xmlnfe.png


Gerando XML de nota direto no servidor.
Meio doido, mas diz que foi mais rápido gerar 1.000 notas do que 100 notas....
O que demorou foi pra trazer para o terminal. 11 segundos.

Pois é... no mundo SQL, 11 segundos parece uma eternidade 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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 21 Out 2021 14:43

A propósito....

CREATE FUNCTION ze_CalculaDigito(
   cNumero VARCHAR(100),
   nModulo INT(11)
   )
RETURNS VARCHAR(1)


Tive que aumentar o tamanho na rotina que calcula o dígito de controle.
Tava 20 dígitos, mas NFE tem 44 dígitos.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 22 Out 2021 10:07

METHOD Valida( nidctConta ) CLASS JPCTCONTAClass

   LOCAL nRow := Row(), cNome, cTipo, lEof

   @ nRow, 32 SAY Space(60)
   WITH OBJECT ::cnSQL
      :Execute( "SELECT CPNOME, CPTIPO FROM JPCTCONTA WHERE IDCTCONTA=" + NumberSQL( nidctConta ) )
      cNome := :String( "CPNOME", 60 )
      cTipo := :String( "CPTIPO", 1 )
      lEof  := :Eof()
      :CloseRecordset()
      IF lEof
         MsgStop( "Conta não cadastrada" )
         RETURN .F.
      ENDIF
      @ nRow, 32 SAY cNome
      IF m_Prog == "PJPCONTABIL" .AND. cTipo != "A"
         MsgStop( "Não pode efetuar lançamento em conta sintética" )
         RETURN .F.
      ENDIF
   ENDWITH

   RETURN .T.


Seguindo um pouco o esquema de STORED PROCEDURE nos fontes do Harbour.

Na SP é SELECT campos INTO variáveis, o que já pega a informação que interessa e encerra a consulta.
Fazendo o mesmo no Harbour, já encerro o recordset.
Do jeito que eu fazia antes, eu mantinha aberto, pra economizar variáveis, mas.... tinha que fechar nos dois IFs, e no final.
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Meu modo de trabalho

Mensagempor JoséQuintas » 25 Out 2021 13:58

Esqueci das datas com UTC...
Muita coisa pra um negócio tão simples...
Talvez o MySQL tenha isso pronto, mas.... vai no que já tenho...

Domingo de páscoa
CREATE FUNCTION ze_DomingoDePascoa( nAno INT(11) )
RETURNS DATE

BEGIN

DECLARE nA, nB, nC, nD, nE, nF, nG, nH, nI, nK, nL, nM, nMes, nDia INT;
DECLARE dData DATE;

SET nA    = MOD( nAno, 19 );
SET nB    = FLOOR( nAno / 100 );
SET nC    = MOD( nAno, 100 );
SET nD    = FLOOR( nB / 4 );
SET nE    = MOD( nB, 4 );
SET nF    = FLOOR( ( nB + 8 ) / 25 );
SET nG    = FLOOR( ( nB - nF + 1 ) / 3 );
SET nH    = MOD( 19 * nA + nB - nD - nG + 15, 30 );
SET nI    = FLOOR( nC / 4 );
SET nK    = MOD( nC, 4 );
SET nL    = MOD( 32 + 2 * nE + 2 * nI - nH - nK, 7 );
SET nM    = FLOOR( ( nA + 11 * nH + 22 * nL ) / 451 );
SET nMes  = FLOOR( ( nH + nL - 7 * nM + 114 ) / 31 );
SET nDia  = MOD( nH + nL - 7 * nM + 114, 31 ) + 1;
SET dData = CONCAT( LPAD( nAno, 4, '0' ), '-', + LPAD( nMes, 2, '0' ), '-', LPAD( nDia, 2, '0' ) );

RETURN dData;

END


terça de carnaval
CREATE FUNCTION ze_TercaDeCarnaval( nAno INT(11) )
RETURNS DATE

BEGIN

DECLARE dData DATE;

SET dData = DATE_SUB( ze_DomingoDePascoa( nAno ), INTERVAL 47 DAY );

RETURN dData;

END


Início do horário de verão
CREATE FUNCTION ze_HorarioVeraoInicio( nAno INT(11) )
RETURNS DATE

BEGIN

DECLARE dPrimeiroDia, dPrimeiroDomingo, dTerceiroDomingo DATE;

IF nAno = 2018 THEN
   SET dTerceiroDomingo := '2018-11-04';
ELSE
   SET dPrimeiroDia := CONCAT( LPAD( nAno, 4, '0' ), '-10-01' );
   SET dPrimeiroDomingo := DATE_ADD( dPrimeiroDia, INTERVAL
         ( 6 - WEEKDAY( dPrimeiroDia ) ) DAY );
   SET dTerceiroDomingo := DATE_ADD( dPrimeiroDomingo, INTERVAL 14 DAY );
END IF;

RETURN dTerceiroDomingo;

END


Término do horário de verão
CREATE FUNCTION ze_HorarioVeraoTermino( nAno INT(11) )
RETURNS TEXT

BEGIN

DECLARE cText TEXT;
DECLARE dPrimeiroDia, dPrimeiroDomingo, dTerceiroDomingo DATE;

SET dPrimeiroDia := CONCAT( LPAD( nAno + 1, 4, '0' ), '-02-01' );
SET dPrimeiroDomingo := DATE_ADD( dPrimeiroDia, INTERVAL
         6 - WEEKDAY( dPrimeiroDia ) DAY );
SET dTerceiroDomingo := DATE_ADD( dPrimeiroDomingo, INTERVAL 14 DAY );

IF dTerceiroDomingo = ze_TercaDeCarnaval( nAno + 1 ) - 2 THEN
   SET dTerceiroDomingo := DATE_ADD( dTerceiroDomingo, INTERVAL 7 DAY );
END IF;

RETURN dTerceiroDomingo;

END


E finalmente, a data com fuso horário
CREATE FUNCTION ze_DateTimeXml( dDate DATE, cTime VARCHAR(10), cUF VARCHAR(2) )
RETURNS TEXT

BEGIN

DECLARE cText TEXT;
DECLARE nHorarioVerao INT(11);

SET nHorarioVerao :=
   dDate >= ze_HorarioVeraoInicio( YEAR( dDate ) ) OR
   dDate <= ze_HorarioVeraoTermino( YEAR( dDate ) - 1 ) ;

IF cUF = 'AC' THEN
   SET cText := '-05:00';

ELSEIF cUF IN ( 'MT','MS' ) AND nHorarioVerao = 1 THEN
   SET cText := '-03:00';

ELSEIF cUF IN ( 'DF', 'ES', 'GO', 'MG', 'PR', 'RJ', 'RS', 'SC' ) AND nHorarioVerao = 1 THEN
   SET cText := '-02:00';

ELSEIF cUF IN ( 'AM', 'MT', 'MS', 'RO', 'RR' ) THEN
   SET cText := '-04:00';

ELSE
   SET cText := '-03:00';

END IF;

SET cText := CONCAT( dDate, 'T', cTime, cText );

RETURN cText;

END


Agora no post que vi: DATE_SUB()
Esse equivale ao DATE_ADD() com data negativa.
Nem sei porque usei diferente....
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: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 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 6 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