NFE XML
Pessoal, boa tarde!
Estou com um problema ao criar uma rotina para leitura e importação dos XML das NFe. Resolvi muita coisa já e estou com a rotina quase pronta.
A idéia foi varrer o XML e atribuir campo a campo a um dataset para depois manipulá-lo dentro do software.
Pois bem, o problema agora esta sendo a leitura do XML da NFe. Acredito que esta cabeçalho esta gerando algum problema, pois quando eu tiro ele fora, funciona normalmente a rotina:
[txt-color=#0000f0]
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô] ?>
- <nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] xmlns:ds=[Ô]http://www.w3.org/2000/09/xmldsig#[Ô] xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xsi:schemaLocation=[Ô]http://www.portalfiscal.inf.br/nfe procNFe_v1.10.xsd[Ô] versao=[Ô]1.10[Ô]>
- <NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>
- <infNFe Id=[Ô]NFe35110162367032000187550010000035270078455570[Ô] versao=[Ô]1.10[Ô]>
[/txt-color]
Segue o esqueleto do código:
Dim produtos As XmlDocument = New XmlDocument
Dim nos As XmlNodeList
produtos.Load([Ô]C:
fe.xml[Ô])
nos = produtos.DocumentElement.FirstChild.SelectNodes([Ô]//det[Ô])
For Each A As XmlNode In nos
Next
Caso eu exclua as tags mencionadas acima, a rotina roda normal. Contudo, se eu deixar, o loop será desprezado, ou seja, a variável [Ô]nos[Ô] não esta recebendo a tag <det> como deveria ser.
Por favor, se algum puder ajudar!
Assim que terminar, vou postar a rotina completa para o pessoal.
Valeu moçada!
Estou com um problema ao criar uma rotina para leitura e importação dos XML das NFe. Resolvi muita coisa já e estou com a rotina quase pronta.
A idéia foi varrer o XML e atribuir campo a campo a um dataset para depois manipulá-lo dentro do software.
Pois bem, o problema agora esta sendo a leitura do XML da NFe. Acredito que esta cabeçalho esta gerando algum problema, pois quando eu tiro ele fora, funciona normalmente a rotina:
[txt-color=#0000f0]
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô] ?>
- <nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] xmlns:ds=[Ô]http://www.w3.org/2000/09/xmldsig#[Ô] xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xsi:schemaLocation=[Ô]http://www.portalfiscal.inf.br/nfe procNFe_v1.10.xsd[Ô] versao=[Ô]1.10[Ô]>
- <NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>
- <infNFe Id=[Ô]NFe35110162367032000187550010000035270078455570[Ô] versao=[Ô]1.10[Ô]>
[/txt-color]
Segue o esqueleto do código:
Dim produtos As XmlDocument = New XmlDocument
Dim nos As XmlNodeList
produtos.Load([Ô]C:
fe.xml[Ô])
nos = produtos.DocumentElement.FirstChild.SelectNodes([Ô]//det[Ô])
For Each A As XmlNode In nos
Next
Caso eu exclua as tags mencionadas acima, a rotina roda normal. Contudo, se eu deixar, o loop será desprezado, ou seja, a variável [Ô]nos[Ô] não esta recebendo a tag <det> como deveria ser.
Por favor, se algum puder ajudar!
Assim que terminar, vou postar a rotina completa para o pessoal.
Valeu moçada!
Tenta assim:
nos = produtos.DocumentElement.FirstChild.SelectNodes([Ô]//nfeProc//det[Ô])
nos = produtos.DocumentElement.FirstChild.SelectNodes([Ô]//nfeProc//det[Ô])
Puxa,
Tentei, mas foi sem sucesso..rs!
Estou tentando também, vamos ver se eu consigo.
Grato pela tentativa.
Tentei, mas foi sem sucesso..rs!
Estou tentando também, vamos ver se eu consigo.
Grato pela tentativa.
amigo tenta isso
Function FncProcessarXml(xml As String, TituloArquivo As String, Ixml As Integer, TTXml As Integer) As Boolean
[ô]Precedimentos:
[ô]1 Procurar Nota No sistema
[ô]2 Inserir Nota caso não haja no sistema
[ô]3 Inserir Produtos NO ssitema
[ô]4 Inserir Vencimentos no sistema
[ô]5 Agendar Pagamento dos Boletos no Fluxo
[ô]Lendo o Xml
[ô]Declarações Gerais
Dim oxmlElement As IXMLDOMElement
Dim Emit As String, Dest As String [ô]Cnpj Emissor e Destinatario
Dim QuantPrdNfs As Integer
Dim CodNfs As Long [ô]Numero da Nota
Dim DataEmitNfs As Date [ô]Data de Emissão
Dim TotalNfs As Currency [ô]Total Nota
[ô]--------------------------------------------------------
Dim TtNodeNfs As Integer
Dim nodeindex As Integer
Dim FornXml As String [ô]Nome do Emissor
Dim DestXml As String [ô]Nome do Destinatario
QuantVenc = [Ô]0[Ô]
QuantPrd = [Ô]0[Ô]
[ô]Informando Procedimento com Arquivos Xml
Select Case DLookup([Ô]Procedimentos[Ô], [Ô]Config_Sist[Ô])
Case [Ô]Mover/Processados[Ô]
destino = DLookup([Ô]LocalxmlVerificar[Ô], [Ô]Config_sist[Ô])
Case [Ô]Mover/Retaguarda[Ô]
destino = DLookup([Ô]LocalxmlSistemaRetaguarda[Ô], [Ô]Config_sist[Ô])
End Select
DestinoNp = DLookup([Ô]LocalXmlNProcessados[Ô], [Ô]Config_sist[Ô])
TempInicioArq = Time
[ô]On Error GoTo Trata_Erro
[ô]Inicializando Processo de Leitura
Set xmldoc = New DOMDocument30
xmldoc.async = False
xmldoc.validateOnParse = False
xmldoc.preserveWhiteSpace = False
xmldoc.Load (xml)
[ô]Somando nos Xml
TtNodeNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes.Length - 1
[ô]Dados Principais
For nodeindex = 0 To TtNodeNfs
[ô]Selecionado nos Secundarios
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]ide[Ô]
Dim DataEmitP As String
[ô]Codigo da Nota
CodNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(6).Text [ô]Codigo da Nota
[ô]----------------
[ô]Data da Nota
DataEmitNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(7).Text
[ô]----------------------
Case [Ô]emit[Ô]
[ô]Emissor
Emit = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).FirstChild.Text
FornXml = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(1).Text
Case [Ô]dest[Ô]
[ô]Destinatario
Dest = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(0).Text
DestXml = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(1).Text
Case [Ô]total[Ô]
[ô]TotalNfs
TotalNfs = CCur(Replace(xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).FirstChild.ChildNodes(13).Text, [Ô].[Ô], [Ô],[Ô]) * -1)
End Select
Next
[ô]------------------------------------------------------------------
[ô]Inicializando Verificação
[ô]--------------------------------------------------------------------------------------
[ô]Inicializando Processos Finais de Inserção
[ô]Exigindo Inspeção
Dim Favorecido As Integer
Dim Filial As Integer
Filial = CInt(Nz(DLookup([Ô][Cod][Ô], [Ô]Cad_Filiais[Ô], [Ô][CNPJ]=[ô][Ô] & Dest & [Ô][ô][Ô]), 0))
Dim ImportXml_Filial As Boolean
Dim GeraContasPagarXml As Boolean
Dim GerarContasPgarFluxo As Boolean
Dim Id As Long
Id = 0
[ô]-----------------
ImportXml_Filial = Nz(DLookup([Ô]ImportarXmlNota[Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
GeraContasPagarXml = Nz(DLookup([Ô]ContasPAgarXml[Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
GerarContasPgarFluxo = Nz(DLookup([Ô][gera contasFluxo][Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
[ô]-----------------
[ô]Verificvando se importa o arquivo Xml
Select Case ImportXml_Filial
Case True
Select Case fncinspectnfs(Dest, Emit, DataEmitNfs, CodNfs)
Case True
Id = fncinsertnfs(Dest, Emit, DataEmitNfs, CodNfs, TotalNfs, QuantPrdNfs, TituloArquivo, xml)
[ô]Ececultar Somente se id For Diferente de 0
Select Case Id
Case Is <> [Ô]0[Ô]
[ô]Inserindo Produtos
[ô]Reinicializando
[ô]Inserindo Produto
For nodeindex = 0 To TtNodeNfs
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]det[Ô]
Call fncinsertprodnfs(Id, nodeindex, xml)
End Select
Next
[ô]Atualizando soma de Produtos
CurrentDb.Execute [Ô]UPDATE NotasFiscais SET QuantPrd = [ô][Ô] & QuantPrd & [Ô][ô] WHERE Codigo = [Ô] & Id & [Ô];[Ô]
End Select
Favorecido = DLookup([Ô][Id][Ô], [Ô]Cad_Favorecidos[Ô], [Ô][CNPJ/CPF]=[ô][Ô] & Emit & [Ô][ô][Ô])
[ô]Verificar se insere os Vencimentos
For nodeindex = 0 To TtNodeNfs
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]cobr[Ô]
Call fncinsertVencnfs(Id, nodeindex, xml, GerarContasPgarFluxo, GeraContasPagarXml, DataEmitNfs, Filial, Favorecido, CodNfs)
End Select
Next
CurrentDb.Execute [Ô]UPDATE NotasFiscais SET QuantVenc = [ô][Ô] & QuantVenc & [Ô][ô] WHERE Codigo = [Ô] & Id & [Ô];[Ô]
Case False
Call MoverXml(xml, DestinoNp, True)
[ô]Call ProcdErro(FornXml, TituloArquivo, Emit)
Call NProcess(TituloArquivo, Emit, FornXml, Dest, DestXml, DataEmitNfs, ArqNProcess(MotvNProcess))
End Select
Case False
Call MoverXml(xml, DestinoNp, True)
Call NProcess(TituloArquivo, Emit, FornXml, Dest, DestXml, DataEmitNfs, ArqNProcess([Ô]1[Ô]))
End Select
FncProcessarXml = True
TempFimLeitArqbarra = Time
Exit Function
Trata_Erro:
Call MoverXml(xml, [Ô]F:\Controle farmaceres\Xml\Erro\[Ô], True)
FncProcessarXml = True
TempFimLeitArqbarra = Time
Exit Function
End Function
Qualquer duvida é so perguntar, criei este codigo e utilizo ele sem problemas a um tenpão se precisar tenho algumas outras opções de verificações de xml, entre outras....
Function FncProcessarXml(xml As String, TituloArquivo As String, Ixml As Integer, TTXml As Integer) As Boolean
[ô]Precedimentos:
[ô]1 Procurar Nota No sistema
[ô]2 Inserir Nota caso não haja no sistema
[ô]3 Inserir Produtos NO ssitema
[ô]4 Inserir Vencimentos no sistema
[ô]5 Agendar Pagamento dos Boletos no Fluxo
[ô]Lendo o Xml
[ô]Declarações Gerais
Dim oxmlElement As IXMLDOMElement
Dim Emit As String, Dest As String [ô]Cnpj Emissor e Destinatario
Dim QuantPrdNfs As Integer
Dim CodNfs As Long [ô]Numero da Nota
Dim DataEmitNfs As Date [ô]Data de Emissão
Dim TotalNfs As Currency [ô]Total Nota
[ô]--------------------------------------------------------
Dim TtNodeNfs As Integer
Dim nodeindex As Integer
Dim FornXml As String [ô]Nome do Emissor
Dim DestXml As String [ô]Nome do Destinatario
QuantVenc = [Ô]0[Ô]
QuantPrd = [Ô]0[Ô]
[ô]Informando Procedimento com Arquivos Xml
Select Case DLookup([Ô]Procedimentos[Ô], [Ô]Config_Sist[Ô])
Case [Ô]Mover/Processados[Ô]
destino = DLookup([Ô]LocalxmlVerificar[Ô], [Ô]Config_sist[Ô])
Case [Ô]Mover/Retaguarda[Ô]
destino = DLookup([Ô]LocalxmlSistemaRetaguarda[Ô], [Ô]Config_sist[Ô])
End Select
DestinoNp = DLookup([Ô]LocalXmlNProcessados[Ô], [Ô]Config_sist[Ô])
TempInicioArq = Time
[ô]On Error GoTo Trata_Erro
[ô]Inicializando Processo de Leitura
Set xmldoc = New DOMDocument30
xmldoc.async = False
xmldoc.validateOnParse = False
xmldoc.preserveWhiteSpace = False
xmldoc.Load (xml)
[ô]Somando nos Xml
TtNodeNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes.Length - 1
[ô]Dados Principais
For nodeindex = 0 To TtNodeNfs
[ô]Selecionado nos Secundarios
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]ide[Ô]
Dim DataEmitP As String
[ô]Codigo da Nota
CodNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(6).Text [ô]Codigo da Nota
[ô]----------------
[ô]Data da Nota
DataEmitNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(7).Text
[ô]----------------------
Case [Ô]emit[Ô]
[ô]Emissor
Emit = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).FirstChild.Text
FornXml = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(1).Text
Case [Ô]dest[Ô]
[ô]Destinatario
Dest = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(0).Text
DestXml = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(1).Text
Case [Ô]total[Ô]
[ô]TotalNfs
TotalNfs = CCur(Replace(xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).FirstChild.ChildNodes(13).Text, [Ô].[Ô], [Ô],[Ô]) * -1)
End Select
Next
[ô]------------------------------------------------------------------
[ô]Inicializando Verificação
[ô]--------------------------------------------------------------------------------------
[ô]Inicializando Processos Finais de Inserção
[ô]Exigindo Inspeção
Dim Favorecido As Integer
Dim Filial As Integer
Filial = CInt(Nz(DLookup([Ô][Cod][Ô], [Ô]Cad_Filiais[Ô], [Ô][CNPJ]=[ô][Ô] & Dest & [Ô][ô][Ô]), 0))
Dim ImportXml_Filial As Boolean
Dim GeraContasPagarXml As Boolean
Dim GerarContasPgarFluxo As Boolean
Dim Id As Long
Id = 0
[ô]-----------------
ImportXml_Filial = Nz(DLookup([Ô]ImportarXmlNota[Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
GeraContasPagarXml = Nz(DLookup([Ô]ContasPAgarXml[Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
GerarContasPgarFluxo = Nz(DLookup([Ô][gera contasFluxo][Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
[ô]-----------------
[ô]Verificvando se importa o arquivo Xml
Select Case ImportXml_Filial
Case True
Select Case fncinspectnfs(Dest, Emit, DataEmitNfs, CodNfs)
Case True
Id = fncinsertnfs(Dest, Emit, DataEmitNfs, CodNfs, TotalNfs, QuantPrdNfs, TituloArquivo, xml)
[ô]Ececultar Somente se id For Diferente de 0
Select Case Id
Case Is <> [Ô]0[Ô]
[ô]Inserindo Produtos
[ô]Reinicializando
[ô]Inserindo Produto
For nodeindex = 0 To TtNodeNfs
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]det[Ô]
Call fncinsertprodnfs(Id, nodeindex, xml)
End Select
Next
[ô]Atualizando soma de Produtos
CurrentDb.Execute [Ô]UPDATE NotasFiscais SET QuantPrd = [ô][Ô] & QuantPrd & [Ô][ô] WHERE Codigo = [Ô] & Id & [Ô];[Ô]
End Select
Favorecido = DLookup([Ô][Id][Ô], [Ô]Cad_Favorecidos[Ô], [Ô][CNPJ/CPF]=[ô][Ô] & Emit & [Ô][ô][Ô])
[ô]Verificar se insere os Vencimentos
For nodeindex = 0 To TtNodeNfs
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]cobr[Ô]
Call fncinsertVencnfs(Id, nodeindex, xml, GerarContasPgarFluxo, GeraContasPagarXml, DataEmitNfs, Filial, Favorecido, CodNfs)
End Select
Next
CurrentDb.Execute [Ô]UPDATE NotasFiscais SET QuantVenc = [ô][Ô] & QuantVenc & [Ô][ô] WHERE Codigo = [Ô] & Id & [Ô];[Ô]
Case False
Call MoverXml(xml, DestinoNp, True)
[ô]Call ProcdErro(FornXml, TituloArquivo, Emit)
Call NProcess(TituloArquivo, Emit, FornXml, Dest, DestXml, DataEmitNfs, ArqNProcess(MotvNProcess))
End Select
Case False
Call MoverXml(xml, DestinoNp, True)
Call NProcess(TituloArquivo, Emit, FornXml, Dest, DestXml, DataEmitNfs, ArqNProcess([Ô]1[Ô]))
End Select
FncProcessarXml = True
TempFimLeitArqbarra = Time
Exit Function
Trata_Erro:
Call MoverXml(xml, [Ô]F:\Controle farmaceres\Xml\Erro\[Ô], True)
FncProcessarXml = True
TempFimLeitArqbarra = Time
Exit Function
End Function
Qualquer duvida é so perguntar, criei este codigo e utilizo ele sem problemas a um tenpão se precisar tenho algumas outras opções de verificações de xml, entre outras....
Cara, muito obrigado!
Vou ler com calma sua rotina, parece realmente muito completa.
Contudo, estou com a minha praticamente finalizada, aguardando apenas resolver esse problema.
Além disso, estou realmente curioso para entender o porque da XmlDocument não lê a tag <NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>
Vou deixar sua ajuda na manga, afinal, se não for por bem, vai por banco...rs
Abraço,
Valeu!
Vou ler com calma sua rotina, parece realmente muito completa.
Contudo, estou com a minha praticamente finalizada, aguardando apenas resolver esse problema.
Além disso, estou realmente curioso para entender o porque da XmlDocument não lê a tag <NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>
Vou deixar sua ajuda na manga, afinal, se não for por bem, vai por banco...rs
Abraço,
Valeu!
Cara tenho quase certeza que o seu probela esta neste caractere: - <nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] xmlns:ds=[Ô]http://www.w3.org/2000/09/xmldsig#[Ô] xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xsi:schemaLocation=[Ô]http://www.portalfiscal.inf.br/nfe procNFe_v1.10.xsd[Ô] versao=[Ô]1.10[Ô]>
ta vendo o caracete # este se não me engando da erro na leitura do arquivo. Em notas fiscais eletronicas somos acostumados a evitar estes tipos de caracteres especiais. tenta arrancar ele e ve se le?
ta vendo o caracete # este se não me engando da erro na leitura do arquivo. Em notas fiscais eletronicas somos acostumados a evitar estes tipos de caracteres especiais. tenta arrancar ele e ve se le?
Olá pessoal,
Pois bem, infelizmente não funcionou a dica do JuniorRJ10 tendo em vista que testei em vários XML de NFe distintos.
Não usei o loadxml, contudo, até onde eu sei, essa rotina é utlizada quando a string passada para o loadxml forem as próprias tags do XML, isto é, o XML em si.
Acho que o caminho é desvendar melhor o funcionamento do XMLdocument, posto que utilizando o DOMdocument, a leitura funciona normamente.
Valeu por enquanto pessoal!
Vamos a luta!
Abraço
Pois bem, infelizmente não funcionou a dica do JuniorRJ10 tendo em vista que testei em vários XML de NFe distintos.
Não usei o loadxml, contudo, até onde eu sei, essa rotina é utlizada quando a string passada para o loadxml forem as próprias tags do XML, isto é, o XML em si.
Acho que o caminho é desvendar melhor o funcionamento do XMLdocument, posto que utilizando o DOMdocument, a leitura funciona normamente.
Valeu por enquanto pessoal!
Vamos a luta!
Abraço
Pelo que vi, os nós que dão erro estão no começo do XML.
Se você não precisa exibir estas linhas, tenta fazer o loop começar depois destas linhas.
exemplo:
Bom, a idéia é essa.
eu to sem o VB aqui pra testar, mas a idéia é fazer o programa começar o loop depois destas linhas
(se você não precisar delas é claro)
Se você não precisa exibir estas linhas, tenta fazer o loop começar depois destas linhas.
exemplo:
For A = 5 To nos.count - 1
Next
Bom, a idéia é essa.
eu to sem o VB aqui pra testar, mas a idéia é fazer o programa começar o loop depois destas linhas
(se você não precisar delas é claro)
ETTORE, fiz uma dll que le todo xml
Tópico encerrado , respostas não são mais permitidas