LEITURA DE XML

NPROG 12/09/2011 17:02:50
#384008
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
JOAOBENEVIDES 12/09/2011 17:47:57
#384016
Resposta escolhida
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[Ô],
NPROG 12/09/2011 17:50:51
#384018
vlw JOAOBENEVIDES vou aos testes aki!
NPROG 12/09/2011 18:09:44
#384022
vc pode mandar a funcao PegarInfDet ?
NPROG 12/09/2011 18:15:56
#384024
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
Tópico encerrado , respostas não são mais permitidas