Página 1 de 1

Manual didático de NFE em XML

Enviado: 03 Jun 2010 22:49
por JoséQuintas
Basicamente o XML é composto de tags.
A tag começa com <tag> e termina com </tag>
E uma tag pode conter sub-tags.

O cnpj do emitente ficaria assim:

Código: Selecionar todos

mXml := "<cnpj>" + emitente->cnpj + "</cnpj>"
O nome do emitente ficaria assim:

Código: Selecionar todos

mXml := "<nome>" + emitente->nome + "</nome>"
E o conjunto de dados do emitente ficaria assim:

Código: Selecionar todos

mXml := "<emitente>" + ;
   "<cnpj>" + emitente->cnpj + "</cnpj>" + ;
   "<nome>" + emitente->nome + "</nome>" + ;
   "</emitente>"
Nos exemplos acima, vemos que a parte mais chata é ficar abrindo e fechando tags.
Pra isso, criamos uma função, só precisando passar o nome e o conteúdo.

E pode confundir o abrir/fechar, quando o Xml vai ficando extenso.
Então vamos separar em blocos.
Abaixo um fonte mais completo, só pra dar uma idéia.

Código: Selecionar todos

mXmlNota := XmlTag("nota",notafiscal->numero) + ;
   XmlTag("emissao",Dtos(notafiscal->emissao)) + ;
   XmlTag("natureza",notfiscal->natureza)

mXmlEmitente := XmlTag("cnpj",emitente->cnpj) + ;
   XmlTag("nome",emitente->nome) + ;
   XmlTag("endereco",emitente->endereco) + ;
   XmlTag("cidade",emitente->cidade) + ;
   XmlTag("UF", emitente->uf)

mXmlDestinatario := XmlTag("cnpj",cliente->cnpj) + ;
   XmlTag("nome",emitente->nome) + ;
   XmlTag("endereco",emitente->endereco) + ;
   XmlTag("cidade",emitente->cidade) + ;
   XmlTag("UF",emitente->UF)

mXmlProduto := XmlTag("produto",produto->nome) + ;
   XmlTag("Qtde",Ltrim(Str(produto->Qtde,16,2))) + ;
   XmlTag("Valor",Ltrim(Str(produto->Valor,16,4)))

mXmlGeral := ;
   XmlTag("Nota",mXmlNota) + ;
   XmlTag("emitente",mXmlEmitente) + ;
   XmlTag("destinatario",mXmlDestinatario") + ;
   XmlTag("produto",mXmlProduto)

MemoWrit(ArquivoXml,mXmlGeral)

Function XmlTag(cTag, cConteudo)
Local cTexto := ""
cTexto := "<" + cTag + ">" + cConteudo + "</" + cTag + ">"
Return cTexto
Há várias formas de fazer tudo isso. Basta escolher a que achar melhor.
Outra opção dos dados de clientes, por exemplo, poderia ser um Array.

Código: Selecionar todos

aDadosCli := {}
Aadd(aDadosCli,{"CNPJ",clientes->Cnpj})
Aadd(aDadosCli,{"Nome",clientes->Nome})
Aadd(aDadosCli,{"Endereco",clientes->Endereco})
Aadd(aDadosCli,{"Cidade",clientes->Cidade})
Aadd(aDadosCli,{"UF",clientes->Uf})

mXml := ""
For nCont = 1 To Len(aDadosCli)
   cCampo := aDadosCli[nCont,1]
   cConteudo := aDadosCli[nCont,2]
   mXml := mXml + "<" + cCampo + ">" + cConteudo + "</" + cCampo + ">"
Next
E por aí vai....
As opções são muitas, aqui tem apenas algumas para ajudar.
De repente poderia usar o eval() no array, mas nunca usei isso, e não saberia ensinar.

Esse fonte é simples e prático.
Tem um componente da Microsoft pra XML, mas em VB uso o fonte exatamente igual.
O componente da Microsoft parece só complicar, assim como algumas classes criadas pra XML que existem por aí.
Espero que este post ajude.

Obs. Estas e outras dicas estão em meu site, ainda com cores zoneadas, devido a testes.

Re: Manual didático de NFE em XML

Enviado: 04 Jun 2010 13:29
por anacatacombs
Parabéns pela iniciativa :)
A propósito.. qual seu site?

Re: Manual didático de NFE em XML

Enviado: 04 Jun 2010 16:20
por lugab
José Quintas,

Até eu, um quase zero em linguagem de programação, compreendi.

Falo por todos aqui do fórum que tem o mesmo nível que eu, e que costumam só baixar , silenciosamente, e necas de postar um agradecimento.

Muito obrigado, de verdade.

gabriel

Re: Manual didático de NFE em XML

Enviado: 04 Jun 2010 17:25
por Dr.Microso
Parabéns José!

Ficou bakana o formato, é legal quando alguém posta algo visando toda a "escada de instrução".
Embora eu não trabalhe com XML ainda, estava protelando o estudo do assunto... Parecia algo mais complexo, e agora ficou claro que é um TXT formatado... Seu post me deu uma noção legal de base. Tomara que o formato do post seja adotado por muitos aqui...

Algumas solicitações de ajuda são atendidas aqui num código até funcional, mas... Acompanhada de penduricalhos e/ou em alguns casos em vez do PRG limpo e didático, um PPO com instruções nuas como a manipulação de objetos (para mim é simples...) dificultando para muitos.
Não, não estou fazendo alusão à nenhum post correlacionado (que fique bem claro!), mas sim à muitos que estão espalhados por aí sobre assuntos diversos. Obviamente, cada um posta da forma que quer, mas tenho certeza que a maioria concorda que fica mais bonito e atende um número bem maior de pessoas, quando a visibilidade é global.
Viva o passo-a-passo, o código simples e didático, altruísta e não disfarçado de "espelho para a vaidade"!

Um abraço!