Vídeo recomendado
https://youtu.be/diWPPPhW-9E

For Each para Buscar Diferentes dados

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
mathgalvan
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Ter Jun 15, 2021 9:59 am

For Each para Buscar Diferentes dados

Mensagem por mathgalvan »

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


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Avatar do usuário
webmaster
Administrador
Mensagens: 3114
Registrado em: Sex Jul 24, 2009 2:44 pm
Contato:

Re: For Each para Buscar Diferentes dados

Mensagem por webmaster »

Colega,

Pode postar também o XML?


mathgalvan
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Ter Jun 15, 2021 9:59 am

Re: For Each para Buscar Diferentes dados

Mensagem por mathgalvan »

<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)


Avatar do usuário
Mikel Silveira Fraga
Jedi
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

Mensagem por Mikel Silveira Fraga »

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

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
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:

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
Acredito que com essas duas alterações, consiga carregar todos os produtos existentes.

Depois da um retorno se funcionou, ok.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder