Página 1 de 2

Leitura de DANFE ( Xml )

Enviado: 11 Jul 2009 14:19
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.

Re: Leitura de DANFE ( Xml )

Enviado: 12 Jul 2009 01:05
por marcos.gurupi
Parabens pela iniciative/ajuda. Onde eu consegueria um xml desde para fazer testes? Obrigado mais uma vez.


Marcos Roberto.

Re: Leitura de DANFE ( Xml )

Enviado: 27 Nov 2009 05:53
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...

Re: Leitura de DANFE ( Xml )

Enviado: 26 Mai 2010 17:12
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.

Re: Leitura de DANFE ( Xml )

Enviado: 27 Mai 2010 01:43
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.

Re: Leitura de DANFE ( Xml )

Enviado: 18 Jul 2010 15:54
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

Re: Leitura de DANFE ( Xml )

Enviado: 26 Jul 2010 17:00
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.

Re: Leitura de DANFE ( Xml )

Enviado: 28 Jul 2010 08:58
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. )

Re: Leitura de DANFE ( Xml )

Enviado: 28 Jul 2010 09:48
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)

Leitura de DANFE ( Xml )

Enviado: 28 Jul 2010 10:41
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.

Re: Leitura de DANFE ( Xml )

Enviado: 28 Jul 2010 10:52
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

Leitura de DANFE ( Xml )

Enviado: 28 Jul 2010 11:19
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 !

Re: Leitura de DANFE ( Xml )

Enviado: 28 Jul 2010 11:57
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.

Re: Leitura de DANFE ( Xml )

Enviado: 30 Jul 2010 22:16
por marcos.gurupi
Caro Billy, a confirmacao da NFe vc estah fazendo via sistema?

Marcos Roberto.

Re: Leitura de DANFE ( Xml )

Enviado: 01 Ago 2010 11:49
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.