none
VB.net e XML RRS feed

  • Pergunta

  • Então galera estou chegando ao ponto de desistir. A cada solução pinta um problema novo e concluí que não tenho muito tino para lidar com edição leitura e edição XML.

    O Que acontece é o seguinte... No dia a dia, recebo a nota fiscal digital e após importar temos muito trabalho alterando no nosso sistema, campos que já estão na NF digital.

    Por exemplo;
    Trabalhamos com valores de venda contidos no campo <vPmc>, no entanto o sistema lê o campo <vUnTrib>;
    O modelo de vendas (CFOP) é 5405 e a nota vêm com 5403.

    Entao fiz um programa em VB que em suma, altera esses valores e a nota ao ser importada, não requer que o funcionário precise repassar um por um das centenas de itens para corrigi-los manualmente.

    Eu escrevi o seguinte código e esse se provou muito eficiente:

    Private Sub executa() Dim doc As New XmlDocument() doc.Load(txtLocal.Text) ' Cria arrays contendo cada um os valores referentes ao TAG ... Dim NmProdList As XmlNodeList = doc.GetElementsByTagName("xProd") ' Só para ser usado como contador ... Dim CFOPList As XmlNodeList = doc.GetElementsByTagName("CFOP") Dim vPMCList As XmlNodeList = doc.GetElementsByTagName("vPMC") Dim vUnTrib As XmlNodeList = doc.GetElementsByTagName("vUnTrib") Dim i As Integer For i = 0 To NmProdList.Count - 1 ' Altera CFOP para 5405 caso 5403 ... If CFOPList(i).InnerText = "5403" Then CFOPList(i).InnerText = "5405" End If ' Importa PMC para Untrib ... vUnTrib(i).InnerText = vPMCList(i).InnerText Next i End Sub

    Para ler Xml nestes formatos:

    <det nItem="18">
    	<prod>
            	<cEAN>7898414851577</cEAN>
            	<xProd>SEDAVAN XPE INF 100ML LP:N</xProd>
            	<CFOP>5403</CFOP>
            	<uTrib>UN</uTrib>
                   	<vUnTrib>16.2300000000</vUnTrib>
            	<xPed>17995768</xPed>
            	<med>
                    	<vPMC>21.60</vPMC>
            	</med>
            </prod>
    	<imposto>
    		<etc>123</etc>
    	</imposto>
     </det>
    

    Até que descobri que algumas notas vêem sem o campo <med> e consequentemente sem o <vPmc>, o que até não seria problema, pois se o codigo fosse capaz de identificar isso era só não alterar o valor de <vUnTrib>, só que isso acaba dando um baita problema dado que meu código trabalha com listas criadas por For / Next e se um item falta ele copia o do subsequente e "descalibra" a ordem e bagunça tudo ...
    Então a minha nova ideia é que fosse lido da seguinte forma (que acho que seria a correta), tem um tag lá em cima de cada produto assim: <det nItem="xxx"> onde XX é numero do item na NF, então seria possível ler por exemplo aquela tag, trabalhar nos campos dela passar para  a próxima?

    Estou perguntando por que não sei ao certo que código usar e mesmo que use fico com a impressão que vou dar outra brecha para erro.

    ou se vcs tiverem uma forma mais segura para fazer isso funcionar por favor... Estou á uma semana nesse código e cada salto um tombo novo...

    Desde já obrigado!

    quinta-feira, 16 de novembro de 2017 13:34

Respostas

  • Robson, ao invés de dar um GetElementsByTagName em cada elemento cEAN, xProd, etc. usando o objeto doc, capture os elementos det e encontre os elementos filhos a partir de cada det.

    Ex:

    Dim doc As New XmlDocument()
            doc.Load(txtLocal.Text)
    
    
            Dim elemList As XmlNodeList = doc.GetElementsByTagName("det")
    
    Dim ienum as IEnumerator = elemList.GetEnumerator()          
         while (ienum.MoveNext())
            Dim det as XmlNode
            det = CType(ienum.Current, XmlNode)
            
            Dim prod as XmlNode = det.SelectSingleNode("prod")
            Dim med as XmlNode = prod.SelectSingleNode("med")
            If med <> null Then
                ' busca o vPMC
            End If
    
         end while


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 16 de novembro de 2017 14:13

Todas as Respostas

  • Robson, ao invés de dar um GetElementsByTagName em cada elemento cEAN, xProd, etc. usando o objeto doc, capture os elementos det e encontre os elementos filhos a partir de cada det.

    Ex:

    Dim doc As New XmlDocument()
            doc.Load(txtLocal.Text)
    
    
            Dim elemList As XmlNodeList = doc.GetElementsByTagName("det")
    
    Dim ienum as IEnumerator = elemList.GetEnumerator()          
         while (ienum.MoveNext())
            Dim det as XmlNode
            det = CType(ienum.Current, XmlNode)
            
            Dim prod as XmlNode = det.SelectSingleNode("prod")
            Dim med as XmlNode = prod.SelectSingleNode("med")
            If med <> null Then
                ' busca o vPMC
            End If
    
         end while


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 16 de novembro de 2017 14:13
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 22 de novembro de 2017 18:39
    Moderador