Esse artigo faz parte da revista Clube Delphi Edição 84. Clique aqui para ler todos os artigos desta edição

-font-style: normal">cobrança escritural, os arquivos texto trocados entre empresas e bancos contém informações necessárias para emissão, cobrança e baixa de boletos bancários.

Tipos de cobrança, dias para protesto e cálculo de juros, são apenas algumas dos dados contidos no arquivo. Esses arquivos ainda seguem o padrão CNAB estabelecido pela FEBRABAN (Federação dos Bancos) assim como outros órgãos tais como: ABAC, ANFAVEA, SINDIPEÇAS e etc.

Vale lembrar que os tais arquivos só funcionam se houver uma boa documentação e se seguirem rigorosas regras de validação e checagem dos bytes envolvidos na transmissão. Para entendermos melhor como funcionam e onde se aplica essa tecnologia elaborei um exemplo de envio de notas fiscais a uma empresa de contabilidade. Mãos na massa!

 

Preparando o banco de dados de exemplo

Para este exemplo, criaremos um banco de dados utilizando o Firebird 1.5 e uma tabela de Notas Fiscais com alguns registros. A estrutura do banco encontra-se no script da Listagem 1.

 

Listagem 1. Criação do banco de dados e tabela

SET NAMES WIN1251;

 

CREATE DATABASE 'localhost:<caminho>\EDI.FDB'

USER 'SYSDBA' PASSWORD 'masterkey'

PAGE_SIZE 4096

DEFAULT CHARACTER SET WIN1251;

 

CREATE TABLE NOTASFISCAIS (

  NUMERO            DOUBLE PRECISION NOT NULL,

  DOCUMENTO         VARCHAR(2),

  SERIE             VARCHAR(2),

  DATA_EMISSAO      DATE,

  UF_DESTINO        VARCHAR(2),

  NOME_RESPONSAVEL  VARCHAR(31),

  UF_RESPONSAVEL    VARCHAR(2),

  CGC_PAGADOR       VARCHAR(18),

  CGC_EMITENTE      VARCHAR(18),

  IE_RESPONSAVEL    VARCHAR(18),

  CFOP              VARCHAR(6),

  TOTAL_NOTA        NUMERIC(15,2),

  BASE_DE_CALCULO   NUMERIC(15,2),

  ALIQUOTA          NUMERIC(15,2),

  VALOR_IMPOSTO     NUMERIC(15,2),

  DIVERSOS          NUMERIC(15,2),

  BASE_IPI          NUMERIC(15,2),

  NAO_TRIBUTADO     NUMERIC(15,2),

  IPI               NUMERIC(15,2),

  OBS               VARCHAR(62)

);

ALTER TABLE NOTASFISCAIS

ADD CONSTRAINT PRIMARIO_PK

PRIMARY KEY (NUMERO);

 

Com o banco de dados criado vamos ao exemplo em si. Recomendo a abertura do Delphi 7, um novo projeto e a criação de uma janela semelhante à Figura 1.

 

Figura 1. Exemplo da layout do projeto

 

O filtro utilizado para selecionar as notas fiscais a serem geradas, nesse caso, é baseado apenas na data de emissão das mesmas. Porém é bom ter em mente que cada caso requer uma atenção especial afim de selecionar as informações corretas e coerentes para popular o arquivo de EDI.

Antes de começamos a desenvolver a rotina para filtragem e geração do em si, precisamos preparar quatro procedures que auxiliarão na confecção correta das strings usadas no preenchimento do texto. São elas:

·         PadL: usada para alinhar os textos à esquerda. Tem como função inserir caracteres em branco à direita da string até o limite estabelecido no segundo parâmetro;

·         PadR: o contrário da PadL, ou seja, é usada para alinhar os textos à direita. Isso significa que a função insere caracteres em branco à esquerda da string até o limite estabelecido no segundo parâmetro;

·         LimparString: será usada para retirar caracteres especiais da string, como: pontos, traços ou barras. Ideal para limpar máscaras de CNPJ, CPF etc.;

·         IncluirPonto: em alguns campos de valor será necessário formatar incluindo pontos de decimal e milhar.

Para incluí-las no projeto declare-as na seção public ou private do formulário principal conforme a Listagem 2 e pressione CTRL+SHIFT+C para que o Delphi crie o cabeçalho das mesmas.

   

Listagem 2. Declaração das funções auxiliares

function PadL(ATexto: string;

  ATamanho: Integer): string;

function PadR(ATexto: string;

  ATamanho: integer): string;

function LimparString(ATexto,

  ACaracteres: string): string;

function IncluirPonto(ATexto: string): string;

 

O código completo da implementação das procedures pode ser verificado na Listagem 3.

 

Listagem 3. Funções auxiliares

function TfrmPrincipal.PadR(ATexto: string;

  ATamanho: integer): string;

var

  i: integer;

begin

  Result := ATexto;

...

Quer ler esse conteúdo completo? Tenha acesso completo