Gerar XML - NFE.PRG

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar XML - NFE.PRG

Mensagem por JoséQuintas »

Eu prefiro fazer do jeito tradicional, tanto pra gerar, quanto pra ler.
No geral, uma função pra leitura e outra pra geração.

Dá pra começar fazendo uma função para as tags, que tem o formato <tag>conteudo</tag>
A partir daí, começa a ficar mais fácil gerar um xml.
Só exemplos básicos, pra começo do projeto

Código: Selecionar todos

mXmlEmitente = ;
   XmlTag("cnpj",Cnpj) + ;
   XmlTag("nome",nome) + ;
   XmlTag("endereco",endereco) + ;
   XmlTag("cidade",cidade) + ;
   XmlTag("UF",uf)
mXmlDestinatario = ;
   XmlTag("cnpj",Cnpj) + ;
   XmlTag("nome",nome) + ;
   XmlTag("endereco",endereco) + ;
   XmlTag("cidade",cidade) + ;
   XmlTag("UF",uf)
mXmlNota = ;
   XmlTag("emitente",mXmlEmitente) + ;
   XmlTag("destinatario",mXmlDestinatario)
mXmlNota = XmlTag("nota",mXmlNota)

Function XmlTag(cCampo,cConteudo)
Return "<" + cCampo + ">" + cConteudo + "</" + cCampo + ">"
Já na leitura, seria o processo inverso:

Código: Selecionar todos

mXlmNota = MemoRead("arquivoXml")
mXmlEmitente = XmlNode(mXmlNota,"emitente")
    mCnpj = XmlNode(mXmlEmitente,"cnpj")
   mNome = XmlNode(mXmlEmitente,"nome")
   mEndereco = XmlNode(mXmlEmitente,"endereco")
mXmlDestinatario = XmlNode(mXmlNota,"destinatario")

Function XmlNode(mXml,mNode)
Local mTexto := "", mInicio := 0, mFim := 0

mInicio := At("<" + mNode + ">",mXml)
mFim   := At("</" + mNode + ">", mXml)
If mInicio != 0 .And. mFim != 0
   mTexto := Substr(mXml,mInicio,mFim-mInicio+1)
Endif
Return mTexto
Obs.
Apenas digitei como exemplo direto no post, pra servir como referência, não cheguei a compilar.
O princípio base do XML são os indicadores de início e fim de blocos, com <tag> e </tag>.
Entendendo isso, fica até mais fácil gerar xml do que os txts tradicionais.
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/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Gerar XML - NFE.PRG

Mensagem por lugab »

Oi Quintas..

Muito legal esse código antigo seu. Eu quero usar o código de LEITURA , pq é muito fácil de entender, até pra trainees como eu que
só conseguem trabalhar em modo console..

Entretanto, não sei como fazer um loop pra ler e guardar os campos dos vários itens
( produtos, nome, quant, val.unit, IPI, ICMS, etc )..
Também não sei como resolver a duplicidade, considerando que em todos os produtos os nomes das tags
se repetem (ex: existe "prod" e "uTrib" em item 1 e item 2, etc) ???

Código: Selecionar todos

-<det nItem="1">
-<prod>
<cProd>836</cProd>
<cEAN>7891025320616</cEAN>
<xProd>DANONE GREGO ORIGINAL 400X12</xProd>
<NCM>04031000</NCM>
<CFOP>5102</CFOP>
<uCom>UN</uCom>
<qCom>2.0000</qCom>
<vUnCom>5.1900000000</vUnCom>
<vProd>10.38</vProd>
<cEANTrib>7891025320616</cEANTrib>
<uTrib>UN</uTrib>
<qTrib>2.0000</qTrib>
<vUnTrib>5.1900000000</vUnTrib>
<indTot>1</indTot>
</prod>
-<imposto>
<vTotTrib>1.76</vTotTrib>
-<ICMS>
-<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>3</modBC>
<vBC>10.38</vBC>
<pICMS>17.00</pICMS>
<vICMS>1.76</vICMS>
</ICMS00>
</ICMS>
-<PIS>
-<PISNT>
<CST>08</CST>
</PISNT>
</PIS>
-<COFINS>
-<COFINSNT>
<CST>08</CST>
</COFINSNT>
</COFINS>
</imposto>
</det>


-<det nItem="2">
-<prod>
<cProd>837</cProd>
<cEAN>7891025320623</cEAN>
<xProd>DANONE GREGO FRUTAS VERMELHAS 400GX12</xProd>
<NCM>04031000</NCM>
<CFOP>5102</CFOP>
<uCom>UN</uCom>
<qCom>2.0000</qCom>
<vUnCom>5.1900000000</vUnCom>
<vProd>10.38</vProd>
<cEANTrib>7891025320623</cEANTrib>
<uTrib>UN</uTrib>
<qTrib>2.0000</qTrib>
<vUnTrib>5.1900000000</vUnTrib>
<indTot>1</indTot>
</prod>
-<imposto>
<vTotTrib>1.76</vTotTrib>
-<ICMS>
-<ICMS00>
<orig>0</orig>
<CST>00</CST>
<modBC>3</modBC>
<vBC>10.38</vBC>
<pICMS>17.00</pICMS>
<vICMS>1.76</vICMS>
</ICMS00>
</ICMS>
-<PIS>
-<PISNT>
<CST>08</CST>
</PISNT>
</PIS>
-<COFINS>
-<COFINSNT>
<CST>08</CST>
</COFINSNT>
</COFINS>
</imposto>
</det>



-<total>
-<ICMSTot>
<vBC>743.44</vBC>
<vICMS>126.39</vICMS>
<vBCST>0.00</vBCST>
<vST>0.00</vST>
<vProd>1569.36</vProd>
<vFrete>0.00</vFrete>
<vSeg>0.00</vSeg>
<vDesc>0.00</vDesc>
<vII>0.00</vII>
<vIPI>0.00</vIPI>
<vPIS>0.00</vPIS>
<vCOFINS>0.00</vCOFINS>
<vOutro>0.00</vOutro>
<vNF>1569.36</vNF>
<vTotTrib>128.26</vTotTrib>
</ICMSTot>
</total>
-<transp>
<modFrete>0</modFrete>
-<transporta>
<CNPJ>06241458000119</CNPJ>
<xNome>TDR DISTRIBUIDORA DE ALIMENTOS LTDA</xNome>
<IE>066913608</IE>
<xEnder>AV SEN.JOSE ERMIRIO DE MORAIS,918</xEnder>
<xMun>SOBRAL</xMun>
<UF>CE</UF>
</transporta>
-<veicTransp>
<placa>HWQ9642</placa>
<UF>CE</UF>
</veicTransp>
-<vol>
<qVol>815</qVol>
<esp>Unidade</esp>
<pesoL>213.420</pesoL>
<pesoB>200.080</pesoB>
</vol>
</transp>
-<cobr>
-<dup>
<nDup>Pedido: 550209/1a Parcela</nDup>
<dVenc>2015-01-23</dVenc>
<vDup>1569.36</vDup>
</dup>
</cobr>

-<infAdic>
<infCpl>Para resgatar o arquivo XML da NFe acesse: www.flag.com.br/downloadnfe; ICMS PAGO EM SUBSTITUICAO TRIBUTARIA - NAO ACEITAMOS RECLAMACOES APOS O RECEBIMENTO.; ; Cliente: 390 - CHOCO BALAS; Vendedor: 149 - FRANCISCO; Cond.Pgto: BOLETO - 16 DIAS; Nro.Pedido: 550209; Carro/Viagem: 11/17375; Vencimento: 23/01/2015;</infCpl>
</infAdic>
</infNFe>
-<Reference URI="#NFe23150106241458000119550020002947291074729077">
-<infProt>
<tpAmb>1</tpAmb>
<verAplic>14.3.0.0</verAplic>
<chNFe>23150106241458000119550020002947291074729077</chNFe>
<dhRecbto>2015-01-07T18:51:12</dhRecbto>
<nProt>123150000908440</nProt>
<digVal>oOAmFHFMY2MiuGGixgoqa/GjQtM=</digVal>
<cStat>100</cStat>
<xMotivo>Autorizado o uso da NF-e</xMotivo>
</infProt>
</protNFe>
</nfeProc>
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar XML - NFE.PRG

Mensagem por JoséQuintas »

Entretanto, não sei como fazer um loop pra ler e guardar os campos dos vários itens
No aplicativo não usa array? vai usar também.

XmlNode() não funciona para o primeiro campo encontrado? Só fazer um loop, retirando cada um até acabar.

https://github.com/JoseQuintas/sefazcla ... #L278,L291
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/
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Gerar XML - NFE.PRG

Mensagem por frazato »

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar XML - NFE.PRG

Mensagem por JoséQuintas »

Ou, se quiser mais fácil ainda:

Código: Selecionar todos

oDoc := XmlToDoc( MemoRead( "arquivo.xml" ) )
Só isso e tá pronto, tudo numa única variável.

https://github.com/JoseQuintas/sefazcla ... lClass.prg
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/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Gerar XML - NFE.PRG

Mensagem por lugab »

Não entendi nada, mas valeu a tentativa, Quintas...

Frazato, obrigado...
Baixei e vou tentar entender sua rotina de loop pra pegar dados dos produtos..

Abraço a todos
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar XML - NFE.PRG

Mensagem por JoséQuintas »

Não entendi nada, mas valeu a tentativa, Quintas...
Pelo menos tentou entender?
Abriu o Link mostrando a rotina de extrair nodes múltiplos, em destaque pra não confundir?
multiplenode.png
No segundo caso é rotina completa pra extrair toda nota fiscal, pronta pra uso, ou pra estudo.
Além da opção em classe, tem a opção usando hash no Danfe.

No final, eu é que não entendo.
Tem horas que parece que a perda de tempo respondendo posts é mais perda de tempo do que parece....
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/
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Gerar XML - NFE.PRG

Mensagem por rubens »

Bom dia...

Gabriel você Gravar o xml ou Ler o XML ?

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Gerar XML - NFE.PRG

Mensagem por lugab »

Bom dia, Rubens...

Meu objetivo é LER e armazenar em variáveis os diversos dados de um XML


Obrigado, Quintas....
lugab
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Gerar XML - NFE.PRG

Mensagem por rubens »

Gabriel,

Se ajudar segue parte do programa de compra que uso para dar entrada pelo XML. Usa a Classe do Quintas que deixou tudo mamão com açúcar...
A Classe do Quintas foi instanciada na linha 184.
A partir desse momento é só buscar os dados da nota. No ze_spedxmlClass.prg tem todos os métodos e atributos da classe. Mas não precisa você fazer nada basta o que está na linha 184.

Na linha 631 começa a leitura dos itens: For EACH oProduto IN ( oNfe:Produto ).

Rubens
Compra-Gabriel.prg
(27.27 KiB) Baixado 400 vezes
"Eu e minha casa servimos ao Senhor e você ???"
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Gerar XML - NFE.PRG

Mensagem por lugab »

Valeu, Rubens,
Baixei, olhei e tomei um susto, kkk.
Com esse meu nível "low-profile", não deu nem pra acompanhar, quanto mais entender...

Do jeito simplório como estou fazendo, eu uso a função AT(), mas ela é sensivel a caracters maiúsculos e minúsculos
Por exemplo, em duas XMLS diferentes me deparei com a seguinte falta de padronização nos 'nomes das tags'

Código: Selecionar todos

<xNome>CAMILA DE ALBUQUERQUE PEREIRA</xNome>
<xnome>JOSE EVERALÇDO LACERDA SANTOS</xnome>
Note que em um XML o nome da tag é "xNome" e no outro "xnome", com maiúsculos/minusculos..
E para a função AT() funcionar, eu teria que dar UPPER() em toda o XML e eu não queria alterar nada da XML recebida.

Existe outra opção que não seja a função AT(), pra pegar cada campo da XML ??
Para a linha de programa

Código: Selecionar todos

 At("<" +nometag + ">",mXml) 
funcionar, nometag devia sempre ser padrao em toda e qualquer XMLs , o que não é garantido

Obrigado e bom fim de semana a todos
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar XML - NFE.PRG

Mensagem por JoséQuintas »

Ainda não entendeu.

Vamos simplificar:

No seu fonte você coloca:

Código: Selecionar todos

cXml := MemoRead( "arquivo.xml" )
oNota := XmlToNota( cXml )
E tá pronto.
A partir daí, é só usar a variável oNota.

Qual informação quer?
Dados do emitente?

Código: Selecionar todos

? oNota:Emitente:Cnpj
? oNota:Emitente:Nome
? oNota:Emitente:Endereco
Dados do destinatário?

Código: Selecionar todos

? oNota:Destinatario:Cnpj
? oNota:Destinatario:Nome
? oNota:Destinatario:Endereco
Quantidade de produtos?

Código: Selecionar todos

? Len( oNota:Produto )
Informação do primeiro produto?

Código: Selecionar todos

? oNota:Produto[ 1 ]:Codigo
? oNota:Produto[ 1 ]:Nome
ICMS do primeiro produto?

Código: Selecionar todos

? oNota:Produto[ 1 ]:Icms:Cst
? oNota:Produto[ 1 ]:Icms:Base
? oNota:Produto[ 1 ]:Icms:Reducao
? oNota:Produto[ 1 ]:Icms:Aliquota
? oNota:Produto[ 1 ]:Icms:Valor
Todos os produtos?

Código: Selecionar todos

FOR EACH oProduto IN oNota:Produto
   ? oProduto:Codigo
   ? oProduto:Nome
   ? oProduto:II:Valor
   ? oProduto:Icms:Valor
   ? oProduto:IcmsSt:Valor
   ? oProduto:Ipi:Valor
   ? oProduto:Iss:Valor
   ? oProduto:Pis:Valor
   ? oProduto:Cofins:Valor
NEXT
E por aí vai...

É tudo numa única variável, pronto pra uso.
Que parte não entendeu?

Quer fazer sozinho toda rotina? Só olhar aqui, já vai estar marcado todo bloco de leitura do XML, só trocar as variáveis da classe pelas suas variáveis.
Só não vou entender porque trocar uma única variável por muitas.

https://github.com/JoseQuintas/sefazcla ... #L379,L512
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/
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Gerar XML - NFE.PRG

Mensagem por lugab »

Obrigado, Quintas...

Vc disse:
No seu fonte você coloca:
cXml := MemoRead( "arquivo.xml" )
oNota := XmlToNota( cXml )
E tá pronto.
A partir daí, é só usar a variável oNota.

Qual informação quer?
Dados do emitente?
? oNota:Emitente:Cnpj
? oNota:Emitente:Nome
? oNota:Emitente:Endereco
1) Vc poderia me passar as funções ausentes no exemplo ? Ex: XmlToNota( ) e as outras funções que estão dentro dela ?

2) Vc poderia me informar tb os .CH e .LIB que eu devo linkar junto ???
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gerar XML - NFE.PRG

Mensagem por JoséQuintas »

Esse link se refere à SefazClass.
Só clicar pra ir na página inicial, e clicar em download.
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/
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

Gerar XML - NFE.PRG

Mensagem por jairfab »

O Leonardo tem toda a razão, porem temos que ter um certo cuidado quando trabalhamos com este componente, ou seja depois que utilizar a classe devemos
Destruí as variáveis principais ou seja zerar, eu utilizo este componente para criar os xml do e-Social Folha de Pagamentos, percebi que quando eu utilizava o componente para gerar o mesmo xml pela segunda vez ele duplicava as informações, foi então que resolvi analisar este comportamento e constatei que não bastava destruí a variável principal utilizada na inicialização da class, precisava destruí os nos principais.

Código: Selecionar todos

*::oXml:oRoot:AddBelow( TXMLNodeEx():New( 2,"xml" , , 'version="1.0"  encoding="UTF-8"' ) )
::oInfNfe1:= TXMLNodeEx():New( 2,"xml" , , 'version="1.0"  encoding="UTF-8"' )
::oXml:oRoot:AddBelow( ::oInfNfe1 )
.
::oInfNfe := TXMLNodeEx( ):New( 0, "eSocial",::hHash )
::oXml:oRoot:AddBelow(::oInfNfe )
.
.
*Exclua estes nós do documento XML 
::oInfNfe:unlink()
::oInfNfe1:unlink()
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Responder