Serve como exemplo pra mostrar mudança:
Código: Selecionar todos
Scroll( 8, 0, MaxRow(), MaxCol(), 0 )
@ 8, 1 GET cChave PICTURE "@R 99-99/99-99.999.999/9999-99.99.999.999999999.9.99999999.9"
READ
IF LastKey() == K_ESC
EXIT
ENDIF
oSefaz := SefazClass():New()
oSefaz:NfeConsulta( cChave )
? oSefaz:cXmlSoap
? oSefaz:cXmlRetorno
Não precisou mais pastas temporárias, nem arquivo temporário, é comunicação direta com a Fazenda.
Essa a é parte que mencionei que ganha-se controle total.
A parte que falei que perde-se mordomias, é até relativo.
Uma vez com o XML de retorno, verifica a informação direto no XML.
Considero vantagem o fato de estar mexendo diretamente com arquivos do projeto.
Não vai estar aprendendo detalhes de uma classe, e sim do projeto.
Uma opção pra analisar o retorno, usando função que está na classe, seria esta:
Código: Selecionar todos
IF XmlNode( oSefaz:cXmlRetorno, "status" ) != "101"
? "Nota não foi autorizada"
ENDIF
oSefaz:cXmlSoap é o XML que foi enviado pra Fazenda, serve pra verificar bugs, controle total
oSefaz:cRetorno é exatamente o XML retornado pela Sefaz, controle total
No projeto original da Sefaz não existe arquivo temporário, não existe arquivo "não temporário", o único arquivo é o XML final de distribuição.
Pra brincar com o cérebro, e é sério: pra validar o XML também não precisa de um arquivo XML.
Isso acima é um XML. Não precisa existir "arquivo.xml".
Se for validar, valida-se o texto. (eu mesmo não uso validação, já que gerando pelo aplicativo, considera-se correto).
Acho que o pessoal ficou tão acostumado em usar arquivos temporários, XMLs em disco, configurar pastas e outras coisas mais, que a simplicidade desta classe confundiu.
Não é assim, é apenas pra efeito didático.
Imagine a comunicação com a Fazenda como algo assim:
Código: Selecionar todos
cUrl := "http://www.fazenda.sp.gov.br/" + "emissaonfe/" + "entregaxml/" + cXml
cResposta := RepostaEndereco( cUrl )
O que altera entre cada coisa são os parâmetros e o xml.
Alterar de uma versão pra outra, é questão de atualizar esses parâmetros.
Por isso sempre insisti na classe, e por isso disse que não tem nada a ver com o projeto original.
Passaremos a conversar sobre quais os parâmetros corretos, e não sobre mudar fontes da classe.
O que cada método da classe faz é apenas colocar os parâmetros corretos no endereço.
Então é controle total, sem as complicações da hbnfe.
E se faltar alguma mordomia/facilidade, é só criar função, como fiz usando XmlNode().