Retorno de campo IE do XML

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Retorno de campo IE do XML

Mensagem por gilbertosilverio »

Ola amigos,

Baseado neste exemplo LERDANFE, que esta em dicas, 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.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Re: Retorno de campo IE do XML

Mensagem por billy1943 »

Olá Gilberto,

Para analisar o motivo do erro pelo código fonte apresentado fica bastante complicado.
Em primeiro lugar para se achar o valor ou conteúdo de variáveis contidas em um arquivo .XML, devemos usar os nomes dos campos exatamente iguais como constam nele.

Assim o campo IE Inscrição Estadual aparece duas vezes, uma para o emitente e outra vez para o destinatário.
Nas duas vezes ele aparece assim: <IE>..................</IE>
Somente que no primeiro caso ele aparece depois do fechamento do <enderEmit>, ou seja quando esse grupo é fechado com o </enderEmit>

Já no segundo caso, ele aparece quando é fechado o grupo de endereço do destinatário,com o </enderDest>

Para controlar isso, com a função AT do Clipper ou XHarbour, você não pode simplesmente procurar pelo <IE>, mas basear-se em que grupo você quer encontrá-lo.

Para isso eu criei um pequeno banco de dados padrão .DBF, com os seguintes campos:

Ordem C 3 - uma ordem crescente índice do arquivo
Campo C 20 - aqui vão os nomes exatos dos campos do .XML = ide, serie, nNF, IE, nome, etc.
Nome C 30 - aqui vai a descrição completa do que tem no campo para relatório ou tela
Tipo C 1 - aqui informo C = caracter, N = valor, D = data, B = bloco

Os blocos são importantes, porque permitem separar a "string" total que é o arquivo .XML em blocos menores, onde não há repetição de nomes, como é o caso da IE.
Assim eu faço uso de um campo "fim" quando quero fechar um grupo iniciado pelo tipo "B".
Eu aciono esse banco de dados e vou percorrendo o .XML extraindo o que necessito no processamento.
Alerto que o grupo de produtos pode repetir-se várias vezes, bem como o de duplicatas.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Re: Retorno de campo IE do XML

Mensagem por gilbertosilverio »

Acho que resolvi o problema;

onde estava;
Local FinalDoDado := Iif(cTexto2==Nil,"</"+cProc+">",'</'+cTexto2+'>')
deixei
Local FinalDoDado := Iif(cTexto2==Nil,"</"+cProc+">",'</'+cTexto2)

ai ele retorna o Nº do IE.

Grato.

Gilberto Silverio
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Responder