Delphi 2010, Problema com “encoding” usando TXMLDocument

Código-Fonte, Dicas Blog, Programação dezembro 17th, 2009

Estava recompilando alguns componentes do meu sistema, desenvolvidos originalmente com o Delphi 7 para o Delphi 2010, e percebi o seguinte erro ao tentar abrir um XML gerado pela aplicação compilada com o D2010 “caractere inválido encontrado no texto“.

Na verdade o XML contêm campos acentuados usando “ISO-8859-1″ e, após algum tempo perdido descobri que o código abaixo, embora estivesse correto não gerava o XML como deveria; ou seja, a propriedade “encoding” simplesmente não é adicionada (como deveria) no cabeçalho do XML. Isso não acontece no Delphi 7, por exemplo.

01 – Codigo que não funciona no Delphi 2010:

Clique para continuar lendo “Delphi 2010, Problema com “encoding” usando TXMLDocument”

Tags: , , ,

Lendo o XML gerado pelo WINMFD2 da Bematech

Código-Fonte, Dicas Blog outubro 16th, 2009

Para quem não conheçe o WINMFD2 é um utilitário da BEMATECH que pode ser usado para a captura da memória de fita detalhe do ECF que gera o arquivo em vários formatos; inclusive XML, o qual vamos usar de exemplo:

Vou usar como exemplo o XML abaixo (que é exatamente igual ao formato do XML gerado pelo WINMFD2):

01 – Exemplo XML gerado pelo utilitário WINMFD2:

< ?xml version="1.0"?>
<documentos>
<cupom_fiscal>
	<hora_inicio>15/10/2009 15:22:00</hora_inicio>
	<coo>0005</coo>
	<ccf>0009</ccf>
	<venda_de_item>
		<ordem>1</ordem>
		<codigo>0000000000001</codigo>
		<descricao>PRODUTO EXEMPLO 1</descricao>
		<quantidade>1</quantidade>
		<valor_unitario>2,34</valor_unitario>
		<valor_bruto>2,34</valor_bruto>
		<aliquota>FF</aliquota>
	</venda_de_item>
	<venda_de_item>
		<ordem>2</ordem>
		<codigo>0000000000002</codigo>
		<descricao>PRODUTO EXEMPLO 2</descricao>
		<quantidade>1</quantidade>
		<valor_unitario>2,34</valor_unitario>
		<valor_bruto>2,34</valor_bruto>
		<aliquota>FF</aliquota>
	</venda_de_item>
	<subtotal>4,68</subtotal>
	<acrescimo>0,00</acrescimo>
	<desconto>0,00</desconto>
	<total>4,68</total>
	<soma_pgto>4,68</soma_pgto>
	<troco>0,00</troco>
</cupom_fiscal>
<cupom_fiscal>
	<hora_inicio>15/10/2009 15:24:02</hora_inicio>
	<coo>0007</coo>
	<ccf>0010</ccf>
	<venda_de_item>
		<ordem>1</ordem>
		<codigo>0000000000001</codigo>
		<descricao>PRODUTO EXEMPLO 1</descricao>
		<quantidade>1</quantidade>
		<valor_unitario>2,34</valor_unitario>
		<valor_bruto>2,34</valor_bruto>
		<aliquota>FF</aliquota>
	</venda_de_item>
	<subtotal>2,34</subtotal>
	<acrescimo>0,00</acrescimo>
	<desconto>0,00</desconto>
	<total>2,34</total>
	<soma_pgto>2,34</soma_pgto>
	<troco>0,00</troco>
</cupom_fiscal>
</documentos>

Clique para continuar lendo “Lendo o XML gerado pelo WINMFD2 da Bematech”

Tags: , , ,

Distribuição da NF-e autorizada para o Destinatário (Parte I)

Código-Fonte janeiro 23rd, 2009

Atualmente, a SEFAZ não está verificando a distribuição das NF-e para o destinatário; mas com o decorrer do processo esse recurso (previsto no projeto) será exigido em breve (conforme “nota” no próprio manual). Em resumo, o arquivo eletrônico da NF-e, quando autorizada, deverá ser enviado pelo emitente para o destinatário de acordo com a cláusula décima do AJUSTE SINIEF 07/05.

Clique para continuar lendo “Distribuição da NF-e autorizada para o Destinatário (Parte I)”

Tags: , ,

Dados Retorno Consulta Recibo e Status Serviço NF-e com TXMLDocument

Código-Fonte, Sem categoria dezembro 11th, 2008

Muitos ainda têm dúvida de como ler o XML usando o TXMLDocument; publiquei abaixo mais dois códigos exemplo, o primeiro para ler o arquivo de retorno da consulta de Status do Serviço da NF-e e o segundo para ler o arquivo de retorno da consulta do recibo de envio do lote da NF-e. Reparem que são poucas modificações em relação aos exemplos anteriores, usem esses exemplos também para entender melhor como usar o TXMLDocument e ganhe maior liberdade para trabalhar com qualquer arquivo XML.

Clique para continuar lendo “Dados Retorno Consulta Recibo e Status Serviço NF-e com TXMLDocument”

Tags: ,

Usando TXMLDocument para Ler o Recibo de Envio da NF-e

Código-Fonte dezembro 1st, 2008

No exemplo abaixo usamos o TXMLDocument do Delphi para ler os dados do XML retorno de retorno de envio do lote das NF-e:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var vXMLDoc: TXMLDocument;
    NodeRec: IXMLNode;
    recibo, datahora: WideString;
begin
  vXMLDoc := TXMLDocument.Create(self);
  vXMLDoc.LoadFromFile('0000000000234-rec.xml'); //Le Arquivo Recibo XML');
 
  // Campo memo para o exemplo
  Memo.lines.Add( '-------------------------------------------------');
  Memo.lines.Add( VXMLDoc.XML.Text +#13+#13 );
 
  // Prepara para ler os dados da tag "infRec"
  NodeRec := vXMLDoc.DocumentElement.ChildNodes.FindNode('infRec');
  // Lendo os campos da tag infRec
  recibo := NodeRec.ChildNodes['nRec'].text;     // posso ler assim
  datahora := NodeRec.ChildNodes['dhRecbto'].text;
 
  // adiciona os dados no Memo (apenas exemplo)
  if recibo <> '' then
      begin
      Memo.Lines.Add('-----------------------------------------------');
      Memo.Lines.Add( recibo+' ---- '+datahora );
      end;
 
end;

Tags: , ,

Lendo o XML com o TXMLDocument

Código-Fonte, Delphi outubro 20th, 2008

Algumas pessoas têm me procurado com muitas dúvidas sobre gerar um arquivo XML; mas, ultimamente, principalmente, como fazer para ler os dados de um XML. Já mostrei como fazer isso usando o utilitário que acompanha o Delphi “XML Mapper”; o qual uso muito (veja o post) quando preciso integrar um arquivo XML com meu sistema de forma definitiva.

Outra forma de executar a leitura parcial ou total de um arquivo XML é usando o componente TXMLDocument; com ele vc. pode buscar facilmente a informação que vc precisa dentro do arquivo; no código exemplo, que disponibilizo abaixo: vamos ler os itens do arquivo exemplo gerado no post “Dados XML como começar” (poderia ser usado para ler os itens da sua NF-e com pequenos ajustes):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
procedure TForm1.Button32Click(Sender: TObject);
var vXMLDoc: TXMLDocument;
    NodePai,NodeSec,NodeTmp: IXMLNode;
    nome, codigo: WideString;
begin
  // Cria a variável baseada no TXMLDocument
  vXMLDoc := TXMLDocument.Create(self);
 
  // Le conteúdo do arquivo XML informado 
  vXMLDoc.LoadFromFile('EnviNFe.xml');
  // Poderia ser uma URL como abaixo:
  //vXMLDoc.FileName := 'http://www.caiooliveira.com.br/?feed=rss2';
  //vXMLDoc.Active := True;
 
  // Vou colocar os dados no memo apenas como exemplo
  Memo.lines.Add( '-------------------------------------------------');
  Memo.lines.Add( 'Vamos inserir num campo memo (apenas para ver o resultado do teste');
  Memo.lines.Add( VXMLDoc.XML.Text +#13+#13 );
 
  // Aqui eu peço para encontrar a primeira ocorrencia da Tag <det>>
  NodePai := vXMLDoc.DocumentElement.childNodes.First.ChildNodes.FindNode('det');
  // Esse nó vai ser usado no LOOP
  NodeSec := NodePai;
  // Posiciona o primeiro elemento encontrado
  NodeSec.ChildNodes.First;
  repeat
    // referencia a tag <prod> dentro de <det>
    NodeTmp  := NodeSec.ChildNodes['prod'];
    // da pra ver que é um XML resumido da NFe (so temos uma tag <prod> para cada <det> então não precisaria da linha abaixo
    // agora se tivéssemos mais de uma seria o caso de posicionar também na primeira ocorrencia.
    NodeTmp.ChildNodes.First;
    repeat
      // pega os dados que vc quiser dentro da tag <prod>
      nome := NodeTmp.ChildNodes['cProd'].text;     // posso ler assim
      codigo := NodeTmp.ChildValues['cEan'];        // ou assim
 
      // vamos inserir no Memo os dados
      Memo4.Lines.Add('-----------------------------------------------');
      Memo4.Lines.Add( nome+' ---- '+codigo );
 
      // vai para a proxima ocorrência </prod><prod> (se houvesse)
      NodeTmp := NodeTmp.NextSibling;
    until NodeTmp = nil;
    // vai para a proxima ocorrência <det>
    NodeSec := NodeSec.NextSibling;
  until NodeSec = nil;
end;
</det></prod></det></prod></det></prod></det>

Tags: ,

Dados x XML, como começar? (segunda parte)

Código-Fonte, Delphi outubro 17th, 2008

Essa segunda parte do tópico “Dados x XML como começar” foi criada para atender à uma demanda de usuários que têm postado dúvida para gerar o LOOP para criar os itens no XML da NF-e e, acredito que com com esses dados em mãos vai ficar mais fácil para quem está iniciando agora; segue então, o código da versão anterior com o exemplo da implementação para gerar os itens:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure TfrmPrincipal.PnLerNfeClick(Sender: TObject);
var vXMLDoc: TXMLDocument;
    NodeNivelA, NodeNivelB, NodeNivelC, NodeNivelD: IXMLNode;
    nItens : integer;
begin
 
  vXMLDoc := TXMLDocument.Create(self);
  Try
  With vXMLDoc do begin
       Active := True;
       Version := '1.0';
       Encoding := 'UTF-8';
       AddChild('NFe','http://www.portalfiscal.inf.br/nfe');
       DocumentElement.Attributes['xmlns:ds'] :=
       'http://www.w3.org/2000/09/xmldsig#';
       DocumentElement.Attributes['xmlns:xsi'] :=
       'http://www.w3.org/2001/XMLSchema-instance';
       DocumentElement.Attributes['xsi:schemaLocation'] :=
       'http://www.portalfiscal.inf.br/nfe/enviNFe_v1.12.xsd';
 
       // A - Dados da Nota Fiscal eletrônica
       NodeNivelA := DocumentElement;
       // Adiciona a Tag
       NodeNivelA.AddChild('infNFe');
       // Adiciona atributo "Id" da Tag anterior
       NodeNivelA.ChildNodes['infNFe'].Attributes['Id'] := 'NFe31232131232132131231221312312312';
       // Adiciona atributo "versao" da Tag anterior
       NodeNivelA.ChildNodes['infNFe'].Attributes['versao'] :=
            '1.10';
 
       // B - Identificação da Nota Fiscal eletrônica
       NodeNivelB := NodeNivelA.ChildNodes['infNFe'];
       NodeNivelB.ChildNodes['ide'].AddChild('cUF').NodeValue := '51' ;
       NodeNivelB.ChildNodes['ide'].AddChild('cNF').NodeValue := '000001';
 
       // Exemplo Adiciona Itens
       For nItens := 1 to 2 do
       begin
         // adiciona tag <det> com attributo
         NodeNivelC := NodeNivelB.AddChild('det');
         NodeNivelB.ChildNodes.Last.Attributes['nitem'] := IntToStr(nItens);
 
         // adiciona tag <prod> à partir da tag <det>
         NodeNivelD := NodeNivelC.ChildNodes['prod'];
         NodeNivelD.AddChild('cProd').Nodevalue := IntToStr(nItens)+'121231111';
         NodeNivelD.AddChild('cEan').Nodevalue := '7891133005801';
         NodeNivelD.AddChild('xProd').Nodevalue := 'ABRACADEIRA C/PREGO FMX  6 BR - 580';
         NodeNivelD.AddChild('CFOP').Nodevalue := '5102';
         // .....
       end;
 
       //Memo4.Text := vXMLDoc.Encoding;
       vXMLDoc.SaveToFile('EnviNFe.xml');
       Memo4.Lines.LoadFromFile('EnviNFe.xml');
  end;
  finally
     vXMLDoc.Free;
  end;
end;
</det></prod></det>

Tags: ,

XML Mapper – parte I

Delphi, Ferramentas agosto 8th, 2008

xmlmapper_0.gif O XML Mapper é um programa fornecido juntamente com a sua distribuição do DELPHI 6-7 em diante!. É um recurso pouco documentado, mas muito útil para quem trabalha com arquivos XML no Delphi e, na era da Nota Fiscal Eletrônica quem não entende XML pode estar em apuros nesse momento. Vou demonstrar aqui como usá-lo para facilitar o seu dia a dia com os XMLs que vêm por aí!.

Clique para continuar lendo “XML Mapper – parte I”

Tags: , , ,

Dados x XML, como começar?

Código-Fonte, Delphi julho 31st, 2008

Segue abaixo um exemplo, usando a classe TXMLDocument do Delphi, para gerar um arquivo XML; repare que o arquivo está incompleto, mas servirá como base para quem não sabe ainda por onde começar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TfrmPrincipal.PnLerNfeClick(Sender: TObject);
var vXMLDoc: TXMLDocument;
    NodeNivelA, NodeNivelB: IXMLNode;
 
begin
 
  vXMLDoc := TXMLDocument.Create(self);
  Try
  With vXMLDoc do begin
       Active := True;
       Version := '1.0';
       Encoding := 'UTF-8';
       AddChild('NFe','http://www.portalfiscal.inf.br/nfe');
       DocumentElement.Attributes['xmlns:ds'] :=
       'http://www.w3.org/2000/09/xmldsig#';
       DocumentElement.Attributes['xmlns:xsi'] :=
       'http://www.w3.org/2001/XMLSchema-instance';
       DocumentElement.Attributes['xsi:schemaLocation'] :=
       'http://www.portalfiscal.inf.br/nfe/enviNFe_v1.12.xsd';
 
       // A - Dados da Nota Fiscal eletrônica
       NodeNivelA := DocumentElement;
       // Adiciona a Tag
       NodeNivelA.AddChild('infNFe');
       // Adiciona atributo "Id" da Tag anterior
       NodeNivelA.ChildNodes['infNFe'].Attributes['Id'] := 'NFe31232131232132131231221312312312';
       // Adiciona atributo "versao" da Tag anterior
       NodeNivelA.ChildNodes['infNFe'].Attributes['versao'] :=
            DM.ClientDSLoja.FieldByName('enviNFe').AsString;
 
       // B - Identificação da Nota Fiscal eletrônica
       NodeNivelB := NodeNivelA.ChildNodes['infNFe'];
       NodeNivelB.ChildNodes['ide'].AddChild('cUF').NodeValue := '51' ;
       NodeNivelB.ChildNodes['ide'].AddChild('cNF').NodeValue := '000001';
 
       vXMLDoc.SaveToFile('EnviNFe.xml');
 
  end;
  finally
     vXMLDoc.Free;
  end;
 
end;

Ps. Acrescente as units: XMLDoc, XMLIntf, xmldom.

Tags: , ,

Nota Fiscal Eletrônica (NF-e)

Notícias março 21st, 2008

Apesar de sempre ter pensado em como ficaria bom se o governo se atualiza-se tecnológicamente e abandona-se o padrão “Cnab” ou “Que Nabo!” como diz meu amigo Emerson Facunte (da Ed.Saraiva) e passasse a usar o padrão XML

Com a tecnologia da Nota Fiscal Eletrônica é exatamente isso que fizeram!. Então, porque vou protestar agora?.

Clique para continuar lendo “Nota Fiscal Eletrônica (NF-e)”

Tags: , , ,