Clipper On Line • Ver Tópico - Ler XML de notas de entradas

Ler XML de notas de entradas

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

Moderador: Moderadores

 

Ler XML de notas de entradas

Mensagempor Itamar M. Lins Jr. » 20 Mar 2015 13:41

Ô 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>)
     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
      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.

***********************
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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Ler XML de notas de entradas

Mensagempor jairfab » 20 Mar 2015 13:49

Janio, seguindo a logica basta acrescentar algo deste tipo:
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 de usuário

jairfab
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 242
Data de registro: 21 Mai 2007 09:43
Cidade/Estado: São Paulo, Região Leste - Suzano
Curtiu: 0 vez
Mens.Curtidas: 13 vezes

Ler XML de notas de entradas

Mensagempor janio » 20 Mar 2015 15:07

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 de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

Ler XML de notas de entradas

Mensagempor Itamar M. Lins Jr. » 20 Mar 2015 17:39

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Ler XML de notas de entradas

Mensagempor Itamar M. Lins Jr. » 20 Mar 2015 17:45

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Ler XML de notas de entradas

Mensagempor Itamar M. Lins Jr. » 20 Mar 2015 17:52

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.


/* 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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Ler XML de notas de entradas

Mensagempor janio » 20 Mar 2015 20:35

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 de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1835
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 8 vezes
Mens.Curtidas: 68 vezes

Ler XML de notas de entradas

Mensagempor Itamar M. Lins Jr. » 20 Mar 2015 20:58

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

      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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Ler XML de notas de entradas

Mensagempor Itamar M. Lins Jr. » 20 Mar 2015 21:38

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Ler XML de notas de entradas

Mensagempor marcos.gurupi » 17 Mai 2016 17:32

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

Segue abaixo o codigo:

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
marcos.gurupi
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 930
Data de registro: 06 Jul 2004 11:53
Cidade/Estado: Gurupi-TO
Curtiu: 0 vez
Mens.Curtidas: 6 vezes

Ler XML de notas de entradas

Mensagempor JoséQuintas » 29 Jul 2016 11:24

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.

http://www.pctoledo.com.br/forum/viewtopic.php?f=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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Anterior



Retornar para Projeto hbNFe

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro