LEITURA DE XML
Eai pessoal blz?
meu 1º post aqui
minha duvida é o seguinte... tenho uma nf-e em xml com seguinte estrutura
<det nItem=[Ô]1[Ô]>
<prod>...</prod>
<imposto>...</imposto>
</det>
<det nItem=[Ô]2[Ô]>
<prod>...</prod>
<imposto>
<ICMS>...</ICMS>
<PIS>...</PIS>
<COFINS>...</COFINS>
</imposto>
</det>
.
.
.
.
entao a tag [Ô]det[Ô] é dada pelo numero de itens da minha nota fical. Tentei acessar estes itens com o seguinte código:
For Each itensNota In infNFe.childNodes
If itensNota.nodeType = NODE_ELEMENT Then
Select Case Trim(itensNota.nodeName)
Case [Ô]det[Ô]
det itensNota.selectSingleNode([Ô]det[Ô])
End Select
End If
Next
com esse código eu consegui percorrer os itens da nota fiscal sem problemas mas quando uso o itensNota.selectSingleNode([Ô]det[Ô]) ele não retorna nada (Nothing).
Alguem poderia me ajuda?
abraços
meu 1º post aqui
minha duvida é o seguinte... tenho uma nf-e em xml com seguinte estrutura
<det nItem=[Ô]1[Ô]>
<prod>...</prod>
<imposto>...</imposto>
</det>
<det nItem=[Ô]2[Ô]>
<prod>...</prod>
<imposto>
<ICMS>...</ICMS>
<PIS>...</PIS>
<COFINS>...</COFINS>
</imposto>
</det>
.
.
.
.
entao a tag [Ô]det[Ô] é dada pelo numero de itens da minha nota fical. Tentei acessar estes itens com o seguinte código:
For Each itensNota In infNFe.childNodes
If itensNota.nodeType = NODE_ELEMENT Then
Select Case Trim(itensNota.nodeName)
Case [Ô]det[Ô]
det itensNota.selectSingleNode([Ô]det[Ô])
End Select
End If
Next
com esse código eu consegui percorrer os itens da nota fiscal sem problemas mas quando uso o itensNota.selectSingleNode([Ô]det[Ô]) ele não retorna nada (Nothing).
Alguem poderia me ajuda?
abraços
cara vou ti dar uma funcao que peguei aqui e é muito boa
num notao esta funcao
Dim prop As String
CommonDialog1.CancelError = True
nArq = [Ô][Ô]
prop = [Ô]Arqs. XML(*.xml)|*.xml|Todos [Ô] & [Ô]Arqs. (*.*)|*.*[Ô]
CommonDialog1.InitDir = [Ô]E:\NotaFiscalEletronica[Ô]
CommonDialog1.Filter = prop
CommonDialog1.FilterIndex = 1
CommonDialog1.Flags = cdlOFNFileMustExist + cdlOFNLongNames + cdlOFNExplorer
[ô]dispara um erro se não for selecionado algo
CommonDialog1.CancelError = True
On Error GoTo SystemError
CommonDialog1.ShowOpen
nArq = CommonDialog1.filename
[ô] FrmMensagem.Show
DoEvents
LerArqNFe (nArq)
[ô] Unload FrmMensagem
Exit Sub
SystemError:
[ô] If Err.Number = 32755 Then Resume Next
[ô] Unload FrmMensagem
If Err.Number = cdlCancel Then
[ô] cancelado pelo usuario.
nArq = [Ô][Ô]
Exit Sub
ElseIf Err.Number <> 0 Then
[ô] erro desconhecido
MsgBox [Ô]Erro [Ô] & Format$(Err.Number) & [Ô] ao selecionar o arquivo.[Ô] & vbCrLf & Err.Description
nArq = [Ô][Ô]
Exit Sub
End If
num modulo
Sub LerArqNFe(nArq1 As String)
[ô] DBOpen ([Ô]Data Source[Ô])
Dim oNode As IXMLDOMNode
Dim oChild1 As IXMLDOMNode
Dim oChild2 As IXMLDOMNode [ô] infNFe
Dim oChild3 As IXMLDOMNode [ô] Principais tag que preciso para pegar as informações da NFe
Dim Xml As DOMDocument
Dim objNodeList As IXMLDOMNodeList
Dim objNode As IXMLDOMNode
Dim nFor As String
Dim rsFor As New ADODB.Recordset
Dim texto As String
[ô] [ô] *** variaveis para verificar se existe esta nota em compra
Dim rsN As New ADODB.Recordset
Dim wSql As String
On Error GoTo SystemError:
bPegaInfo = False
Set Xml = New DOMDocument
Xml.async = False
[ô] If XML.Load([Ô]E:\NotaFiscalEletronica\servimedipi.xml[Ô]) Then
If Xml.Load(nArq1) Then
[ô] *** Tentar pegar o ID e o CNPJ antes de tudo, para fazer a verificação se o distribuidor esta cadastrado
Set objNodeList = Xml.getElementsByTagName([Ô]emit//CNPJ[Ô])
Set objNode = objNodeList.nextNode
nCnpj = [Ô][Ô]
nCnpj = objNode.Text
If Len(Trim(nCnpj)) > 0 Then
[ô] [ô]*** Verifica na tabela Fornecedor se o cnpj esta cadastrado
texto = [Ô]select * from fornecedores where cgc=[Ô] & Aspas(nCnpj)
rsFor.Open texto, de.DB, adOpenStatic
If rsFor.EOF Then
[ô] *** Nao encontrou o cnpj cadastrado
Set objNodeList = Xml.getElementsByTagName([Ô]emit//xNome[Ô])
Set objNode = objNodeList.nextNode
nFor = objNode.Text
If MsgBox([Ô]O fornecedor: [Ô] & nFor & [Ô] CNPJ: [Ô] & nCnpj & [Ô] Não foi encontrado. Deseja cadastra-lo?[Ô], vbQuestion + vbYesNo + vbDefaultButton2, [Ô]Fornecedor não cadstrado[Ô]) = vbYes Then
[ô]
Set objNodeList = Xml.getElementsByTagName([Ô]emit[Ô])
Set objNode = objNodeList.nextNode
CadastrarFornecedor objNode
Else
MsgBox [Ô]Para gravar os produtos desta Nfe, precisa cadastrar o Fornecedor ou arrumar o CNPJ do fornecedor[Ô], vbInformation, [Ô]CNPJ não cadastrado[Ô]
Exit Sub
End If
Else
nCodFor = rsFor([Ô]cod_fornecedor[Ô])
nNomFor = rsFor([Ô]razao_social[Ô])
End If
rsFor.Close
Set rsFor = Nothing
End If
[ô] *** Pega o numero da nota para verificar se ja existe em compra.
Set VB_RESULT = objNode.selectSingleNode([Ô]//nNF[Ô])
sNota = VB_RESULT.Text
If Trim(sNota) <> [Ô][Ô] Then
wSql = [Ô]select * from EntradaNF Where COD_FORNECEDOR =[Ô] & Aspas(nCodFor) & [Ô] And num_nf = [Ô] & Aspas(sNota)
rsN.Open wSql, de.DB, , adLockReadOnly
If Not rsN.EOF Then
MsgBox [Ô]Ja existe uma compra deste fornecedor com este numero de nota[Ô], vbInformation, [Ô]nota encontrada[Ô]
Exit Sub
Else
DeletaRegistro
InsereNota sNota
texto = [Ô]update nfe_entrada set xCodFor=[Ô] & Aspas(nCodFor)
de.DB.Execute texto
End If
rsN.Close
Set rsN = Nothing
End If
[ô]
[ô] db2.BeginTrans
[ô]code to parse xml
For Each oNode In Xml.childNodes [ô] XML - nfeProc
For Each oChild1 In oNode.childNodes
If UCase(oChild1.nodeName) = [Ô]INFNFE[Ô] Then
bPegaInfo = True
[ô] *** Pega a Id da Nfe
If Not PegarID(oChild1) Then
[ô] db2.RollbackTrans
Exit Sub
Else
[ô] If rsNota.State = 1 Then
[ô] Set rsNota = Nothing
[ô] End If
[ô] rsNota.Open [Ô]Select * from NFeIdentificacaoNota[Ô], db2, , adLockOptimistic
[ô] rsNota.AddNew
[ô] rsNota!Id = ID_Nota
End If
For Each oChild2 In oChild1.childNodes
If UCase(oChild2.nodeName) = [Ô]IDE[Ô] Then
[ô] *** Identificação da Nota
PegarInfIde oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]EMIT[Ô] Then
[ô] *** Identificação do Emitente
PegarInfEmit oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]DEST[Ô] Then
[ô] *** Identificação do Destinatario
PegarInfDest oChild3
ElseIf UCase(oChild2.nodeName) = [Ô]DET[Ô] Then
[ô] *** Identificação dos Produtos da Nota
PegarInfDet oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]TOTAL[Ô] Then
[ô] *** Totalizador da Nota
PegarInfTotal oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]COBR[Ô] Then
[ô] *** Valores para Cobrança
PegarInfCobr oChild2
ElseIf UCase(oChild3.nodeName) = [Ô]COMPRA[Ô] Then
[ô] *** Valores para compra
PegarInfCompra oChild3
End If
Next
Else
For Each oChild2 In oChild1.childNodes
[ô] *** Verifico se a Tag é infNFE para começa a pegar as informações daqui
If UCase(oChild2.nodeName) = [Ô]INFNFE[Ô] Then
bPegaInfo = True
[ô] *** Pega a Id da Nfe
If Not PegarID(oChild2) Then
[ô] db2.RollbackTrans
Exit Sub
Else
[ô] If rsNota.State = 1 Then
[ô] Set rsNota = Nothing
[ô] End If
[ô] rsNota.Open [Ô]Select * from NFeIdentificacaoNota[Ô], db2, , adLockOptimistic
[ô] rsNota.AddNew
[ô] rsNota!Id = ID_Nota
End If
For Each oChild3 In oChild2.childNodes
If UCase(oChild3.nodeName) = [Ô]IDE[Ô] Then
[ô] *** Identificação da Nota
PegarInfIde oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]EMIT[Ô] Then
[ô] [ô] *** Identificação do Emitente
PegarInfEmit oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]DEST[Ô] Then
[ô] *** Identificação do Destinatario
PegarInfDest oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]DET[Ô] Then
[ô] *** Identificação dos Produtos da Nota
PegarInfDet oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]TOTAL[Ô] Then
[ô] *** Totalizador da Nota
PegarInfTotal oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]COBR[Ô] Then
[ô] *** Valores para Cobrança
PegarInfCobr oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]COMPRA[Ô] Then
[ô] *** Valores para compra
PegarInfCompra oChild3
End If
Next
End If
Next
End If
Next
Next
[ô] rsNota.Update
[ô] Set rsNota = Nothing
If Not bPegaInfo Then
MsgBox [Ô]Teve um erro ao carregar o arquivo. Favor dar entrada MANUALMENTE!!![Ô], vbInformation, [Ô]Erro ao pegar informações[Ô]
[ô] db2.RollbackTrans
Exit Sub
End If
[ô] ***** Coloca na grid
Importacao = True
PreencheGrid
Else
MsgBox [Ô]Não foi possivel abrir o arquivo escolhido[Ô],
num notao esta funcao
Dim prop As String
CommonDialog1.CancelError = True
nArq = [Ô][Ô]
prop = [Ô]Arqs. XML(*.xml)|*.xml|Todos [Ô] & [Ô]Arqs. (*.*)|*.*[Ô]
CommonDialog1.InitDir = [Ô]E:\NotaFiscalEletronica[Ô]
CommonDialog1.Filter = prop
CommonDialog1.FilterIndex = 1
CommonDialog1.Flags = cdlOFNFileMustExist + cdlOFNLongNames + cdlOFNExplorer
[ô]dispara um erro se não for selecionado algo
CommonDialog1.CancelError = True
On Error GoTo SystemError
CommonDialog1.ShowOpen
nArq = CommonDialog1.filename
[ô] FrmMensagem.Show
DoEvents
LerArqNFe (nArq)
[ô] Unload FrmMensagem
Exit Sub
SystemError:
[ô] If Err.Number = 32755 Then Resume Next
[ô] Unload FrmMensagem
If Err.Number = cdlCancel Then
[ô] cancelado pelo usuario.
nArq = [Ô][Ô]
Exit Sub
ElseIf Err.Number <> 0 Then
[ô] erro desconhecido
MsgBox [Ô]Erro [Ô] & Format$(Err.Number) & [Ô] ao selecionar o arquivo.[Ô] & vbCrLf & Err.Description
nArq = [Ô][Ô]
Exit Sub
End If
num modulo
Sub LerArqNFe(nArq1 As String)
[ô] DBOpen ([Ô]Data Source[Ô])
Dim oNode As IXMLDOMNode
Dim oChild1 As IXMLDOMNode
Dim oChild2 As IXMLDOMNode [ô] infNFe
Dim oChild3 As IXMLDOMNode [ô] Principais tag que preciso para pegar as informações da NFe
Dim Xml As DOMDocument
Dim objNodeList As IXMLDOMNodeList
Dim objNode As IXMLDOMNode
Dim nFor As String
Dim rsFor As New ADODB.Recordset
Dim texto As String
[ô] [ô] *** variaveis para verificar se existe esta nota em compra
Dim rsN As New ADODB.Recordset
Dim wSql As String
On Error GoTo SystemError:
bPegaInfo = False
Set Xml = New DOMDocument
Xml.async = False
[ô] If XML.Load([Ô]E:\NotaFiscalEletronica\servimedipi.xml[Ô]) Then
If Xml.Load(nArq1) Then
[ô] *** Tentar pegar o ID e o CNPJ antes de tudo, para fazer a verificação se o distribuidor esta cadastrado
Set objNodeList = Xml.getElementsByTagName([Ô]emit//CNPJ[Ô])
Set objNode = objNodeList.nextNode
nCnpj = [Ô][Ô]
nCnpj = objNode.Text
If Len(Trim(nCnpj)) > 0 Then
[ô] [ô]*** Verifica na tabela Fornecedor se o cnpj esta cadastrado
texto = [Ô]select * from fornecedores where cgc=[Ô] & Aspas(nCnpj)
rsFor.Open texto, de.DB, adOpenStatic
If rsFor.EOF Then
[ô] *** Nao encontrou o cnpj cadastrado
Set objNodeList = Xml.getElementsByTagName([Ô]emit//xNome[Ô])
Set objNode = objNodeList.nextNode
nFor = objNode.Text
If MsgBox([Ô]O fornecedor: [Ô] & nFor & [Ô] CNPJ: [Ô] & nCnpj & [Ô] Não foi encontrado. Deseja cadastra-lo?[Ô], vbQuestion + vbYesNo + vbDefaultButton2, [Ô]Fornecedor não cadstrado[Ô]) = vbYes Then
[ô]
Set objNodeList = Xml.getElementsByTagName([Ô]emit[Ô])
Set objNode = objNodeList.nextNode
CadastrarFornecedor objNode
Else
MsgBox [Ô]Para gravar os produtos desta Nfe, precisa cadastrar o Fornecedor ou arrumar o CNPJ do fornecedor[Ô], vbInformation, [Ô]CNPJ não cadastrado[Ô]
Exit Sub
End If
Else
nCodFor = rsFor([Ô]cod_fornecedor[Ô])
nNomFor = rsFor([Ô]razao_social[Ô])
End If
rsFor.Close
Set rsFor = Nothing
End If
[ô] *** Pega o numero da nota para verificar se ja existe em compra.
Set VB_RESULT = objNode.selectSingleNode([Ô]//nNF[Ô])
sNota = VB_RESULT.Text
If Trim(sNota) <> [Ô][Ô] Then
wSql = [Ô]select * from EntradaNF Where COD_FORNECEDOR =[Ô] & Aspas(nCodFor) & [Ô] And num_nf = [Ô] & Aspas(sNota)
rsN.Open wSql, de.DB, , adLockReadOnly
If Not rsN.EOF Then
MsgBox [Ô]Ja existe uma compra deste fornecedor com este numero de nota[Ô], vbInformation, [Ô]nota encontrada[Ô]
Exit Sub
Else
DeletaRegistro
InsereNota sNota
texto = [Ô]update nfe_entrada set xCodFor=[Ô] & Aspas(nCodFor)
de.DB.Execute texto
End If
rsN.Close
Set rsN = Nothing
End If
[ô]
[ô] db2.BeginTrans
[ô]code to parse xml
For Each oNode In Xml.childNodes [ô] XML - nfeProc
For Each oChild1 In oNode.childNodes
If UCase(oChild1.nodeName) = [Ô]INFNFE[Ô] Then
bPegaInfo = True
[ô] *** Pega a Id da Nfe
If Not PegarID(oChild1) Then
[ô] db2.RollbackTrans
Exit Sub
Else
[ô] If rsNota.State = 1 Then
[ô] Set rsNota = Nothing
[ô] End If
[ô] rsNota.Open [Ô]Select * from NFeIdentificacaoNota[Ô], db2, , adLockOptimistic
[ô] rsNota.AddNew
[ô] rsNota!Id = ID_Nota
End If
For Each oChild2 In oChild1.childNodes
If UCase(oChild2.nodeName) = [Ô]IDE[Ô] Then
[ô] *** Identificação da Nota
PegarInfIde oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]EMIT[Ô] Then
[ô] *** Identificação do Emitente
PegarInfEmit oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]DEST[Ô] Then
[ô] *** Identificação do Destinatario
PegarInfDest oChild3
ElseIf UCase(oChild2.nodeName) = [Ô]DET[Ô] Then
[ô] *** Identificação dos Produtos da Nota
PegarInfDet oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]TOTAL[Ô] Then
[ô] *** Totalizador da Nota
PegarInfTotal oChild2
ElseIf UCase(oChild2.nodeName) = [Ô]COBR[Ô] Then
[ô] *** Valores para Cobrança
PegarInfCobr oChild2
ElseIf UCase(oChild3.nodeName) = [Ô]COMPRA[Ô] Then
[ô] *** Valores para compra
PegarInfCompra oChild3
End If
Next
Else
For Each oChild2 In oChild1.childNodes
[ô] *** Verifico se a Tag é infNFE para começa a pegar as informações daqui
If UCase(oChild2.nodeName) = [Ô]INFNFE[Ô] Then
bPegaInfo = True
[ô] *** Pega a Id da Nfe
If Not PegarID(oChild2) Then
[ô] db2.RollbackTrans
Exit Sub
Else
[ô] If rsNota.State = 1 Then
[ô] Set rsNota = Nothing
[ô] End If
[ô] rsNota.Open [Ô]Select * from NFeIdentificacaoNota[Ô], db2, , adLockOptimistic
[ô] rsNota.AddNew
[ô] rsNota!Id = ID_Nota
End If
For Each oChild3 In oChild2.childNodes
If UCase(oChild3.nodeName) = [Ô]IDE[Ô] Then
[ô] *** Identificação da Nota
PegarInfIde oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]EMIT[Ô] Then
[ô] [ô] *** Identificação do Emitente
PegarInfEmit oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]DEST[Ô] Then
[ô] *** Identificação do Destinatario
PegarInfDest oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]DET[Ô] Then
[ô] *** Identificação dos Produtos da Nota
PegarInfDet oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]TOTAL[Ô] Then
[ô] *** Totalizador da Nota
PegarInfTotal oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]COBR[Ô] Then
[ô] *** Valores para Cobrança
PegarInfCobr oChild3
ElseIf UCase(oChild3.nodeName) = [Ô]COMPRA[Ô] Then
[ô] *** Valores para compra
PegarInfCompra oChild3
End If
Next
End If
Next
End If
Next
Next
[ô] rsNota.Update
[ô] Set rsNota = Nothing
If Not bPegaInfo Then
MsgBox [Ô]Teve um erro ao carregar o arquivo. Favor dar entrada MANUALMENTE!!![Ô], vbInformation, [Ô]Erro ao pegar informações[Ô]
[ô] db2.RollbackTrans
Exit Sub
End If
[ô] ***** Coloca na grid
Importacao = True
PreencheGrid
Else
MsgBox [Ô]Não foi possivel abrir o arquivo escolhido[Ô],
vlw JOAOBENEVIDES vou aos testes aki!
vc pode mandar a funcao PegarInfDet ?
resolvido
vendo o seu codigo fiz um pequena alteração no meu..
mudei de :
For Each itensNota In infNFe.childNodes
If itensNota.nodeType = NODE_ELEMENT Then
Select Case Trim(itensNota.nodeName)
Case [Ô]det[Ô]
det itensNota.selectSingleNode([Ô]det[Ô])
End Select
End If
Next
para:
For Each itensNota In infNFe.childNodes
If itensNota.nodeType = NODE_ELEMENT Then
Select Case Trim(itensNota.nodeName)
Case [Ô]det[Ô]
det itensNota
End Select
End If
Next
e fiz o tratamento dentro da funcao [Ô]det[Ô].
tudo ok vlww
Fik na paz
vendo o seu codigo fiz um pequena alteração no meu..
mudei de :
For Each itensNota In infNFe.childNodes
If itensNota.nodeType = NODE_ELEMENT Then
Select Case Trim(itensNota.nodeName)
Case [Ô]det[Ô]
det itensNota.selectSingleNode([Ô]det[Ô])
End Select
End If
Next
para:
For Each itensNota In infNFe.childNodes
If itensNota.nodeType = NODE_ELEMENT Then
Select Case Trim(itensNota.nodeName)
Case [Ô]det[Ô]
det itensNota
End Select
End If
Next
e fiz o tratamento dentro da funcao [Ô]det[Ô].
tudo ok vlww
Fik na paz
Tópico encerrado , respostas não são mais permitidas