Ler XML de notas de entradas

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ler XML de notas de entradas

Mensagem por Itamar M. Lins Jr. »

Ô sujeito!!!
Estude o código.
Tem um DO WHILE!!!
append que é a função incluir() ...

Eu já fiz aqui e está funcionando.

As TAGS não são unicas p/ quase nada todas tem um tanto de repetição, não apenas p/ <pCOFINS> mas / valores, descontos, etc...
Não é para pegar a TAG única porque não existe ela nos produtos. Só no final tem ela no campo TOTAIS.

É a mesma coisa que indexar por ordem de produtos! NODE(<det>)

Código: Selecionar todos

     oDet := oXML:findfirst( "det" ) //pare na primeira incidência! Tags <cProd> ... <pCONFINS> ... etc... são várias!!!
Achar o cabeçalho(node) com os totais da NFe

Código: Selecionar todos

      oTotal := oXML:findfirst( "total" ) //Pare no campo totais //Pegar total base calculo, Frete, COFINS, IPI, etc ... Aqui é o total de cada campo.
Código atualizado. Quem usa Hwgui copiar e colar! (basta trocar os nomes no DBF) é fácil entender.

Código: Selecionar todos

***********************
Function LerDANFE(oDlg)
***********************
*
*
LOCAL cStr, oNFe, cDirXML, cArq, oDlgDanfe, cTitulo := "Importar NFe", lOk := .F., lDuplicatas:=.T.
LOCAL cUF:="", dEmi:=CToD(""), dSaiEnt := CToD(""), cEAN
PREPARE FONT oFont NAME "Verdana" WIDTH 0 HEIGHT -18

INIT DIALOG oDlgDanfe CLIPPER TITLE cTitulo Font oFont AT 0,0 SIZE 380,150 STYLE DS_CENTER + WS_SYSMENU ;
On Exit {||.t. }

dRecebido := date()

@ 005,035 Say "Recebimento:" size 130,20
@ 140,030 get oRecebido Var dRecebido size 100,30

@ 005,090 get CheckBox lDuplicatas  Caption  'Lançar duplicatas.' size 250,20

@ 270,020 Button oBt Caption 'Cancelar'   Size 100,30  ON CLICK {||hwg_EndDialog()}
@ 270,070 Button oBt Caption 'Confirmar'  Size 100,30  ON CLICK {||lOk:=.t.,hwg_EndDialog()}

oDlgDanfe:Activate()

IF !lOk
   Return .t.
ENDIF

If en->(dbseek('DIR'+'DANFE'))
   cDirDanfe := alltrim(en->dados)
Else
   cDirDanfe := 'c:\master\danfe\'
EndIf

   cArq := HWG_SelectFile( "Arquivos XML ( *.xml )", "*.xml", cDirDanfe )

   cStr := hb_MemoRead( cArq )

   DirChange( cPasta )

   IF Empty( cStr )
      hwg_Msginfo("Não achou o arquivo XML")
      RETURN
   ENDIF

   oXML := TXMLDocument():New( cStr, HBXML_STYLE_NOESCAPE )
   IF oXML:nError != HBXML_ERROR_NONE
      hwg_Msgstop( "xml com problema " + Str( oXML:nError ) )
      RETURN
   ENDIF

   oNFe := oXML:findfirst( "infNFe" )
   IF oNFe == NIL
      hwg_Msgstop( "TAG infNFe não localizada." )
      RETURN
   ENDIF

      oIde := oXML:findfirst( "ide" )
      IF oIde == NIL
         hwg_Msgstop( "TAG ide não localizada." )
         RETURN
      ENDIF

      oIterator := TXmlIterator():New( oIde )

      DO WHILE .T.

         oCurrent := oIterator:Next()
         IF oCurrent == NIL
            //hwg_Msginfo("Fim da Leitura da oIDE ")
            Exit
         ELSE
            //hwg_Msginfo("Tag Atual: " + oCurrent:cName) //? "current tag : " + oCurrent:cName
            IF oCurrent:cName == "cUF"
               cUF := oCurrent:cData
            ELSEIF oCurrent:cName == "nNF"
               cNF := oCurrent:cData
            ELSEIF oCurrent:cName == "serie"
               cSerie := oCurrent:cData
            ELSEIF oCurrent:cName $ "dEmi dhEmi"
               dEmi := hb_stod( strtran(oCurrent:cData,"-","") )
            //ELSEIF oCurrent:cName == "dSaiEnt"
            //   dSaiEnt := hb_stod( strtran(oCurrent:cData,"-","") )
            ENDIF
         ENDIF

      ENDDO

      If Empty(cNF)
          hwg_Msgstop("DANFE com problema."+hb_eol()+"Número da NFe, não informado.")
          Return
      EndIf
      If Empty(dEmi)
          hwg_Msgstop("DANFE com problema."+hb_eol()+"DATA da emissão, não informada.")
          Return
      EndIf

      oEmit := oXML:findfirst( "emit" )
      IF oEmit == NIL
         hwg_Msgstop( "TAG emit não localizada." )
         RETURN
      ENDIF

      oIterator := TXmlIterator():New( oEmit )
      cCNPJ   := ""
      cFone   := ""      
      dSaiEnt := date()

      DO WHILE .T.

         oCurrent := oIterator:Next()
         IF oCurrent == NIL
            //hwg_Msginfo("Fim da Leitura da oEmit ")
            EXIT
         ELSE
            //hwg_Msginfo("Tag Atual: " + oCurrent:cName) //? "current tag : " + oCurrent:cName
            IF oCurrent:cName == "CNPJ"
               cCNPJ := oCurrent:cData
            ELSEIF oCurrent:cName == "xNome"
               cNome := oCurrent:cData
            ELSEIF oCurrent:cName == "xLgr"
               xLgr := oCurrent:cData
            ELSEIF oCurrent:cName == "nro"
               cNRO := oCurrent:cData
            ELSEIF oCurrent:cName == "xBairro"
               xBairro := oCurrent:cData
            ELSEIF oCurrent:cName == "xMun"
               xMun := oCurrent:cData
            ELSEIF oCurrent:cName == "UF"
               cUF := oCurrent:cData
            ELSEIF oCurrent:cName == "CEP"
               cCEP := oCurrent:cData
            ELSEIF oCurrent:cName == "fone"
               cFone := oCurrent:cData
            ELSEIF oCurrent:cName == "IE"
               cIE := oCurrent:cData
            ENDIF
         ENDIF

      ENDDO
      
      fo->(OrdSetFocus(3)) //CNPJ      
      If fo->(DbSeek(cCNPJ))
         cCodFor := fo->cod_fornec
         er->(ordSetFocus(1))
         IF er->( dbSeek(strzero(val(cNF),9)+cCodFor+dtos(dRecebido)) )
            hwg_MsgStop("NFe já cadastrada !")
            RETURN .F.
         ENDIF
      ELSE
         cCodFor := ""
      ENDIF
      
      er->(ordSetFocus(6)) //dtos(es_datarec)
        
      If empty(cCNPJ)
         cCNPJ := "SEM CNPJ"
      EndIf
      //Novo fornecedor
      If Empty(cCodFor)
          fo->(OrdSetFocus(1))
          fo->(DbGoBottom()) 
          nPos   := hb_At( SubStr(fo->cod_fornec,1,1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ" )
          cLetra := SubStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",nPos+1,1)
          IF SubStr(fo->cod_fornec,2,3) == "999" 
             cCodFor := cLetra + "001"   
          Else
             cCodFor := cLetra + strzero(val(substr(fo->cod_fornec,2,3))+1,3)
          Endif
             
          incluir('fo')
          fo->cod_fornec := cCodFor
          fo->cgc        := cCNPJ
          fo->fornecedor := cNome
          fo->endereco   := alltrim(xLgr) + ", " + cNRO
          fo->bairro     := xBairro
          fo->cidade     := xMun
          fo->uf         := cUF
          fo->cep        := cCEP
          fo->telefone   := cFone
          fo->insc_estad := cIE
      EndIF

         Incluir('er')
         er->cod_fornec := cCodFor
         er->fornecedor := cNome
         er->cnpj       := cCNPJ
         er->cfop       := ""
         er->es_numero  := strzero(val(cNF),9)
         er->es_modelo  := 55
         er->es_serie   := cSerie
         er->es_subseri := ""
         er->es_dataemi := dEmi
         er->es_datarec := dRecebido //dSaiEnt
         er->es_situaca :=  "N"
         er->es_codfisc := "1"
         er->loja       := "001"
         er->es_emitent := "T"
         er->DifNF      := 0
         er->es_emitent := 'T'
         
      oDet := oXML:findfirst( "det" )
      IF oDet == NIL
         hwg_Msgstop( "TAG det não localizada." )
         RETURN
      ENDIF
      nItem := 0
      cd->(ordSetFocus(1))
      cd->(OrdScope(0,NIL))
      cd->(OrdScope(1,NIL))

      Do While .T.

         oIterator := TXmlIterator():New( oDet )
         nIPI := nPIS := nCOFINS := 0
         cEAN := ""
         DO WHILE .T.

            oCurrent := oIterator:Next()

            IF oCurrent == NIL
               EXIT
            ELSE

               IF oCurrent:cName == "cProd"
                  cProd := oCurrent:cData
               ELSEIF oCurrent:cName == "xProd"
                  xProd := AllTrim(charone(" ",oCurrent:cData))
               ELSEIF oCurrent:cName == "NCM"
                  cNCM := oCurrent:cData
               ELSEIF oCurrent:cName == "CFOP"
                  cCFOP := oCurrent:cData
               ELSEIF oCurrent:cName == "uCom"
                  uCom := oCurrent:cData
               ELSEIF oCurrent:cName == "qCom"
                  qCom := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vUnTrib"
                  nUnTrib := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "pIPI"
                  nIPI := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "pCOFINS"
                  nCOFINS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "pPIS"
                  nPIS := val(oCurrent:cData)                  
               ELSEIF oCurrent:cName == "vDesc"
                  nDesconto := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "cEAN"
                   IF hb_IsChar(oCurrent:cData)
                      cEAN := AllTrim(oCurrent:cData)
                   ENDIF
               ENDIF
            ENDIF

         ENDDO
         //Verifica se a mercadoria já foi comprada deste fornecedor
         cCodMerc := ""
         nMargem  := nImpFed :=0
         IF cd->(DbSeek(cCNPJ+cProd))
            IF !empty(cd->codigosis)
               cCodMerc := cd->codigosis
               If eq->(DbSeek(cCodMerc))
                  nMargem := eq->margem
                  nImpFed := eq->imposto
                  xProd   := eq->mercadoria
               EndIf
            ENDIF
            If Empty(cd->descricao)
               TravaRegistro('cd')
               cd->descricao := xProd
            EndIf
         ELSE
            incluir('cd')
            cd->cnpj      := cCNPJ
            cd->codigonfe := cProd
            cd->descricao := xProd
         ENDIF

         IF cCFOP == "5405"
            cCFOP := "1403"
         ELSEIF cCFOP == "6405"
            cCFOP := "2403"
         ELSEIF cCFOP == "5403"
            cCFOP := "1403"
         ELSEIF cCFOP == "6403"
            cCFOP := "2403"
         ELSEIF cCFOP == "5102"
            cCFOP := "1102"
         ELSEIF cCFOP == "6102"
            cCFOP := "2102"
         ELSEIF cCFOP == "5905"
            cCFOP := "1905"
         ELSEIF cCFOP == "6905"
            cCFOP := "2905"
         ELSEIF cCFOP == "5101"
            cCFOP := "1102"
         ELSEIF cCFOP == "6101"
            cCFOP := "2102"
         ENDIF

         nItem ++
         incluir('et')
         et->nf_entrada := strzero(val(cNF),9)
         et->cod_fornec := cCodFor
         et->data       := dRecebido //dSaiEnt
         et->cfop       := cCFOP
         et->cprod      := cProd
         et->cod_mercad := cCodMerc
         et->mercadoria := xProd
         et->quantidade := qCom
         et->item       := nItem
         et->valor_unit := nUnTrib
         et->ncm        := cNCM
         et->descfreace := nDesconto
         et->icms_credi := 0
         et->ipi        := nIPI
         et->pis        := nPIS
         et->cofins     := nCOFINS
         et->frete      := 0
         et->lucro      := nMargem
         et->gastos     := 0
         et->i_f        := nImpFed
         et->icms_debit := 0
         et->comissao   := 0
         et->local      := 0
         et->etiquetas  := qCom
         et->ean        := cEAN
         
         If !nc->(DbSeek(cNCM))
            incluir('nc')
            nc->cod_ncm := cNCM
         EndIf

         oDet := oXML:findnext( "det" )
         If oDet == NIL
            exit
         EndIf

      EndDo
      NetFlush('nc')
      NetFlush('et')
      NetFlush('cd')
      cd->(ordSetFocus(1))
      cd->(OrdScope(0,cCNPJ))
      cd->(OrdScope(1,cCNPJ))

      oTotal := oXML:findfirst( "total" )
      IF oTotal == NIL
         hwg_Msgstop( "TAG total não localizada." )
         RETURN
      ENDIF

        //Store 0.00 to nNF, nBC, nICMS, nST, nProd, nFrete, nSeg, nDesc, nIsento, nIPI, nOutro
        oIterator := TXmlIterator():New( oTotal )

        DO WHILE .T.

            oCurrent := oIterator:Next()

            IF oCurrent == NIL
               EXIT
            ELSE

               IF oCurrent:cName == "vBC"
                  nBC := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vICMS"
                  nICMS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vST"
                  nST := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vProd"
                  nProd := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vFrete"
                  nFrete := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vSeg"
                  nSeg := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vDesc"
                  nDesc := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vII"
                  nIsento := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vIPI"
                  nIPI := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vPIS"
                  nPIS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vCOFINS"
                  nCOFINS := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vOutro"
                  nOutDespAce := val(oCurrent:cData)
               ELSEIF oCurrent:cName == "vNF"
                  nNF := val(oCurrent:cData)

               ENDIF
            ENDIF

         ENDDO
             //hwg_Msginfo(str(nOutDespAce))
              Travaregistro('er')
              er->es_valorto := nNF
              er->es_baseicm := nBC
              er->es_valicms := nICMS
              er->es_isenta  := nISento
              er->es_outras  := nST //nOutro
              er->desconto   := nDesc
              er->es_totprod := nProd
              er->es_frete   := nFrete
              er->es_ipi     := nIPI
              er->es_aliquot := 0 //nST
              er->outdespace := nOutDespAce
              er->cofins     := nCOFINS
              er->pis        := nPIS 
              NetFlush('er')

        //Contas a pagar 
        /*
        oFat := oXML:findfirst( "fat" )
        IF oFat == NIL
           hwg_Msgstop( "TAG fat não localizada." )
        Else
            oIterator := TXmlIterator():New( oFat )

            DO WHILE .T.

               oCurrent := oIterator:Next()
               IF oCurrent == NIL
                  EXIT
               Else
                  IF oCurrent:cName == "nFat"
                     cFat := val(oCurrent:cData)
                  EndIf
               EndIf

            ENDDO

        ENDIF
        */
   If lDuplicatas
      oDup := oXML:findfirst( "dup" )
      IF oDup == NIL
           hwg_Msgstop( "TAG dup não localizada." + hb_eol() + "Não houve lançamentos no contas a pagar." )
      Else
         Do While .t.

            oIterator := TXmlIterator():New( oDup )

               DO WHILE .T.

                  oCurrent := oIterator:Next()

                  IF oCurrent == NIL
                     EXIT
                  ELSE
                     IF oCurrent:cName == "nDup"
                        cDup := oCurrent:cData
                     ELSEIF oCurrent:cName == "dVenc"
                        dVenc := hb_stod( strtran(oCurrent:cData,"-","") )
                     ELSEIF oCurrent:cName == "vDup"
                        nDup := val(oCurrent:cData)
                     ENDIF

                  ENDIF
               EndDo

               incluir('pa')
               pa->nf_compra  := strzero(val(cNF),9)
               pa->cod_fornec := cCodFor
               pa->fornecedor := cNome
               pa->duplicata  := cDup
               pa->data_vcto  := dVenc
               pa->valor      := nDup
               pa->data_emis  := dEmi
               pa->loja       := "001"

               oDup := oXML:findnext( "dup" )
               If oDup == NIL
                  exit
               EndIf

         EndDo

         NetFlush('pa')

      EndIf
   EndIf

  oXML := NIL

et->(ordSetFocus(1))
et->(OrdScope(0,er->es_numero+er->cod_fornec+dtos(er->es_datarec) ))
et->(OrdScope(1,er->es_numero+er->cod_fornec+dtos(er->es_datarec) ))
et->(DbGoTop())

pa->(ordSetFocus(5))
pa->(OrdScope(0,er->cod_fornec) )
pa->(OrdScope(1,er->cod_fornec) )
pa->(DbGoBottom())

oDlg:oBrw:Refresh()
oDlg:oTab:oBrPd:Refresh()
oDlg:oTab:oBrwDP:Refresh()

IF hwg_MsgYesNo("DANFE Importado. Deseja Apagar o XML ?")
    FErase( cArq )
ENDIF
   
RETURN .t.


Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

Ler XML de notas de entradas

Mensagem por jairfab »

Janio, seguindo a logica basta acrescentar algo deste tipo:

Código: Selecionar todos

FUNCTION ITENS(oDoc)

LOCAL oNode, nPos, oIterator, oCurrent

oNode:= oDoc:FindFirst( "det" )

WHILE !( oNode == Nil )

   // Processa oNode (itens da nf) 
   oIterator := TXmlIterator():New( oNode )
   oCurrent:= oIterator:Next()
   WHILE !( oCurrent == Nil )
      
      IF oCurrent:cName == "prod"
         
         nDepth:= oIterator:getNode():depth()
         
         WHILE .t.
            oCurrent := oIterator:Next()
            IF oCurrent == Nil .or. oCurrent:depth() <= nDepth
               EXIT
            ENDIF  
            IF oCurrent:cName == "cProd"
               cProd:= oCurrent:cData
            ELSEIF oCurrent:cName == "cEAN"
               cEAN:= oCurrent:cData
            ELSEIF oCurrent:cName == "xProd"
               xProd:= oCurrent:cData
            ELSEIF oCurrent:cName == "NCM"
               NCM:= oCurrent:cData
            ENDIF
         ENDDO
         
      ELSEIF oCurrent:cName == "imposto"
      
         oCurrent:= oIterator:Next()
         WHILE !( oCurrent == Nil )
            
            IF oCurrent:cName == "ICMS"

                nDepth:= oIterator:getNode():depth()
                
                WHILE .t.
                   oCurrent := oIterator:Next()
                   IF oCurrent == Nil .or. oCurrent:depth() <= nDepth
                      EXIT
                   ENDIF  
                   IF oCurrent:cName == "orig"
                      ICMS_orig       := oCurrent:cData
                   ELSEIF oCurrent:cName == "CST"
                      ICMS_CST        := oCurrent:cData
                   ELSEIF oCurrent:cName == "vBC"
                      ICMS_vBC        := oCurrent:cData
                   ELSEIF oCurrent:cName == "pICMS"
                      ICMS_pICMS      := oCurrent:cData
                   ELSEIF oCurrent:cName == "vICMS"
                      ICMS_vICMS      := oCurrent:cData
                   ENDIF
                ENDDO


            ELSEIF oCurrent:cName == "PIS"

                nDepth:= oIterator:getNode():depth()
                
                WHILE .t.
                   oCurrent := oIterator:Next()
                   IF oCurrent == Nil .or. oCurrent:depth() <= nDepth
                      EXIT
                   ENDIF  
                   IF oCurrent:cName == "CST"      
                      PIS_CST      := oCurrent:cData
                   ELSEIF oCurrent:cName == "vBC"      
                      PIS_vBC      := oCurrent:cData          
                   ELSEIF oCurrent:cName == "pPIS"     
                      PIS_pPIS     := oCurrent:cData          
                   ELSEIF oCurrent:cName == "vPIS"     
                      PIS_vPIS     := oCurrent:cData          
                   ELSEIF oCurrent:cName == "qBCProd"  
                      PIS_qBCProd  := oCurrent:cData          
                   ELSEIF oCurrent:cName == "vAliqProd"
                      PIS_vAliqProd:= oCurrent:cData
                   ENDIF
                
                ENDDO
            ELSE
               oCurrent:= oIterator:Next()
            ENDIF
            
         ENDDO
      
      ELSE
         oCurrent:= oIterator:Next()
      ENDIF
   
   ENDDO

   oNode:= oDoc:FindNext()

ENDDO


RETURN NIL 

Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Ler XML de notas de entradas

Mensagem por janio »

Itamar,

Vc acha q eu vou reinventar a roda? Perder horas, horas e horas estudando um fonte q outra pessoa (vc) já o fez e minha duvida era mínima?

Deve ser pra isso que existe forum...

Alias, essa classe eh complicadíssima de se entender! O único exemplo 'usual' que vi até agora foi esse seu. Mas eh como vc disse... foram dias e dias estudando para começar a entender o seu funcionamento!

Eu apenas apresentei uma duvida... vc apresentou uma 'solução' e eu disse q a solução q vc havia apresentando num estava funcionando. Porém, todavia, no entanto... eu falei q ia mim virar num foi?

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ler XML de notas de entradas

Mensagem por Itamar M. Lins Jr. »

Pois é!
O código está ai e está funcionando.
Já arrumei(adicionei) o que vc pediu é só usar.
Não tem esse erro apontado por vc no código.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ler XML de notas de entradas

Mensagem por Itamar M. Lins Jr. »

Perder horas, horas e horas estudando um fonte q outra pessoa (vc) já o
Estudo nunca é de mais. Vc irá entender o funcionamento de uma classe bem interessante. Pois com ela vc irá fazer quase tudo com intercambio de informações.
Ainda mais p/ vc que usa MySQL copiar, importar, exportar dados, para qualquer BD.

Lógico que tem seu gosto, mas é assim que funciona p/ as demais linguagens também.
Hoje XML com a internet(troca de informações) tem muita coisa, não só NFe.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ler XML de notas de entradas

Mensagem por Itamar M. Lins Jr. »

O único exemplo 'usual' que vi até agora foi esse seu.
Usando o duckduckgo.com (concorrente do google) p/ pesquisar.
Já usando TIPClientHTTP() classe similar.
Tem outros exemplos no Harbour p/ XML usando a mesma classe que usei, alias aprendi(um pouco) estudando os exemplos.

Código: Selecionar todos


/* Makes an Internet search and displays the links from the response HTML page */

#require "hbssl"
#require "hbtip"

#if ! defined( __HBSCRIPT__HBSHELL )
REQUEST __HBEXTERN__HBSSL__
#endif

PROCEDURE Main()

   LOCAL cURL := iif( tip_SSL(), "https://", "http://" ) + "duckduckgo.com/html/"
   LOCAL oHTTP := TIPClientHTTP():New( cURL )
   LOCAL cHtml, oNode, oDoc

   ? "URL:", cURL

   /* build the search query and add it to the TUrl object */
   oHTTP:oURL:addGetForm( { ;
      "q"  => "Harbour+Project", ;
      "kl" => "us-en" } )

   /* Connect to the HTTP server */
   IF ! oHTTP:Open()
      ? "Connection error:", oHTTP:lastErrorMessage()
      RETURN
   ENDIF

   /* download the response */
   cHtml := oHTTP:ReadAll()
   oHTTP:Close()
   ? hb_ntos( Len( cHtml ) ), "bytes received"
   ?

   oDoc := THtmlDocument():New( cHtml )

   oDoc:writeFile( "result.htm" )

   /* "aS" is the plural of "a" and returns all <a href="url"> tags */
   FOR EACH oNode IN oDoc:body:div( "links" ):aS
      IF oNode:class == "large"
         ? tip_HtmlToStr( oNode:getText( "" ) ), oNode:href
      ENDIF
   NEXT

   RETURN
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Ler XML de notas de entradas

Mensagem por janio »

Jairfab,

Funcionou direitinho! Assim foi mamão com açúcar!
:{ :xau

Itamar,

Usava o acbr para ler os xml's. Agora estou sem esta pendência de programa externo!

Vlw

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ler XML de notas de entradas

Mensagem por Itamar M. Lins Jr. »

Ola!
Da forma que o Jairfab explicou é mais complicado(nem tanto) porque entra nos sub níveis do XML.
No exemplo que postei eu uso apenas o nível superior e com "DO WHILE e NEXT" vou pegando os dados.
Esse:
oDet := oXML:findfirst( "det" ) é o nivel primeiro

E aqui eu pego o que desejar

Código: Selecionar todos

      oDet := oXML:findfirst( "det" )
      IF oDet == NIL
         hwg_Msgstop( "TAG det não localizada." )
         RETURN
      ENDIF

      Do While .T.

         oIterator := TXmlIterator():New( oDet )
         nIPI := nPIS := nCOFINS := 0
         cEAN := ""
         DO WHILE .T.

            oCurrent := oIterator:Next()

            IF oCurrent == NIL
               EXIT
            ELSE

               IF oCurrent:cName == "cProd"
                  cProd := oCurrent:cData
               ELSEIF oCurrent:cName == "xProd"
                  xProd := AllTrim(charone(" ",oCurrent:cData))
...
Um nível só.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Ler XML de notas de entradas

Mensagem por Itamar M. Lins Jr. »

Porém meu objetivo é usar a classe HBNFe, mas parece que está abandonada no SVN, tem até dois SVN´s.
O José Quintas começou e não terminou.
Não será melhor o José Quintas começar um novo SVN só com a classe dele ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
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

Ler XML de notas de entradas

Mensagem por marcos.gurupi »

Colegas, quando ocorre um erro ao ler o xml com o codigo 11, o q se refere ?

Segue abaixo o codigo:

Código: Selecionar todos

cStr := MemoRead( cArq )
oXML := TXMLDocument():New( cStr, HBXML_STYLE_NOESCAPE ) 
IF oXML:nError != HBXML_ERROR_NONE 
    Msgstop( "xml com problema " + Str( oXML:nError ) ) // Aqui esta aparecendo codigo 11
   RETURN 
ENDIF 
Marcos Roberto
NetService Software
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ler XML de notas de entradas

Mensagem por JoséQuintas »

Não sei se resolveram.
Vejam se usando XmlNode() fica mais fácil de entender.
Se servir a rotina pronta com as informações que uso, então estará tudo pronto.

https://pctoledo.org/forum/viewto ... 54&t=17413

Faz parte do sefazclass.
Estou pensando em modificar os nomes internos pra expandir possibilidades, mas por enquanto só pensando..... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder