Página 2 de 3

Gerar XML - NFE.PRG

Enviado: 18 Nov 2011 19:18
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.

Gerar XML - NFE.PRG

Enviado: 01 Jun 2017 16:16
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>

Gerar XML - NFE.PRG

Enviado: 01 Jun 2017 20:20
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

Gerar XML - NFE.PRG

Enviado: 01 Jun 2017 21:49
por frazato

Gerar XML - NFE.PRG

Enviado: 01 Jun 2017 22:40
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

Gerar XML - NFE.PRG

Enviado: 01 Jun 2017 23:31
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

Gerar XML - NFE.PRG

Enviado: 02 Jun 2017 08:01
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....

Gerar XML - NFE.PRG

Enviado: 02 Jun 2017 08:12
por rubens
Bom dia...

Gabriel você Gravar o xml ou Ler o XML ?

Rubens

Gerar XML - NFE.PRG

Enviado: 02 Jun 2017 09:05
por lugab
Bom dia, Rubens...

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


Obrigado, Quintas....

Gerar XML - NFE.PRG

Enviado: 02 Jun 2017 11:46
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 401 vezes

Gerar XML - NFE.PRG

Enviado: 02 Jun 2017 22:15
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

Gerar XML - NFE.PRG

Enviado: 02 Jun 2017 22:46
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

Gerar XML - NFE.PRG

Enviado: 03 Jun 2017 11:38
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 ???

Gerar XML - NFE.PRG

Enviado: 03 Jun 2017 12:10
por JoséQuintas
Esse link se refere à SefazClass.
Só clicar pra ir na página inicial, e clicar em download.

Gerar XML - NFE.PRG

Enviado: 04 Jun 2017 18:37
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()