Automação comercial com VB, VB.NET e C# - Parte IV


Sem duvida o protocolo XML hoje é um padrão entre os desenvolvedores .NET o que permite em muito a utilização de vários tipos de dados e uma “Typeficação” mais livre no momento de acessar aos dados, passar parâmetros e tratar a informação, oferecendo maior liberdade ao programa aplicativo em suas decisões, navegabilidade e porte dos dados. Hoje existem vários protocolos XML para cada segmento em especifico – Floricultura, Cálculos Matemáticos, Informações médias, tudo o que você necessita para troca de dados em XML, porem até o momento não existia o XML para Acesso a periféricos de automação comercial e troca de dados entre os mesmos.

Desde Outubro do ano passado estive pessoalmente envolvido na aprovação de um protocolo XML para Automação Comercial o que já está acontecendo e aos poucos estamos vendo o protocolo nascer e se tornar um padrão de acesso aos periféricos de Automação Comercial. Com isso analisaremos aqui a estrutura do Arquivo XML pra Automação Comercial, seu protocolo e o objetivo de cada TAG XML.

 

Uma rápida introdução ao XML

 

Primeiramente vamos antes de mais nada preparar nosso ambiente para a validação de nosso arquivo XML. Você poderá faze-lo usando o próprio Browser.

Instale o Arquivo os aplicativos que permitem a validação do XML utilizando o próprio Internet Explorer, para isso certifique-se de estar utilizando a ultima versão do IE com seus respectivos Service Packs, nada melhor do que utilizar Windows UpDate para isso.

Após isso instale os pacotes de utilitários para validação de XML no próprio Browser iexmltls.exe  e o msxml3msms.EXE  que permitira que com um click no botão direito do Browser apareça a opção “XML VALIDATE” e “XSL OutPut”.

 

OBS: estes aquivos de instalação você poderá baixar também no site www.daruma.com.br na área de downloads exclusiva para desenvolvedores ou uma rápida procura no site da microsoft.com/xml

 

Após isso certifique-se que estas opções estejam aparecendo em seu Browser:

 

O Arquivo XML para ser utilizado em seu destino final, que em nosso caso é a comunicação com o ECF através de um Protocolo XML, existe a necessidade de passar por dois tipos de verificação, vamos chamar assim.

 

1) Se o Documento é Valido – Um documento Válido é aquele que segue as normas do Padrão XML estabelecidas pelo Órgão w3c (www.w3c.org) com Tags Root, com Tags mães e filhas todas abrindo  e fechando, gerando o que chamamos de nós do Arquivo XML. Um Exemplo de um Arquivo XML Valido é o arquivo abaixo, vamos imaginar que estamos montando um arquivo XML onde irá trafegar os dados de um Veiculo:

 

<VEICULO>

                <MODELO>GOL</MODELO>

            <PLACA>AGP1298</PLACA>

            <ANO>1998</ANO>

</VEICULO>

 

Este documento acima é valido e obedece as regras XML não somente pela formatação mas pelos tipos de letras e números que são utilizados uma vez que o Padrão XML também possui palavras reservadas e as mesmas devem ser obedecidas. Por exemplo não se pode utilizar “<” dentro de valores das TAGs uma vez que este símbolo serve para indicar o inicio de uma tag. Para o uso de palavras reservadas e símbolos especiais dentro de valores de uma TAG existe a necessidade de utilizar-se de símbolos como # e &. Mas não vamos entrar aqui neste detalhe, o objetivo é mostrar o que é um Arquivo XML Válido.

 

Um Arquivo XML não válido é o seguinte arquivo:

<VEICULO>

                <MODELO>GOL

            <PLACA>AGP1298

            <ANO>1998</ANO>

            </MODELO>

<VEICULO>

 

 

2) Um segundo nível de validação do Arquivo XML é se o mesmo está BEM-FOMATADO, ou seja, se o arquivo foi formatado e construído de acordo com um “manual”, “fôrma” ou Template que você define, neste caso não entra em jogo as regras definidas pelo W3C e sim as que você definir que devem ser, claro que sempre obedecendo aos padrões de TAGS definidos pelo W3C, mas a questão é que seu arquivo de formatação é livre para que você decida como o usuário deve escrever o XML final. Fazendo uma pequena analogia este processo é parecido aos processo de um Documento Word com um Template definido de documento, o usuário  - uma vez aberto o arquivo .DOC baseado em um Template -  deverá redigir o documento de acordo com o que está definido e regido pelo Template.

O Mesmo se dá com o arquivo XML ele é o .DOC e o Template do arquivo .XML é o DTD(Definição de Tipo de Documento) ou um outro tipo de Template XML chamado de SCHEMA.

Se o Arquivo XML estiver construído com base no DTD, de forma correta e obedecendo a suas regras, o mesmo será considerado um XML BEM-FORMATADO.

Lembrando sempre que no começo do Arquivo XML é indicado onde está o Template para que o XML seja Validado.

 

Um Exemplo de Documento Bem formatado:

Imagine o exemplo anterior da concessionária:

O DTD de tal XML seria o seguinte

 

Nome do Arquivo: Concessionária.DTD

 

<!--Elemento DTD para validacao do Consessionaria.XML-->

<!--Daruma Automacao - Patente requerida e Direitos Autorais reservados-->

<!--Autor - Claudenir C. Andrade  claudenir@daruma.com.br-->

<!--Direitos de Uso reservados para DARUMA TELECOMUNICAcoes A AUTOMACAO-->

<!--*********************************************************************************************-->

<!ELEMENT CONSESSIONARIA ANY>

  <!ELEMENT VEICULO (MODELO,PLACA,ANO)>

  <!ELEMENT MODELO (#PCDATA)>

  <!ELEMENT PLACA (#PCDATA)>

  <!ELEMENT ANO (#PCDATA)>

 

O DTD acima indica que temos uma TAG Root Chamada VEICULO e abaixo dela, ou dentro dela com tags filhas, as tags MODELO, PLACA e ANO que aceitam texto como tipo de dados.

 

O Arquivo XML bem-formatado, baseando-se e levando em consideração as regras do DTD será o seguinte arquivo abaixo:

 

<?xml version="1.0" encoding="ISO8859-1"?>

<!DOCTYPE CONSESSIONARIA SYSTEM "CONSESSIONARIA.DTD">

<CONSESSIONARIA>

   <VEICULO>

            <MODELO>GOL</MODELO>

            <PLACA>AGP1298</PLACA>

            <ANO>1998</ANO>

     </VEICULO>   

</CONCESSIONARIA>

  

 

 

Note que na segunda linha do cabeçalho de nosso arquivo XML está sendo indicando onde está o Arquivo DTD que irá Validar nosso XML.

 

DPOSXMLBR  - Daruma Point Of  Sales XML BRasil

 

DPOSXMLBR, este é o nome com que está sendo homologado o padrão XML para acesso a periféricos de Automação Comercial aqui no Brasil.

 

A Estrutura, ou nós, de Tags do Cupom Fiscal dentro do DPOSXMLBR sou a seguinte.

 

<?xml version="1.0" encoding="ISO8859-1"?>

<!DOCTYPE DPOSXMLBR SYSTEM "DPOSXMLBR.DTD">

<DPOSXMLBR>

<ECF>

      <CUPOMFISCAL>

                <ABRECUPOM>

                </ABRECUPOM>

                <VENDEITEM>

                </VENDEITEM>

                <FECHACUPOM>

                                <INICIAFECHAMENTO>

                              </INICIAFECHAMENTO>

                                <EFETUAFORMA>

                                </EFETUAFORMA>

                                <CONSUMIDOR>

                                </CONSUMIDOR>   

                  </FECHACUPOM>

        </CUPOMFISCAL>

</ECF>

</DPOSXMLBR>

 

 

Esta é a estrutura principal de uma das primeiras seqüências de comandos homologadas, a seqüência de comandos do Cupom Fiscal!! Claro que cada TAG acima tem suas tags filhas, que baseado no que explicamos anteriormente sobre o XML, observando o DTD abaixo (que será usado para Validar nosso Comando de Cupom Fiscal para o ECF) você poderá identificar as tags filhas que deve conter nosso XML. Observe que também na segunda linha de nosso Arquivo XML esta contido o DTD que irá validar nosso Arquivo de Cupom XML.

 

<!--Elemento DTD para validação do DPOSXML-->

<!--Daruma Automação - Patente requerida e Direitos Autorais reservados-->

<!--Autor - Claudenir C. Andrade  claudenir@daruma.com.br-->

<!--Direitos de Uso reservados para DARUMA TELECOMUNICACOES E AUTOMACAO-->

<!--*********************************************************************************************-->

<!ELEMENT DPOSXMLBR ANY>

 <!ELEMENT ECF ANY>

  <!ELEMENT CUPOMFISCAL (ABRECUPOM?,VENDEITEM?,FECHACUPOM?)*>

  

   <!ELEMENT ABRECUPOM (ABRECUPOMID?)>

     <!ELEMENT ABRECUPOMID (#PCDATA)> 

  

   <!ELEMENT VENDEITEM (CODIGO,DESCRICAO,ALIQUOTA,QUANTIDADE?,VALORUNITARIO,CUPOMVALORAD?)>

     <!ELEMENT CODIGO (#PCDATA)>

     <!ELEMENT DESCRICAO (#PCDATA)>

     <!ELEMENT ALIQUOTA (#PCDATA)>

     <!ELEMENT QUANTIDADE (#PCDATA)>  

      <!ATTLIST QUANTIDADE tipoquantidade (I|F|i|f) "I">

     <!ELEMENT VALORUNITARIO (#PCDATA)>

      <!ATTLIST VALORUNITARIO casasdecimais (2|3) "2">

     <!ELEMENT CUPOMVALORAD (#PCDATA)>

      <!ATTLIST CUPOMVALORAD  ad (A|D|a|d) "D"

                            tipoad (P|V|p|v) "v" >

      

   <!ELEMENT FECHACUPOM (INICIAFECHAMENTO?,EFETUAFORMA?,CONSUMIDOR?,MSGPROMO?)*>

     <!ELEMENT INICIAFECHAMENTO (FECHAVALORAD)>

       <!ELEMENT FECHAVALORAD (#PCDATA)>

        <!ATTLIST FECHAVALORAD ad (A|D|a|d) "D"

                           tipoad (P|V|p|v) "v">

     <!ELEMENT EFETUAFORMA (FORMA+,VALORFORMA+)*>

       <!ELEMENT FORMA (#PCDATA)>

        <!ATTLIST FORMA descricao CDATA "">

       <!ELEMENT VALORFORMA (#PCDATA)>

     <!ELEMENT CONSUMIDOR (CONSUMIDORID+)>

       <!ELEMENT CONSUMIDORID (#PCDATA)>

     <!ELEMENT MSGPROMO (#PCDATA)>

 

 

Vamos então construir nosso primeiro comando de comunicação com o ECF, onde será  abertura de um Cupom Fiscal, a Venda de um Item e o Fechamento de um cupom fiscal.

 

Vamos verificar como fazer isso em C#.

 

Passo 1  -  Abra um novo projeto no C#, Windows Application

Passo 2  - Vamos criar um Botão com o Caption  “DPOSXMLBR”

Passo 3  - Faça dois clicks no Botão e adicione no cabeçalho do código fonte (área dos NameSpaces) o seguinte namespace “Using System.XML;”

Passo 4-  Adicione ao Evento Click do Botão o seguinte código abaixo

 

private void button1_Click(object sender, System.EventArgs e)

{

//Claudenir Campos Andarde  - XML para Automacao Comercial

//01/01/2004  - claudenir@daruma.com.br

 

//Cria o Aquivo XML e indica o Encoding do Arquivo que neste caso será NULL

XmlTextWriter Daruma_Xml = new XmlTextWriter("CUPOMFISCAL.XML",null);

Daruma_Xml.Formatting = Formatting.Indented;

Daruma_Xml.WriteStartDocument();

               

Daruma_Xml.WriteStartElement("DPOSXMLBR");//<DPOSXMLBR>

 Daruma_Xml.WriteStartElement("ECF");//<ECF>

  Daruma_Xml.WriteStartElement("CUPOMFISCAL");//<CUPOMFISCAL>

  

   Daruma_Xml.WriteStartElement("ABRECUPOM");//<ABRECUPOM>

    Daruma_Xml.WriteStartElement("ABRECUPOMID");//<abrecupomid>

                Daruma_Xml.WriteString("1234567890");

    Daruma_Xml.WriteEndElement();//</abrecupomid>

   Daruma_Xml.WriteEndElement();//</ABRECUPOM>

 

   Daruma_Xml.WriteStartElement("VENDEITEM");//<VENDEITEM>

Daruma_Xml.WriteStartElement("CODIGO");//<Codigo>

                                Daruma_Xml.WriteString("1234");

                Daruma_Xml.WriteEndElement();//</codigo>

                Daruma_Xml.WriteStartElement("DESCRICAO");//<Descricao>

                                Daruma_Xml.WriteString("Leite");

                Daruma_Xml.WriteEndElement();//</Descricao>

                Daruma_Xml.WriteStartElement("ALIQUOTA");//<Aliquota>

                                Daruma_Xml.WriteString("FF");

                Daruma_Xml.WriteEndElement();//</Aliquota>

                Daruma_Xml.WriteStartElement("QUANTIDADE");//<Quantidade>

                   Daruma_Xml.WriteAttributeString("tipoquantidade","I");              

                   Daruma_Xml.WriteString("10");

                Daruma_Xml.WriteEndElement();//</Quantidade>

                Daruma_Xml.WriteStartElement("VALORUNITARIO");//<ValorUnitario>

                                Daruma_Xml.WriteAttributeString("tipoquantidade","2");

                                Daruma_Xml.WriteString("1,00");

                Daruma_Xml.WriteEndElement();//</ValorUnitario>

                Daruma_Xml.WriteStartElement("CUPOMVALORAD");//<CupomValorAD>

                                Daruma_Xml.WriteAttributeString("ad","A");     

                                Daruma_Xml.WriteAttributeString("tipoad","V");              

                                Daruma_Xml.WriteString("0");

                Daruma_Xml.WriteEndElement();//</CupomValorAD>

  Daruma_Xml.WriteEndElement();//</VENDEITEM>

 

 Daruma_Xml.WriteEndElement();//</CUPOMFISCAL>

Daruma_Xml.WriteEndElement();//</ECF>

Daruma_Xml.WriteEndElement();//</DPOSXMLBR>

 Daruma_Xml.WriteEndDocument();

 Daruma_Xml.Close();

}

 

Execute seu aplicativo.

Será criado o Arquivo CUPOMFISCAL.XML no diretório BIN\DEBUG de seu projeto.

 

Passo 5  -  Copie o Arquivo DPOSXMLBR.DTD para o mesmo diretório

Passo 6  -  Faça dois clicks no Arquivo CUPOMFISCAL.XML que foi criado

Passo 7  -  Faça um click como Botão Direito do Mouse e escola a opção XML VALIDATE

 

E aparecera a seguinte mensagem:

 

 

É claro que a codificação do XML para automação comercial ainda esta engatinhando, porém a passos largos, esperamos até o mês de MARÇO já ter o Padrão estabelecido e com classes e métodos mais fáceis de serem utilizadas pelos programadores que fazem uso do XML em vários pontos do código fonte.

 

Espero que você tenha ficado animado com as possibilidades na Automação Comercial, agora com o XML, na DARUMA32.DLL existe uma função chamada DARUMA_XML_SEND onde você passa como parâmetro o Path do arquivo XML que você deseja enviar para o ECF e será criado um Arquivo XML de retorno com seus respectivos ST1 e ST2, experimente!
 

Estamos montando grupos de testes para o Padrão XML e aqueles que desejarem se candidatar, estamos a disposição!!

 

Um abraço a todos!! 


Claudenir Andrade é formado pela Academia de Sistemas Informáticos de Madrid, trabalha com automação comercial há Nove Anos anos, foi responsável pela Homologação e aprovação de ECFs Brasileiros em Paises como Equador e Venezuela, gerencia a equipe de desenvolvimento da Daruma Automação, autor do primeiro livro de automação comercial no Brasil – “Automação Comercial com VB.Net e C#”. É MVP da Microsoft, Está criando e definindo o Modelo XML para Automação Comercial, escreve artigos para o site MSDN e pode ser contatado pelo e-mail – claudenir@daruma.com.br.