Boa Tarde. Estou usando essse código para mapear dados das notas fiscais do XML e quando a nota tem mais que 1 produto consegui puxar os produtos contido na nota, porém, não estou conseguindo puxar o valor correto do segundo, terceiro, quarto... produto para ambos vem o valor do primeiro produto. Alguém tem alguma sugestão?
For Each XML In XMLS
NFe.Load (XML)
Set Produtos = NFe.SelectNodes("//xProd")
For Each Produto In Produtos
i = i + 1
With DadosNFe
.Data = Left(NFe.SelectSingleNode("//dhEmi").Text, 10)
.Hora = Mid(NFe.SelectSingleNode("//dhEmi").Text, 12, 8)
.NºNFe = NFe.SelectSingleNode("//nNF").Text
.Série = NFe.SelectSingleNode("//serie").Text
.Posto = NFe.SelectSingleNode("//emit//xNome").Text
On Error Resume Next
.Fantasia = NFe.SelectSingleNode("//emit//xFant").Text
If xFant = "" Then
.Fantasia = ""
End If
.Produto = Produto.Text
.ValorUni = NFe.SelectSingleNode("//vUnCom").Text
.Litros = NFe.SelectSingleNode("//qCom").Text
.ValorTotal = NFe.SelectSingleNode("//vProd").Text
.CFOP = NFe.SelectSingleNode("//CFOP").Text
.NCM = NFe.SelectSingleNode("//NCM").Text
.Informações = NFe.SelectSingleNode("//infCpl").Text
Notas(i) = Array(i, .Data, .Hora, .NºNFe, .Série, .Posto, .Fantasia, .Produto, .ValorUni, .Litros, .ValorTotal, .CFOP, .NCM, .Informações)
End With
Next Produto
Call LimparDadosNFe
Next XML
Vídeo recomendado
https://youtu.be/diWPPPhW-9E
https://youtu.be/diWPPPhW-9E
For Each para Buscar Diferentes dados
-
- Acabou de chegar
- Mensagens: 3
- Registrado em: Ter Jun 15, 2021 9:59 am
-
- Acabou de chegar
- Mensagens: 3
- Registrado em: Ter Jun 15, 2021 9:59 am
Re: For Each para Buscar Diferentes dados
<det nItem="1">
<prod>
<cProd>31562</cProd>
<cEAN>SEM GTIN</cEAN>
<xProd>ARLA 32 A GRANEL</xProd>
<NCM>31021010</NCM>
<CFOP>5102</CFOP>
<uCom>L</uCom>
<qCom>32.0000</qCom>
<vUnCom>1.790000</vUnCom>
<vProd>57.28</vProd>
<cEANTrib>SEM GTIN</cEANTrib>
<uTrib>L</uTrib>
<qTrib>32.0000</qTrib>
<vUnTrib>1.790000</vUnTrib>
<indTot>1</indTot>
</prod>
<imposto>
...
</imposto>
</det>
<det nItem="2">
<prod>
<cProd>6</cProd>
<cEAN>SEM GTIN</cEAN>
<xProd>DIESEL B S-10 COMUM</xProd>
<NCM>27101921</NCM>
<CEST>0600605</CEST>
<indEscala>S</indEscala>
<CFOP>5667</CFOP>
<uCom>L</uCom>
<qCom>340.0100</qCom>
<vUnCom>5.049000</vUnCom>
<vProd>1716.71</vProd>
<cEANTrib>SEM GTIN</cEANTrib>
<uTrib>L</uTrib>
<qTrib>340.0100</qTrib>
<vUnTrib>5.048999</vUnTrib>
<indTot>1</indTot>
Eu gostaria que buscasse os valores correspondentes para cada item, ou seja, para cada linha na planilha, um item (caso tenha no XML)
<prod>
<cProd>31562</cProd>
<cEAN>SEM GTIN</cEAN>
<xProd>ARLA 32 A GRANEL</xProd>
<NCM>31021010</NCM>
<CFOP>5102</CFOP>
<uCom>L</uCom>
<qCom>32.0000</qCom>
<vUnCom>1.790000</vUnCom>
<vProd>57.28</vProd>
<cEANTrib>SEM GTIN</cEANTrib>
<uTrib>L</uTrib>
<qTrib>32.0000</qTrib>
<vUnTrib>1.790000</vUnTrib>
<indTot>1</indTot>
</prod>
<imposto>
...
</imposto>
</det>
<det nItem="2">
<prod>
<cProd>6</cProd>
<cEAN>SEM GTIN</cEAN>
<xProd>DIESEL B S-10 COMUM</xProd>
<NCM>27101921</NCM>
<CEST>0600605</CEST>
<indEscala>S</indEscala>
<CFOP>5667</CFOP>
<uCom>L</uCom>
<qCom>340.0100</qCom>
<vUnCom>5.049000</vUnCom>
<vProd>1716.71</vProd>
<cEANTrib>SEM GTIN</cEANTrib>
<uTrib>L</uTrib>
<qTrib>340.0100</qTrib>
<vUnTrib>5.048999</vUnTrib>
<indTot>1</indTot>
Eu gostaria que buscasse os valores correspondentes para cada item, ou seja, para cada linha na planilha, um item (caso tenha no XML)
- Mikel Silveira Fraga
- Jedi
- Mensagens: 1173
- Registrado em: Sex Mai 27, 2011 3:27 pm
- Localização: Governador Valadares - MG
- Contato:
Re: For Each para Buscar Diferentes dados
mathgalvan, boa tarde.
Vendo sua lógica, você vai precisar fazer ajuste em duas situações:
1º) Atribuição de Produtos
Set Produtos = NFe.SelectNodes("//xProd")
xProd (<xProd>ARLA 32 A GRANEL</xProd>) é o elemento que carrega a descrição do produto. Ele é um elemento final, que possui apenas um Elemento Texto.
Para sua lógica funcionar, o correto seria fazer assim:
Set Produtos = NFe.SelectNodes("//det")
O elemento det, é o Elemento que se repete para cada produto existente na nota, ou seja, é por ele que você vai conseguir navegar entre os produtos.
2º) Retorno dos Dados do Produto
Nessa parte do código, você vai preciar apontar para o Produto em análise, não para o elemento NFe. O código ficaria assim:
Acredito que com essas duas alterações, consiga carregar todos os produtos existentes.
Depois da um retorno se funcionou, ok.
Vendo sua lógica, você vai precisar fazer ajuste em duas situações:
1º) Atribuição de Produtos
Set Produtos = NFe.SelectNodes("//xProd")
xProd (<xProd>ARLA 32 A GRANEL</xProd>) é o elemento que carrega a descrição do produto. Ele é um elemento final, que possui apenas um Elemento Texto.
Para sua lógica funcionar, o correto seria fazer assim:
Set Produtos = NFe.SelectNodes("//det")
O elemento det, é o Elemento que se repete para cada produto existente na nota, ou seja, é por ele que você vai conseguir navegar entre os produtos.
2º) Retorno dos Dados do Produto
Código: Selecionar todos
.Produto = Produto.Text
.ValorUni = NFe.SelectSingleNode("//vUnCom").Text
.Litros = NFe.SelectSingleNode("//qCom").Text
.ValorTotal = NFe.SelectSingleNode("//vProd").Text
.CFOP = NFe.SelectSingleNode("//CFOP").Text
.NCM = NFe.SelectSingleNode("//NCM").Text
.Informações = NFe.SelectSingleNode("//infCpl").Text
Código: Selecionar todos
.Produto = Produto.SelectSingleNode("//xProd").Text
.ValorUni = Produto.SelectSingleNode("//vUnCom").Text
.Litros = Produto.SelectSingleNode("//qCom").Text
.ValorTotal = Produto.SelectSingleNode("//vProd").Text
.CFOP = Produto.SelectSingleNode("//CFOP").Text
.NCM = Produto.SelectSingleNode("//NCM").Text
.Informações = Produto.SelectSingleNode("//infCpl").Text
Depois da um retorno se funcionou, ok.