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>

Para usar o código abaixo; copie e salve o XML acima em uma pasta temporária (Ex.: c:\tempo); em seguida, abra um novo form no Delphi e adicione ali um campo “memo” e um botão; copie o codigo abaixo e insira no evento “OnClick” do botão. Não se esqueça de verificar o nome do arquivo e a pasta na linha “LoadFromFile” do XML.

Inclua na cláusula uses as units: xmldoc e XMLIntf.

02 – Exemplo de Código usando o TMLDocument (Delphi) para ler o arquivo XML do WINMFD2:

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
procedure TForm1.ButtonClick(Sender: TObject);
var vXMLDoc: TXMLDocument;
    No_cupomfiscal,No_vendadeitem: IXMLNode;
begin
  vXMLDoc := TXMLDocument.Create(self);
  Try
  vXMLDoc.LoadFromFile('c:\tempo\cupons_winmfd2.xml');
  vXMLDoc.Active := True;
 
  Memo1.Lines.Clear;
 
  // Cupom Fiscal
  No_cupomfiscal := vXMLDoc.DocumentElement.ChildNodes.FindNode('cupom_fiscal');
  if Not (No_cupomfiscal = nil) then
  begin
  No_cupomfiscal.ChildNodes.First;
  repeat
    Memo1.lines.Add( 'Cupom Fiscal ------------------------------' );
    // Lendo conteudo agora embutido no node No_dadosgerais;
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['hora_inicio'].text);
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['coo'].text);
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['ccf'].text);
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['subtotal'].text);
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['acrescimo'].text);
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['desconto'].text);
    Memo1.Lines.Add( No_cupomfiscal.ChildNodes['total'].text);
    //...
 
    // Venda Item
    No_vendadeitem := No_cupomfiscal.ChildNodes.FindNode('venda_de_item');
    if Not (No_vendadeitem = nil) then begin
       No_vendadeitem.ChildNodes.First;
       repeat
         Memo1.Lines.Add(No_vendadeitem.ChildNodes['ordem'].text+' '+
         No_vendadeitem.ChildNodes['codigo'].text+' '+
         No_vendadeitem.ChildNodes['descricao'].text+' '+
         No_vendadeitem.ChildNodes['quantidade'].text+' '+
         No_vendadeitem.ChildNodes['valor_unitario'].text+' '+
         No_vendadeitem.ChildNodes['valor_bruto'].text+' '+
         No_vendadeitem.ChildNodes['aliquota'].text
         );
         //..
         No_vendadeitem := No_vendadeitem.NextSibling;;
       until No_vendadeitem = nil;
    end;
 
    No_cupomfiscal := No_cupomfiscal.NextSibling;
 
  until No_cupomfiscal = nil;
  end;
  finally
      VXMLDOC.Free;
  end;
end;

Posts Relacionados

Tags: , , ,



3 Comentários to “Lendo o XML gerado pelo WINMFD2 da Bematech”

  1. Berdam | novembro 17th, 2009 at 7:16

    Olá Caio blz.
    Tempos atrás postei dúvidas sobre a nfe aqui no seu blog. Muitas delas vc me ajudou, obrigado por tudo.

    Mas como todos evoluem, agora temos o tal do Sped Fiscal.

    Vc tem alguma informação sobre isso ?? Sei que existe uma dll que auxilia na geração do arquivo.

    Se vc souber, existe alguma possibilidade de geração de determinado bloco por um sistema e a geração de outros blocos por outro sistema, e posteriormente fazer a junção desses dois arquivos ??

    Oque acontece aqui na região é que o pessoal possui mais que um software na empresa, cada um controlando uma parte diferente, sendo que dificulta o processo de geração do Sped em apenas um programa.

    Bom, minha dúvida é isso, obrigado desde já.

  2. Jamil Alves Fonseca | novembro 28th, 2009 at 14:06

    Como posso fazer pra ler essa tag opcionais tipo dar um loop e ir lendo o codigo e o nome e adicionando isso a uma tabela… se puder me ajudar ficarei muito agradecido

    -

  3. Jamil Alves Fonseca | novembro 28th, 2009 at 14:08

    nao estou conseguindo enviar o formato da tag…mais estou enviando por email tbm

Faça um comentário