Página 3 de 4

Classe e função pra carregar XML

Enviado: 12 Dez 2016 21:33
por JoséQuintas
Esse switch eu achei perigoso, por estar acostumado com DO CASE que não precisa EXIT em cada opção.

Um que eu uso bastante, é pra não ter que numerar cada opção, permitindo acrescentar/eliminar itens fácil:

Código: Selecionar todos

nTemp := 1
DO CASE
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
CASE nOpcao == nTemp++
ENDCASE

Classe e função pra carregar XML

Enviado: 12 Dez 2016 21:54
por JoséQuintas
E não é que não tem comandos no manual do Harbour.
Alguém tinha reparado nisso?

Classe e função pra carregar XML

Enviado: 15 Dez 2016 22:35
por JoséQuintas
Eh a primeira vez que For Each tbm... e ate me parece mais simples que For... Next
Fechou Quintas... Declare local oProduto e depois peguei oProduto:Nome ...
Estou usando e abusando das novas no Harbour como WITH OBJECT, SWITCH, o FOR EACH, esses comandos são ótimos e substitui muito os tradicionais na maioria dos casos
Esqueci de comentar:

É legal ver isso.
É isso que mostra que "estamos ativos e vivos".
E vai despertando curiosidade de aprender cada vez mais.
O que era rotineiro e cansativo, começa a se transformar em novas aventuras... rs

Classe e função pra carregar XML

Enviado: 20 Jan 2017 07:21
por rubens
JoséQuintas,

Fiz uma implementações na classe, mais especificamente no prg ze_spedxmlClass.prg. Acrescentei uns campos que a classe não estava pegando. Onde acrescentei coloquei meu nome na linha.
Se você achar que é interessante por favor atualize para que não seja necessário alterar aqui no prg quando fizer uma atualização da classe.

Obrigado
Rubens
ze_spedxmlClass.prg
(33.3 KiB) Baixado 684 vezes

Classe e função pra carregar XML

Enviado: 20 Jan 2017 08:57
por JoséQuintas
Vou olhar com mais atenção as alterações.
Como uso direto no meu aplicativo, talvez tenha que alterar meu aplicativo.

Mas já dá pra adiantar que tem pelo menos uma coisa errada:
a chave fica em :cChaveAcesso e em uma parte usou :cChave
Também já cometi esse erro, talvez seja hora de alterar o nome pra :cChave mesmo

Classe e função pra carregar XML

Enviado: 25 Jan 2017 12:37
por rubens
JoséQuintas....

O XML em anexo me deu uma canseira danada e mesmo assim não consegui resolver... A sequencia da numeração dos produtos veio quebrada... veio o item 18 depois o 22,23 e o 19,20,21...
52170102595626000113550010006859911001640370.xml
(22.56 KiB) Baixado 802 vezes
Daí tanto com for each com a sua classe, tanto usando minha rotina com for next, se perde a sequencia de leitura dos itens e para sempre no item 21.
A minha rotina não consegue ler os itens fora da sequencia... o que eu poderia fazer ? (nesse caso para resolver abri o arquivo com o bloco de nota e corrigi a sequencia dos itens).

Obrigado
Rubens

Classe e função pra carregar XML

Enviado: 25 Jan 2017 18:54
por JoséQuintas
Use MultipleNodeToArray()

Classe e função pra carregar XML

Enviado: 21 Mar 2017 16:12
por rubens
José Quintas...

Essa MultipleNodeToArray() vai ter que ser usada na classe... onde faz a leitura dos arquivos vai ter que mudar xmlnode() para MultipleNodeToArray()?

Achei que ia ser um caso isolado o problema dos itens fora de sequencia mas agora estou com três clientes recebendo notas desse tipo... agora tenho que correr atrás...

Obrigado
Rubens

Classe e função pra carregar XML

Enviado: 21 Mar 2017 16:44
por JoséQuintas

Código: Selecionar todos

   FOR nCont = 1 TO 1000
      cBlocoItem := XmlNode( cBlocoDetalhe, [det nItem="] + LTrim( Str( nCont ) ) + ["])
      IF Len( Trim( cBlocoItem ) ) = 0 // Se acabaram os itens
         EXIT
      ENDIF
Com MultipleNodeToArray(), deve ficar até mais fácil, acho que assim basta:

Código: Selecionar todos

FOR EACH cBlocoItem IN MultipleNodeToArray( cBlocoDetalhe, "det nItem" )
      IF Len( Trim( cBlocoItem ) ) = 0 // Se acabaram os itens
         EXIT
      ENDIF

Classe e função pra carregar XML

Enviado: 23 Jun 2017 23:26
por rubens
Olá...

Quintas, por favor dá mais uma aulinha aqui... tem horas que a gente tá meio travado... (ou é burro mesmo)...
Eu tinha conseguido fazer funcionar com MultipleNodeToArray(), tive que fazer uma alteração na função mas funcionou... Que alteração? Quando manda somente o cNode para MultipleNodeToArray() lendo uma nfe não funcionava por que o bloco de itens começa com det item e termina somente com det. Daí implementei para mandar cNode e cNodeFim, se não for enviado cNodeFim ele assume por default cNode.
Daí ficou assim:

Código: Selecionar todos

FUNCTION MultipleNodeToArray( cXml, cNode, cNodeFim )
   LOCAL aNodes :={}
	hb_Default( @cNodeFim, cNode )
   DO WHILE "<" + cNode + "=" $ cXml .OR. "<" + cNode + ">" $ cXml
      Aadd( aNodes , XmlNode( cXml , cNode ) )
      IF ! "</" + cNodeFim $ cXml
         cXml := ""
      ELSE
         cXml := Substr( cXml, At( "</" + cNodeFim + ">", cXml ) + Len( "</" + cNodeFim + ">" ) )
      ENDIF
   ENDDO
   RETURN aNodes
Agora não estou conseguindo chamar a função... Se uso:

Código: Selecionar todos

For EACH oProduto IN ( oNfe:Produto )
Funciona beleza... desde que a ordem dos produtos esteja correta...
Se a ordem dos produtos está errada, não está em sequencia ( 1,2,3,4,9,6,57 ) não funciona.
Como eu colocaria para usar o MultipleNodeToArray().
Já tinha conseguido isso mas perdi uns dois dias de programação e a rotina que tinha conseguido estava nesses dias.
O meu conceito é:
Preciso pegar a relação dos produtos... daí envio para MultipleNodeToArray() cXML que é o texto da NFE certo? daí MultipleNodeToArray() adiciona em aNodes os produtos. Mas eu não tenho um variável texto com a NFE. oNFE é um objeto de class e oNFE:Produto é uma array.
O mais próximo que consegui chegar foi:

Código: Selecionar todos

cXml 			:= Hb_MemoRead( cArqXml )
For EACH oProduto IN ( MultipleNodeToArray( cXml, 'det nItem','det')
cNomPro := oProduto:Nome   --> Dá erro aqui
Next
Obrigado
Rubens

Classe e função pra carregar XML

Enviado: 24 Jun 2017 00:53
por JoséQuintas
Simples:

a função não tinha problema, não tinha nada pra ser consertado, você simplesmente a estragou.

A classe tem tudo que precisa, tem até o Danfe que retira toda informação da nota.
Tem até rotina pronta pra pegar dados da nota, além dessa.

Não querendo ser chato, mas já sendo:

Não era a rotina que estava errada, era você.
O nome não é "det item", é "det".

MultipleNodeToArray( cXml, "det" )

Era só ter olhado os fontes da classe pra encontrar o uso correto.

Classe e função pra carregar XML

Enviado: 06 Jul 2017 18:54
por gilbertosilverio
Ola Jose Quintas,

Estou estudando teu exemplo, de como criar classes, para tentar criar uma rotina, e esta ocorrendo o erro apos a emissao da NFe.

O que pode ser, o PDF e gerado, mais o qrcode não, dando o erro abaixo, a ja tentei entender, mais não consegui fazer funcionar.

35170644463156000184550750004914211108131768.XML
Error BASE/1111 Argument error: LEN
Called from LEN(0)
Called from HBNFEDANFCE:CONSULTACHAVEACESSO(434)
Called from HBNFEDANFCE:CALCULAPDF(165)
Called from HBNFEDANFCE:TOPDF(72)
Called from (b)HBNFEDANFCE(16)
Called from HBNFEDANFCE:EXECUTE(0)
Called from TESTDANFE(230)
Called from MAIN(65)

Retirei o que tinha, oFILES do teu exemplo, e inclui um numero de uma NFe valida, ela gera o pdf mais da o erro abaixo.

Código: Selecionar todos

FUNCTION TestDanfe()

   LOCAL oDanfe, oFiles, cFileXml, cFilePdf

   oFiles := { "35170644463156000184550750004914211108131768.XML" }
   FOR EACH cFileXml IN oFiles
      oDanfe := hbNfeDaGeral():New()
      cFilePdf := Substr( cFileXml, 1, At( ".", cFileXml ) ) + "pdf"
      fErase( cFilePdf )
      oDanfe:cLogoFile := JPEGImage()
      oDanfe:cDesenvolvedor := "www.jpatecnologia.com.br"
      oDanfe:ToPDF( cFileXml, cFilePdf, iif( cFileXml == "nfecancel.xml", "nfecancelcan.xml", "" ) )
      ? cFileXml, oDanfe:cRetorno
      PDFOpen( cFilePdf )
   NEXT
   oDanfe := hbNFeDaNFCe():New()
   oDanfe:Execute( "www.jpatecnologia.com.br" )
   PDFOpen( "pdfqrcode.pdf" )
   Inkey(0)

   RETURN NIL

Classe e função pra carregar XML

Enviado: 06 Jul 2017 19:13
por gilbertosilverio
Jose Quintas,

Inclui :
OTHERWISE
cUrl := ""
Não sei se e certo, mais não deu mais o erro...

Código: Selecionar todos

METHOD ConsultaChaveAcesso() CLASS hbNFeDaNFCe

   LOCAL cUF, cUFList, cUrl

   // DIVISAO IV - Informacoes da consulta via chave de acesso -------------------------------------------------------------------
   cUFList := "AC,12,AL,27,AM,13,AP,16,BA,29,CE,23,DF,53,ES,32,GO,52,MG,31,MS,50,MT,51,MA,21,PA,15,PB,25,PE,26,PI,22,PR,41,RJ,33,RO,11,RN,24,RR,14,RS,43,SC,42,SE,28,SP,35,TO,17,"
   cUF     := Substr( cUFList, At( ::aIde[ "cUF" ], cUFList ) - 3, 2 )

   // Fonte: http://nfce.encat.org/consumidor/consulte-sua-nota/
   IF ::aIde[ "tpAmb" ] == WS_AMBIENTE_PRODUCAO
      DO CASE
      CASE cUF == "AC" ; cUrl := "www.sefaznet.ac.gov.br/nfce/consulta"
      CASE cUF == "AL" ; cUrl := "http://nfce.sefaz.al.gov.br/consultaNFCe.htm"
      CASE cUF == "AP" ; cUrl := "https://www.sefaz.ap.gov.br/sate/seg/SEGf_AcessarFuncao.jsp?cdFuncao=FIS_1261"
      CASE cUF == "AM" ; cUrl := "sistemas.sefaz.am.gov.br/nfceweb/formConsulta.do"
      CASE cUF == "BA" ; cUrl := "nfe.sefaz.ba.gov.br/servicos/nfce/default.aspx"
      CASE cUF == "CE" ; cUrl := ""
      CASE cUF == "DF" ; cUrl := "http://dec.fazenda.df.gov.br/NFCE/"
      CASE cUF == "ES" ; cUrl := "http://app.sefaz.es.gov.br/ConsultaNFCe"
      CASE cUF == "GO" ; cUrl := ""
      CASE cUF == "MA" ; cUrl := "http://www.nfce.sefaz.ma.gov.br/portal/consultaNFe.do?method=preFilterCupom&"
      CASE cUF == "MT" ; cUrl := "http://www.sefaz.mt.gov.br/nfce/consultanfce"
      CASE cUF == "MS" ; cUrl := "http://www.dfe.ms.gov.br/nfce"
      CASE cUF == "MG" ; cUrl := ""
      CASE cUF == "PA" ; cUrl := "https://appnfc.sefa.pa.gov.br/portal/view/consultas/nfce/consultanfce.seam"
      CASE cUF == "PB" ; cUrl := "www.receita.pb.gov.br/nfce"
      CASE cUF == "PR" ; cUrl := "http://www.fazenda.pr.gov.br"
      CASE cUF == "PE" ; cUrl := ""
      CASE cUF == "PI" ; cUrl := "http://webas.sefaz.pi.gov.br/nfceweb/consultarNFCe.jsf"
      CASE cUF == "RJ" ; cUrl := "www.nfce.fazenda.rj.gov.br/consulta"
      CASE cUF == "RN" ; cUrl := "http://nfce.set.rn.gov.br/consultarNFCe.aspx"
      CASE cUF == "RS" ; cUrl := "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"
      CASE cUF == "RO" ; cUrl := "http://www.nfce.sefin.ro.gov.br"
      CASE cUF == "RR" ; cUrl := "https://www.sefaz.rr.gov.br/nfce/servlet/wp_consulta_nfce"
      CASE cUF == "SC" ; cUrl := ""
      CASE cUF == "SP" ; cUrl := "https://www.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx"
      CASE cUF == "SE" ; cUrl := "http://www.nfce.se.gov.br/portal/portalNoticias.jsp"
      CASE cUF == "TO" ; cUrl := ""
      OTHERWISE
          cUrl := ""
      ENDCASE
   ELSE
      DO CASE
      CASE cUF == "AC" ; cUrl := "http://hml.sefaznet.ac.gov.br/nfce/consulta"
      CASE cUF == "AL" ; cUrl := "http://nfce.sefaz.al.gov.br/consultaNFCe.htm"
      CASE cUF == "AP" ; cUrl := "https://www.sefaz.ap.gov.br/sate1/seg/SEGf_AcessarFuncao.jsp?cdFuncao=FIS_1261"
      CASE cUF == "AM" ; cUrl := "homnfce.sefaz.am.gov.br/nfceweb/formConsulta.do"
      CASE cUF == "BA" ; cUrl := "http://hnfe.sefaz.ba.gov.br/servicos/nfce/default.aspx"
      CASE cUF == "CE" ; cUrl := "http://nfceh.sefaz.ce.gov.br/pages/consultaNota.jsf"
      CASE cUF == "DF" ; cUrl := "http://dec.fazenda.df.gov.br/NFCE/"
      CASE cUF == "ES" ; cUrl := "http://homologacao.sefaz.es.gov.br/ConsultaNFCe"
      CASE cUF == "GO" ; cUrl := ""
      CASE cUF == "MA" ; cUrl := "http://www.hom.nfce.sefaz.ma.gov.br/portal/consultarNFCe.jsp"
      CASE cUF == "MT" ; cUrl := "http://homologacao.sefaz.mt.gov.br/nfce/consultanfce"
      CASE cUF == "MS" ; cUrl := "http://www.dfe.ms.gov.br/nfce"
      CASE cUF == "MG" ; cUrl := ""
      CASE cUF == "PA" ; cUrl := "https://appnfc.sefa.pa.gov.br/portal-homologacao/view/consultas/nfce/consultanfce.seam"
      CASE cUF == "PB" ; cUrl := ""
      CASE cUF == "PR" ; cUrl := "http://www.fazenda.pr.gov.br"
      CASE cUF == "PE" ; cUrl := ""
      CASE cUF == "PI" ; cUrl := "http://webas.sefaz.pi.gov.br/nfceweb-homologacao/consultarNFCe.jsf"
      CASE cUF == "RJ" ; cUrl := "www.nfce.fazenda.rj.gov.br/consulta"
      CASE cUF == "RN" ; cUrl := "http://nfce.set.rn.gov.br/consultarNFCe.aspx"
      CASE cUF == "RS" ; cUrl := "https://www.sefaz.rs.gov.br/NFCE/NFCE-COM.aspx"
      CASE cUF == "RO" ; cUrl := "http://www.nfce.sefin.ro.gov.br"
      CASE cUF == "RR" ; cUrl := "http://200.174.88.103:8080/nfce/servlet/wp_consulta_nfce"
      CASE cUF == "SC" ; cUrl := ""
      CASE cUF == "SP" ; cUrl := "https://www.homologacao.nfce.fazenda.sp.gov.br/NFCeConsultaPublica/Paginas/ConsultaPublica.aspx"
      CASE cUF == "SE" ; cUrl := "http://www.hom.nfe.se.gov.br/portal/portalNoticias.jsp"
      CASE cUF == "TO" ; cUrl := ""
      OTHERWISE
          cUrl := ""
      ENDCASE
   ENDIF


Classe e função pra carregar XML

Enviado: 06 Jul 2017 21:13
por JoséQuintas
Sim... não.... talvez... melhor o porque:

Se tem todas as UFs, e nenhuma serviu... ou está faltando UF, ou chegou uma UF errada até aí.
Pode ser interessante verificar quando acontecer erro, já que seria uma "nova" UF.

Será que não chega o código da UF ao invés da UF?
Tem função de converter, UfCodigo() e UFSigla() se não me engano.

Classe e função pra carregar XML

Enviado: 06 Jul 2017 21:22
por JoséQuintas
Estou estudando teu exemplo, de como criar classes, para tentar criar uma rotina, e esta ocorrendo o erro apos a emissao da NFe.
De um modo geral, classe é como se fosse um fonte usando variáveis PUBLIC/PRIVATE que valem pro fonte inteiro.
METHOD é igual função.

Argument error, LEN
Significa que foi usar a função Len() em algum conteúdo que não permite Len()
Nessa linha vai dar pra ver a variável.

Estou vendo que isso tem a ver com a parte que está sendo adicionada da NFCE.
Acrescentei na classe, mas não percebi que não está finalizada.

Dá pra perceber pelo nome do que deu erro: NFCE