Autor Tópico: XML dos itens da NFe  (Lida 9833 vezes)

JacquesBica

  • Full Member
  • ***
  • Mensagens: 197
  • Karma: +0/-0
  • Boas cercas fazem bons vizinhos
XML dos itens da NFe
« Online: Julho 30, 2015, 11:52:24 am »
Bom dia.

Não estou conseguindo gerar a TAG <det nItem = XX> da NF-e dentro do loop dos itens da nota.
Eu tenho 5 itens na nota porem grava apenas o ultimo no XML.
Alguem, por favor, pode me fornecer um pedaço de codigo com esta rotina?

Grato.

<det nItem="1">
<prod>
 <cProd>1</cProd>
 <cEAN/>
 <xProd>ALFACE HIDROPONICA MALLMANN</xProd>
 <NCM>07050000</NCM>
 <CFOP>5101</CFOP>
 <uCom>UND</uCom>
 <qCom>100.0000</qCom>
 <vUnCom>1.5000</vUnCom>
 <vProd>150.00</vProd>
 <cEANTrib/>
 <uTrib>UND</uTrib>
 <qTrib>100.0000</qTrib>
 <vUnTrib>1.5000</vUnTrib>
 <indTot>1</indTot>
 </prod>

Arlindo Reis

  • Sr. Member
  • ****
  • Mensagens: 291
  • Karma: +0/-0
Re:XML dos itens da NFe
« Responder #1 Online: Julho 30, 2015, 04:21:53 pm »
Por favor, coloque o trecho da sua rotina que gera esta parte do XML da NF-e!

fica mais fácil de ajudar!

JacquesBica

  • Full Member
  • ***
  • Mensagens: 197
  • Karma: +0/-0
  • Boas cercas fazem bons vizinhos
Re:XML dos itens da NFe
« Responder #2 Online: Julho 30, 2015, 04:28:58 pm »
Este codigo abaixo faz quse o que eu preciso.
Ele funciona, porem, gera o XML apenas do ULTIMO item do loop.


// Informações dos produtos
nContador = 1
FOR EACH ArqNotas ON RegistroSeq WHERE "Registro = " + CadNotas.Registro
   HReadSeekFirst(CadProdutos,Produto,ArqNotas.Produto)
   
   XMLWrite("XML","/NFe/infNFe/det/@nItem",NoSpace(NumToString(nContador,"2d")))         
   XMLWrite("XML","/NFe/infNFe/det/prod/cProd", NoSpace(NumToString(ArqNotas.Produto,"13d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/cEAN", NoSpace(CadProdutos.EAN))
   XMLWrite("XML","/NFe/infNFe/det/prod/xProd", CadProdutos.Descricao)
   XMLWrite("XML","/NFe/infNFe/det/prod/CFOP", ArqNotas.Operacao[[1 TO 4]])
   XMLWrite("XML","/NFe/infNFe/det/prod/uCom", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det/prod/qCom", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/vUnCom", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))
   XMLWrite("XML","/NFe/infNFe/det/prod/cEANTrib", "")
   XMLWrite("XML","/NFe/infNFe/det/prod/uTrib", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det/prod/qTrib", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/vUnTrib", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))   
   XMLWrite("XML","/NFe/infNFe/det/prod/indTot", "1")         
   
   nContador++
END

Arlindo Reis

  • Sr. Member
  • ****
  • Mensagens: 291
  • Karma: +0/-0
Re:XML dos itens da NFe
« Responder #3 Online: Julho 30, 2015, 04:51:45 pm »
Tente
Código: [Selecionar]
nContador = 1
HReadSeek(CadProdutos,Produto,ArqNotas.Produto)
FOR EACH ArqNotas ON RegistroSeq WHERE "Registro = " + CadNotas.Registro   
   XMLWrite("XML","/NFe/infNFe/det/@nItem",NoSpace(NumToString(nContador,"2d")))         
   XMLWrite("XML","/NFe/infNFe/det/prod/cProd", NoSpace(NumToString(ArqNotas.Produto,"13d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/cEAN", NoSpace(CadProdutos.EAN))
   XMLWrite("XML","/NFe/infNFe/det/prod/xProd", CadProdutos.Descricao)
   XMLWrite("XML","/NFe/infNFe/det/prod/CFOP", ArqNotas.Operacao[[1 TO 4]])
   XMLWrite("XML","/NFe/infNFe/det/prod/uCom", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det/prod/qCom", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/vUnCom", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))
   XMLWrite("XML","/NFe/infNFe/det/prod/cEANTrib", "")
   XMLWrite("XML","/NFe/infNFe/det/prod/uTrib", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det/prod/qTrib", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/vUnTrib", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))   
   XMLWrite("XML","/NFe/infNFe/det/prod/indTot", "1")
   nContador++
   HReadNext(CadProdutos)
END

Eu fiz com a flexdocs, então, já deixei uma query pronta pra pegar os produtos conforme o número da nota, sendo que neste eu gravei o [nItem] para cada produto que lanço na nota!

Veja se dá certo!

JacquesBica

  • Full Member
  • ***
  • Mensagens: 197
  • Karma: +0/-0
  • Boas cercas fazem bons vizinhos
Re:XML dos itens da NFe
« Responder #4 Online: Julho 30, 2015, 04:58:01 pm »
O loop está correto. Ele lê os dois produtos da nota. Porem, o XML é gerado apenas com o ultimo:

<det nItem="2">
<prod>
 <cProd>2</cProd>
 <CFOP>5102</CFOP>
 <qCom>20</qCom>
 <vUnCom>2.0000</vUnCom>
 <cEANTrib/>
 <qTrib>20</qTrib>
 <vUnTrib>2.0000</vUnTrib>
 <indTot>1</indTot>
 </prod>
 </det>

Esté codigo manipula apenas a tabela de itens notas (arqnotas).


// Informações dos produtos
nContador = 1
FOR EACH ArqNotas ON RegistroSeq WHERE "Registro = " + CadNotas.Registro
   XMLWrite("XML","/NFe/infNFe/det/@nItem",NoSpace(NumToString(nContador,"2d")))         
   XMLWrite("XML","/NFe/infNFe/det/prod/cProd", NoSpace(NumToString(ArqNotas.Produto,"13d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/CFOP", ArqNotas.Operacao[[1 TO 4]])
   XMLWrite("XML","/NFe/infNFe/det/prod/qCom", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/vUnCom", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))
   XMLWrite("XML","/NFe/infNFe/det/prod/cEANTrib", "")
   XMLWrite("XML","/NFe/infNFe/det/prod/qTrib", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det/prod/vUnTrib", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))   
   XMLWrite("XML","/NFe/infNFe/det/prod/indTot", "1")         
   nContador++
END

Andre Martini

  • Newbie
  • *
  • Mensagens: 48
  • Karma: +0/-0
Re:XML dos itens da NFe
« Responder #5 Online: Julho 30, 2015, 05:53:56 pm »
Parece que você insere na primeira passada e edita nas demais.
no xml sua tag det deve ficar assim:
<det item="1">
</det>
<det item="2">
</det>

veja se funciona a mudança que fiz abaixo:
DE
det/@nItem
PARA
/det @nItem



// Informações dos produtos
nContador = 1
FOR EACH ArqNotas ON RegistroSeq WHERE "Registro = " + CadNotas.Registro
   HReadSeekFirst(CadProdutos,Produto,ArqNotas.Produto)
   
   XMLWrite("XML","/NFe/infNFe/det @nItem",NoSpace(NumToString(nContador,"2d")))         
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/cProd", NoSpace(NumToString(ArqNotas.Produto,"13d")))
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/cEAN", NoSpace(CadProdutos.EAN))
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/xProd", CadProdutos.Descricao)
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/CFOP", ArqNotas.Operacao[[1 TO 4]])
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/uCom", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/qCom", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/vUnCom", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/cEANTrib", "")
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/uTrib", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/qTrib", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/vUnTrib", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))   
   XMLWrite("XML","/NFe/infNFe/det @nItem/prod/indTot", "1")         
   
   nContador++
END

JacquesBica

  • Full Member
  • ***
  • Mensagens: 197
  • Karma: +0/-0
  • Boas cercas fazem bons vizinhos
Re:XML dos itens da NFe
« Responder #6 Online: Julho 30, 2015, 06:00:32 pm »
A rotina passa 2x no loop (uma para cada registro lido), porem, agora não gera nada nesta tag.
É como se ela não existisse.

Andre Martini

  • Newbie
  • *
  • Mensagens: 48
  • Karma: +0/-0
Re:XML dos itens da NFe
« Responder #7 Online: Julho 30, 2015, 06:07:34 pm »
Jaques,

teu XML tem que ficar assim:

<det nItem="1">
<prod>
<cProd>4</cProd>
<cEAN/><xProd>KIT ROLAMENTO DA RODA TRASEIRA ZTL4</xProd>
<NCM>22222222</NCM>
<CFOP>5405</CFOP>
<uCom>KIT</uCom>
<qCom>1</qCom>
<vUnCom>40</vUnCom>
<vProd>40.00</vProd>
<cEANTrib/>
<uTrib>KIT</uTrib>
<qTrib>1</qTrib>
<vUnTrib>40</vUnTrib>
<indTot>1</indTot>
<xPed>19514</xPed>
</prod>
</det>
<det nItem="2">
<prod>
<cProd>93284567</cProd>
<cEAN/><xProd>JG REP AJUSTE AUTOM. 93284567</xProd>
<NCM>87083090</NCM>
<CFOP>5405</CFOP>
<uCom>PC</uCom>
<qCom>1</qCom>
<vUnCom>109</vUnCom>
<vProd>109.00</vProd>
<cEANTrib/>
<uTrib>PC</uTrib>
<qTrib>1</qTrib>
<vUnTrib>109</vUnTrib>
<indTot>1</indTot>
<xPed>19515</xPed>
</prod>
</det>

pelo que vi a função XMLWRITE edita a tag quando existe, então a tag det PRECISA ter o número do item dentro dela se não vai editar e ficar sempre com o último item.

JacquesBica

  • Full Member
  • ***
  • Mensagens: 197
  • Karma: +0/-0
  • Boas cercas fazem bons vizinhos
Re:XML dos itens da NFe
« Responder #8 Online: Julho 30, 2015, 06:27:38 pm »
Pois é.
Está sempre regravando por cima dos anteriores e restando apenas o ultimo.

JacquesBica

  • Full Member
  • ***
  • Mensagens: 197
  • Karma: +0/-0
  • Boas cercas fazem bons vizinhos
Re:XML dos itens da NFe
« Responder #9 Online: Julho 30, 2015, 06:31:17 pm »
AGORA SIM !!!

nContador = 1
FOR EACH ArqNotas ON RegistroSeq WHERE "Registro = " + CadNotas.Registro   
   HReadSeek(CadProdutos,Produto,ArqNotas.Produto)
   
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/@nItem",NoSpace(NumToString(nContador,"2d"))) 
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/cProd", NoSpace(NumToString(ArqNotas.Produto,"13d")))
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/cEAN", NoSpace(CadProdutos.EAN))
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/xProd", CadProdutos.Descricao)
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/CFOP", ArqNotas.Operacao[[1 TO 4]])
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/uCom", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/qCom", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/vUnCom", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/cEANTrib", "")
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/uTrib", CadProdutos.Medida)
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/qTrib", NoSpace(NumToString(ArqNotas.Quantidade,"10d")))
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/vUnTrib", NoSpace(NumToString(ArqNotas.Produto,"12.4f")))   
   XMLWrite("XML","/NFe/infNFe/det[" + nContador + "]/prod/indTot", "1")
   nContador++
END

Grato pelo precioso tempo de todos que ajudaram.
Eu poderia ter feito com XMLAddChild() e XMLAddAttribute(), porem, optei pelo XMLWrite() porque o codigo fica mais "enxuto".