Baseado neste exemplo LERDANFE, montei esta rotina pra ler os xmls da NFe, so que não consigo trazer o IE do Destinatario, ele sempre retorna 0
dest_IE := PegaDados( [IE] ,Alltrim(Linha1),.f. ) -> sempre retorna 0
Código: Selecionar todos
FUNCTION ABROXML( aArray, nT, nL, nB, nR, aTitulo )
LOCAL nOldCursor, nOldNRow, xRet, nKey:=0, n, o, CI:=0, TE
LOCAL Coluna, nKey1, NroDig:=0, Nome:="", Col:=Ci+14
nOldCursor:=SETCURSOR( 0 ) ; nOldNRow:=nRow ; nRow:=1
DEFAULT nT TO 0
DEFAULT nL TO 0
DEFAULT nB TO MAXROW()
DEFAULT nR TO MAXCOL()
o := TBrowseNew( nT, nL, nB, nR )
o:HeadSep := Chr(196)+Chr(194)+Chr(196)
o:ColSep := " "+Chr(179)+" "
o:colorSpec:= "W+/B,N/BG,B/W,B/BG,B/W,B/BG,R/W,B/R"
o:skipBlock := { |nSkip| nSkip := ASkipTest( aArray, nRow, nSkip ), ;
nRow += nSkip, ;
nSkip ;
}
o:goTopBlock := { || nRow := 1 }
o:goBottomBlock := { || nRow := LEN( aArray ) }
FOR n := 1 TO LEN( aArray[1] )
o:addColumn( TBColumnNew( aTitulo[n], ABrowseBlock( aArray, n )))
NEXT
DO WHILE ( nKey <> K_ESC )
o:forceStable()
nKey := INKEY( 0 )
IF o:stable
DO CASE
CASE ( nKey == K_DOWN )
o:down()
CASE ( nKey == K_UP )
o:up()
CASE ( nKey == K_RIGHT )
o:right()
CASE ( nKey == K_LEFT )
o:left()
CASE ( nKey == K_PGDN )
o:PAGEDOWN()
CASE ( nKey == K_PGUP )
o:PAGEUP()
CASE ( nKey == K_CTRL_HOME )
o:GOTOP()
CASE ( nKey == K_CTRL_END )
o:GOBOTTOM()
CASE ( nKey == K_HOME )
o:HOME()
CASE ( nKey == K_END )
o:END()
CASE ( nKey == K_F2 )
tela:=savescreen()
select(1)
Use c:\temp\Danfe Alias Danfe Exclusive
If Neterr()==.t.
Alertnew('Terminal ja esta em uso ( Recebimento)')
Close All
Return nil
Endif
Index on Id+cProd to c:\temp\danfe
Set index to c:\temp\danfe
o:gotop()
RecuperaDadosXml()
restscreen(,,,,tela)
ENDCASE
ENDIF
ENDDO
SETCURSOR( nOldCursor )
nRow := nOldNRow
RETURN NIL
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>
Function LerXML()
Local Estru := { {'Id' ,'C', 44,0},;
{'ErroJAF' ,'l', 01,0},; //
{'Ocorrenc' ,'C', 20,0},; //
{'CNPJ' ,'C', 14,0},; //
{'nNF' ,'C', 16,0},;
{'cProd' ,'C', 16,0},;
{'xProd' ,'C', 60,0},; // Codigo Interno
{'cEAN' ,'C', 16,0},;
{'qCom' ,'N', 13,3},;
{'vProd' ,'N', 13,2},;
{'vUnCom' ,'N', 11,3},;
{'vIcms' ,'N', 11,3},;
{'vPis' ,'N', 11,3},;
{'vCofins' ,'N', 11,3},;
{'vIpi' ,'N', 11,3},;
{'vCofins' ,'N', 11,3},;
{'vBC' ,'N', 11,3},;
{'vICMS' ,'N', 11,3},;
{'vProd' ,'N', 11,3},;
{'vNF' ,'N', 11,3},;
{'vOutro' ,'N', 11,3},;
{[deCNPJ] ,[c], 14,0},;
{[dexNome] ,[c], 60,0},;
{[dexLgr] ,[c], 60,0},;
{[denro] ,[c], 60,0},;
{[dexBairro] ,[c], 60,0},;
{[decMun] ,[c], 07,0},;
{[dexMun] ,[c], 60,0},;
{[deUF] ,[c], 02,0},;
{[deCEP] ,[c], 04,0},;
{[decPais] ,[c], 60,0},;
{[dexPais] ,[c], 60,0},;
{[defone] ,[c], 10,0},;
{[deIE] ,[c], 14,0},;
{[deCPF] ,[c], 400,0} }
Parameters cFileDanfe
//if !file('c:\temp\Danfe.dbf')
Dbcreate('c:\temp\Danfe.dbf',Estru)
//endif
Use c:\temp\Danfe Alias Danfe Exclusive
If Neterr()==.t.
Alertnew('Terminal ja esta em uso ( Recebimento)')
Close All
Return nil
Endif
Index on Id+cProd to c:\temp\danfe
Set index to c:\temp\danfe
sair()
// Pegando Arquivo na Pasta
mDiretorio := 'C:\DANFE\'
mArquivo := '*.XML'
mListaArq := Directory(mDiretorio+mArquivo,"D")
cLista := {}
For i := 1 to Len(mListaArq)
cNomeForne := PegaNomeArquivo(mDiretorio+mListaArq[i,1])
Aadd( cLista, { cNomeForne, alltrim(mDiretorio)+alltrim( mListaArq[i,1] ) } )
Next
if len(cLista) >0
RE:=1
TITULO:={ [Relacao das Notas Fiscais eletronica ],[arquivo ] }
@ 07,00 SAY PADC("Relacao de XMLs",77) COLOR(COR8)
@ 21,00 SAY PADC("<F2> Importa XML",77) COLOR(COR8)
ABROXML( cLISTA, 08, 00, 20, 77, TITULO )
SETCOLOR(COR12)
@ 07,00 CLEAR TO 24,79
else
sair()
return nil
endif
Return nil
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>
Static Function PegaNomeArquivo(cArq)
Local cFileDanfe := cArq
Local Linha := Memoread(cFileDanfe)
Local nLinhalidas := 0
Local Linhatotal := Len(Linha)
Local cLinhaTxt := Linha
Local m_cNF := PegaDados('nNF' ,Alltrim(Linha),.f. )
Local m_serie := PegaDados('serie' ,Alltrim(Linha),.f. )
Local m_dEmi := PegaDados('dEmi' ,Alltrim(Linha),.f. )
Local m_Razao := PegaDados('xNome' ,Alltrim(Linha),.f. )
cString := "NF:"+m_cNF+' / '+m_serie+" - "+m_Razao+' Emissao '+m_dEmi
Return cString
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>
Function PegaDados(cProc, cLinha, lItem, cTexto2)
Local InicioDoDado := Iif(cTexto2==Nil,"<"+cProc+">" , "<"+cProc )
Local FinalDoDado := Iif(cTexto2==Nil,"</"+cProc+">",'</'+cTexto2+'>')
Local nPosIni := At(InicioDoDado,cLinha)
Local nPosFim := At(FinalDoDado,cLinha)
Local cRet := '0'
If nPosIni==0 .or. nPosFim==0
Return cRet
Endif
cRet := Substr(cLinha,nPosIni+Len(IniciodoDado),nPosFim-nPosIni-Len(FinalDoDado)+1)
If lItem ==.t.
nLinhalidas += nPosFim
Endif
Return ( cRet)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>
function RecuperaDadosXml()
nOPCAO:=1
DO WHILE .T.
cFileDanfe := cLISTA[nOpcao,2]
If cFileDanfe==Nil
Alertnew('Informe o nome do Danfe em xml')
Return nil
Endif
If !file(cFileDanfe)
Alertnew('Arquivo nao Localizado;'+cFileDanfe)
Return nil
Endif
Linha := Memoread(cFileDanfe)
nLinhalidas := 0
Linhatotal := Len(Linha)
cLinhaTxt := Linha
nPos1 := At('Id="',Linha) // identificao arquivo
If nPos1==0
Alertnew('Erro no Arquivo '+cFileDanfe+Chr(10)+;
'Id=')
Return nil
Endif
nPos1 := nPos1+Len('Id="')
cChave:= Substr(Linha,nPos1,47)
nPos1 := At('<CNPJ>',Linha)
If nPos1==0
Alertnew('Erro no Arquivo '+cFileDanfe)
Return nil
Endif
nPos1 := nPos1+Len('<CNPJ>')
cCGCEmit:= Substr(Linha,nPos1,14)
m_cNF := PegaDados('nNF' ,Alltrim(Linha),.f. )
m_serie := PegaDados('serie' ,Alltrim(Linha),.f. )
m_dEmi := PegaDados('dEmi' ,Alltrim(Linha),.f. )
m_Razao := PegaDados('xNome' ,Alltrim(Linha),.f. )
m_cNf := PegaDados('nNF' ,Alltrim(Linha),.f. )
m_vBC := Val(PegaDados('vBC' ,Alltrim(Linha),.f. ))
m_vICMS := Val(PegaDados('vICMS' ,Alltrim(Linha),.f. ))
m_vProd := Val(PegaDados('vProd' ,Alltrim(Linha),.f. ))
m_vNF := Val(PegaDados('vNF' ,Alltrim(Linha),.f. ))
m_vOutro:= Val(PegaDados('vOutro',Alltrim(Linha),.f. ))
cLIDOS1:=[] ; LINHA1:=[]
cLidos1 := PegaDados('dest',Alltrim(cLinhaTxt),.t.,'dest')
Linha1 := cLidos1
dest_CNPJ := PegaDados( [CNPJ] ,Alltrim(Linha1),.f. )
dest_xNome := PegaDados( [xNome] ,Alltrim(Linha1),.f. )
dest_xLgr := PegaDados( [xLgr] ,Alltrim(Linha1),.f. )
dest_nro := PegaDados( [nro] ,Alltrim(Linha1),.f. )
dest_xBairro := PegaDados( [xBairro] ,Alltrim(Linha1),.f. )
dest_cMun := PegaDados( [cMun] ,Alltrim(Linha1),.f. )
dest_xMun := PegaDados( [xMun] ,Alltrim(Linha1),.f. )
dest_UF := PegaDados( [UF] ,Alltrim(Linha1),.f. )
dest_CEP := PegaDados( [CEP] ,Alltrim(Linha1),.f. )
dest_cPais := PegaDados( [cPais] ,Alltrim(Linha1),.f. )
dest_xPais := PegaDados( [xPais] ,Alltrim(Linha1),.f. )
dest_fone := PegaDados( [fone] ,Alltrim(Linha1),.f. )
dest_IE := PegaDados( [IE] ,Alltrim(Linha1),.f. )
linha :=[] ; cLIDOS:=[] ; nsize:=nLinhaLidas:=0
Do While .t.
cLidos := PegaDados('det nItem',Alltrim(cLinhaTxt),.t.,'det' )
Linha := cLidos
If Linha=='0'
Exit
Endif
mxProd := PegaDados('xProd',Alltrim(Linha) ,.f.)
mcprod := PegaDados('cProd',Alltrim(Linha) ,.f.)
mqcom := Val(PegaDados('qCom' ,Alltrim(Linha) ,.f.) )
mvprod := Val(PegaDados('vProd',Alltrim(Linha) ,.f.) )
mcean := PegaDados('cEAN' ,Alltrim(Linha) ,.f.)
mvuncom := val(PegaDados('vuncom' ,Alltrim(Linha) ,.f.) )
mvIcms := val(PegaDados('pICMS' ,Alltrim(Linha) ,.f.) )
mVpis := val(PegaDados('vPIS' ,Alltrim(Linha) ,.f.) )
mVCofins:= val(PegaDados('vCOFINS' ,Alltrim(Linha) ,.f.) )
cPesq := Substr(cChave,4,47)+mcprod
Select(1)
Go top
Seek cPesq
If ! found()
Append Blank
Endif
Repla Danfe->Id With Substr(cChave,4,47)
Repla Danfe->cnpj With cCGcEmit
Repla Danfe->xprod With mxProd
Repla Danfe->cean With mcean
Repla Danfe->cprod With mcprod
Repla Danfe->qcom With mqcom
Repla Danfe->vprod With mvprod
Repla Danfe->vuncom With mvuncom
Repla Danfe->vIcms With mvIcms
Repla Danfe->vPis With mVpis
Repla Danfe->vCofins With mVCofins
Repla Danfe->vBC with m_vBC
Repla Danfe->vICMS with m_vICMS
Repla Danfe->vProd with m_vProd
Repla Danfe->vNF with m_vNF
Repla Danfe->vOutro with m_vOutro
Repla Danfe->deCNPJ With dest_CNPJ
Repla Danfe->dexNome With dest_xNome
Repla Danfe->dexLgr With dest_xLgr
Repla Danfe->denro With dest_nro
Repla Danfe->dexBairro With dest_xBairro
Repla Danfe->decMun With dest_cMun
Repla Danfe->dexMun With dest_xMun
Repla Danfe->deUF With dest_UF
Repla Danfe->deCEP with dest_CEP
Repla Danfe->decPais with dest_cPais
Repla Danfe->dexPais with dest_xPais
Repla Danfe->defone with dest_fone
Repla Danfe->deIE with dest_IE
Repla Danfe->nNF with m_cNf
nSize := Linhatotal-nLinhaLidas
cLinha := Right(cLinhaTxt,nSize)
cLinhaTxt := cLinha
If nLinhaLidas > Linhatotal
Exit
Endif
If nLinhaLidas = Linhatotal
alertba(dest_ie)
exit
Endif
Enddo
nOPCAO++
IF nOPCAO > LEN(cLISTA)
EXIT
ENDIF
ENDDO
return nil
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>
O que estou fazendo errado.
Agradeco a ajuda.
Gilberto Silverio.