Leitura de DANFE ( Xml )

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Leitura de DANFE ( Xml )

Mensagem por frazato »

Boa tarde!

Trabalho com sistemas especifico para supermercado onde se lança muita notas fiscais de entradas diariamente, com a obrigatoriedade de muitas empresas terem que fazer o faturamento eletrônico e aproveitando este recurso, desenvolvi uma rotina de leitura e importação de arquivo Xml ( Danfe) para digitação automática de nota de entrada, facilitando e muito a vida dos usuários, visto que e tudo automático, deste de o lançamento da capa até a digitação dos itens.

Ainda o projeto não esta pronto, mais caso alguém faça alguma modificação favor postar para todos.

O processo e bem simples, o usuário pega o Danfe ( Xlm) coloca em uma pasta e executa esta rotina ele ira criar um arquivo danfe.dbf contendo os dados de produtos e fará o lançamento da nota, neste caso existem mais coisa que faz parte de meu sistema de ERP, mais serve como base para leitura.

Segue o fonte para observação.

Frazato
sistema_jaf@hotmail.com
Nota de Moderação:
por Sygecom: Topico movido da sessão xHarbour, por se tratar de uma Dica ou contribuição.
Anexos
lerdanfe.prg
(25.87 KiB) Baixado 2481 vezes
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Leitura de DANFE ( Xml )

Mensagem por marcos.gurupi »

Parabens pela iniciative/ajuda. Onde eu consegueria um xml desde para fazer testes? Obrigado mais uma vez.


Marcos Roberto.
Marcos Roberto
NetService Software
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Leitura de DANFE ( Xml )

Mensagem por rochinha »

Amiguinhos,

Pelo que entendi, voce esta recebendo os arquivos XML correspondentes ao DANFE emitido pelo seu fornecedor. Voce lê estes XML e lança em seu módulo de entrada.

Tempos atrás coloquei um tópico aqui que exemplificava um método de comunicação entre filiais usando como padrão o .XML, apelidei de EDI XML e coloquei como extensão dos arquivos a sigla .EDX.

Eu não coloquei nenhum XML de exemplo pois cada um de nós criou suas tabelas com campos especificos, mas a idéia geral é identica a sua e tenho certeza que as duas se complementarão.

O tópico esta aqui:

EDX - Seus sistemas conversando entre si, facilmente...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
jorgemichael
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 26 Mai 2010 17:09
Localização: De baixo da ponte

Re: Leitura de DANFE ( Xml )

Mensagem por jorgemichael »

Descobri um jeito muito simples de gerar DANFEs e abrir os XMLs de nota fiscal eletrônica: basta utilizar o WebDANFE http://www.webdanfe.com.br/ http://www.webdanfe.com.br/
Nota de Moderação:
por Toledo: Atenção na observação que o Moderador Rochinha fez na mensagem abaixo.
Este fórum não se responsabiliza por qualquer problema que venha ocorrer com as informações contidas nos arquivos XML enviados para o site acima.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Leitura de DANFE ( Xml )

Mensagem por rochinha »

Amiguinhos,

Realmente uma boa contribuição, mesmo que tenha vindo do Ricaço cantor britanico Jorge Michael, pena que após os escandalos ele tenha que morar debaixo da ponte(como está no perfil).

Só fico desconfiado que informações inportantes contidas em nossos XML possam ser enviados para este site e consequentemente ter o uso de tais informações em algum tipo de falcatrua.

Mesmo que ofereça um retorno plausível para os sistemas que não contenham este recurso e mesmo que o site da receita não tenha um recurso de segurança que permita que somente as pessoas ligadas a tal nota eletronica, ou seja, eu posso muito bem angariar todas informações de uma nota eletronica de qualquer empresa ou pessoa no pais.

Enquanto este tipo de segurança não é implementado e quem quizer usar este recurso, não me oponho.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Leitura de DANFE ( Xml )

Mensagem por fladimir »

Frazato vc poderia disponbilizar as seguintes funções presentes em seu PRG q são necessárias:

CAIXATEXTO()
FECHAJANELA()
ALERTA()
CORES()
MSGCONF()
CENTRA()
TRAVA_REG()
DESTRAVA()
PREVIEW()
VOLTAFOCO()

grato e Sucesso!!!

:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
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: Leitura de DANFE ( Xml )

Mensagem por gilbertosilverio »

Ola amigos,

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.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Leitura de DANFE ( Xml )

Mensagem por Pablo César »

dest_IE := PegaDados( [IE] ,Alltrim(Linha1),.f. ) -> sempre retorna 0
Gilberto, o seu 1º argumento está errado, note que você colocou [IE] e que na minha opinião deveria ser tipo caracter segundo a função, eu substituiria por "IE". Verifique se é isso mesmo.

dest_IE := PegaDados( "IE" ,Alltrim(Linha1),.f. )
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
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: Leitura de DANFE ( Xml )

Mensagem por gilbertosilverio »

Pablo,

Grato pela ajuda.

Mais o erro acho que esta na funcão PegaDados()
Ela retorna todos os campos corretamente, so que quando chega em <IE> ela esta retornado nPosIni = 293 e nPosFim = 0, sendo ai que ela retorna o '0' e não o que esta em <IE>

Ja fiz de tudo e não consigo corrigir... to ficando velho... rsrsrsr...

Veja se voce que esta de cabeca fria consegue me ajudar...

Grato.

Gilberto Silverio.

Código: Selecionar todos

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  // aqui que ela aborta... retorna '0'
   Endif
   cRet := Substr(cLinha,nPosIni+Len(IniciodoDado),nPosFim-nPosIni-Len(FinalDoDado)+1)
   If lItem ==.t.
      nLinhalidas  += nPosFim
   Endif
Return(cRet)
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Leitura de DANFE ( Xml )

Mensagem por Pablo César »

Fora isso que mencionei, só pode ser que essa tag esteja com ausência de conteúdo. Daí o jeito é tratar, mesmo. Seria interessante você postar um exemplo do arquivo XML para dar uma olhadinha.

Encontrei esta instrução, não sei se seria o seu caso nem se ela está vigente, mas por vias das dúvidas dê uma olhada:
Manual de Integração – Contribuinte 3.0
#78 coluna Observação :  Informar a  IE quando o destinatário for contribuinto do  ICMS.  Informar ISENTO  quando  o  destinatário  for  contribuinto  do  ICMS, mas  não  estiver  obrigado  à  inscrição  no cadastro  de  contribuintes  do  ICMS.  Não  informar  o  conteúdo  da  TAG  se  o  destinatário  não  for contribuinte do ICMS. 
 
Esta tag aceita apenas: 
‐ausência de conteúdo (<IE></IE> ou <IE/>) para destinatários contribuintes do ICMS, sem caracteres de formatação (ponto, barra, hífen, etc.); 
‐literal “ISENTO” para destinatários contribuintes do ICMS que são isentos de inscrição no cadastro de contribuintes do ICMS; 
Senão for isso, anexe o arquivo XML que está utilizando nos seus testes como exemplo.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
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: Leitura de DANFE ( Xml )

Mensagem por gilbertosilverio »

Pablo,

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.

Este exemplo estou fazendo e pra importar os arquivos xml da NFe... Acho que vai funcionar...

Se voce quiser testar e so pegar os arquivos das NFes geradas.

Grato.

Gilberto Silverio
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Leitura de DANFE ( Xml )

Mensagem por Pablo César »

É realmente esse fecha tag ">" da linha 3, está esquisito. Também reparei mas como eu ainda não mexo com eNF não tive como testar, apenas passei para dar um a forcinha. Mas se você confirma que resolveu... o importante é isso !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
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: Leitura de DANFE ( Xml )

Mensagem por billy1943 »

Agregando mais dicas ao assunto, para quem quiser entrar no estudo de .XML, que é bem mais prático do que arquivos texto com separadores, tipo "pipe" (|), ou outros sem nenhum, como os de transmissão de dados bancários de cobrança, etc., desenvolvi uma aplicação agregada ao meu ERP, com os seguintes arquivos temporários:

1. Nota de entrada
2. Produtos entrados
3. Duplicatas entradas

Uso um arquivo permanente que contém o nome de todos os campos do .XML da NFE para a obtenção do seu conteúdo, se caracter, numérico, data, etc..
Esse arquivo será usado com a função AT, nada mais.

Fluxo:

De posse do .XML recebido do fornecedor, através de tratamento de nomes de arquivos longos (LFN.LIB), acesso os dados confirmando o número da NFe, série e o fornecedor e a partir daí, gravo nos arquivos temporários.
Antes de entrar com os produtos, pela chave de acesso da NFE entro no portal e confirmo a sua existência.
A única intervenção do operador é para informar os códigos de produtos, quando não se usa o EAN para identicá-los na NFE.

No final, estando tudo OK, gravo a NFe de entrada, os ítens e duplicatas com o mínimo de digitações.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Leitura de DANFE ( Xml )

Mensagem por marcos.gurupi »

Caro Billy, a confirmacao da NFe vc estah fazendo via sistema?

Marcos Roberto.
Marcos Roberto
NetService Software
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: Leitura de DANFE ( Xml )

Mensagem por billy1943 »

Ao Marcos Roberto;

A confirmação que eu faço é para saber se os dados que constam no DANFE recebido dos fornecedores, feita com base na chave de acesso (44 caracteres) é feita pelo meu sistema, bem como também a obtenção de todos os dados contidos no .XML (produtos, quantidades, impostos, duplicatas, etc.) tornando a entrada de produtos (compras) altamente confiável e rápida.

Informo os seguintes dados, inicialmente:
- número e série da NFE
- código do fornecedor (esta informação não consta do .XML)
- data de entrada na empresa

Checo esses dados com os apurados no .XML e confirmando o nome do fornecedor acessado com o constante no .XML, evitando troca de fornecedores;

Quando os produtos não tiverem informado o código EAN13 coloco em tela a descrição conforme está na DANFE e solicito a informação do código do produto respectivo. Essa é a parte mais vulnerável, pois pode-se errar na colocação de um produto ao invès de outro.

No mais, a importação é bastante rápida.
Para quem dá entrada em produtos que têm tratamentos fiscais de ICMS diferentes (isentos, tributados, Substituição tributária), IPI com alíquotas diferentes, quantidades vezes unitários que não coincidem, saberá a "mão-na-roda" que o desenvolvimento desta rotina está favorecendo.

A confirmação junto ao SEFAZ é a menor das preocupações, mas como ela é feita instantaneamente pelo sistema na Internet, somente digitando o código de entrada no Portal (4 caracteres) a fazemos de forma corriqueira.

Nem todos os .XML recebidos tem a mesma estrutura pois às vezes são gerados por sistemas diferentes, e assim temos de prestar atenção e as vezes recuperar seu conteúdo com o DEBUG do DOS, para descobrir a existência de caracteres de controle (CR/LF) contidos internamente.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Responder