Transferência de dados através de arquivos .txt - Parte I

Este artigo não tem a intenção de definir qual a melhor solução, e sim, mostrar como podemos trabalhar com arquivos texto neste contexto.

Transferência de dados através de arquivos .txt - Parte I




Introdução

 

            Um problema encontrado por desenvolvedores é a transferência de dados entre empresas parceiras (Ex.: Pedidos, tabelas de preço, cadastro de cliente, etc) ou entre empresas comerciais e bancos (Ex.: Arquivos de remessa e retorno de valores). 

Embora os arquivos XML sejam utilizados pelos sistemas atuais (Ex.: SNGPC/ANVISA, NF-e) para resolver este problema, existem sistemas legados (Ex.: CNAB/FEBRABAN) que ainda utilizam a geração de arquivos texto seguindo um layout pré-definido por uma ou ambas as partes.

Este artigo não tem a intenção de definir qual a melhor solução, e sim, mostrar como podemos trabalhar com arquivos texto neste contexto.

 



Tabelas utilizadas neste artigo para Transmissão e Recebimentos

 

Crie um banco de dados com o nome ClubeDelphi_Transf.fdb. Neste artigo foi utilizado o Firebrid 2.0, mas fique a vontade para utilizada o SGBD da sua preferência.

 

Tabela Cliente

 

Criando o gerador utilizado pela tabela cliente

create generator Gen_Cliente;

 

Obs1: Criamos esse gerador para acumular o último código usado pelo “Trigger”(Veja mais a frente) no momento de incluir um novo cliente.

 

Criando a tabela cliente

create table Cliente(

  Codigo integer not null,

  CPF char(14) not null,

  Nome varchar(50) not null,

  Ender varchar(50),

  Bairro varchar(30),

  Cidade varchar(30),

  UF char(2),

  DtNasc date

);

 

Obs2: Usamos dois campos para alfanumérico, o varchar e o char. A diferença entre os dois é bem simples.  Um campo varchar(50) está indicando a quantidade máxima de caracteres, mas caso você use apenas um caractere, as outras quarenta e nove posições serão “desprezadas”.  Já um campo char(14) quer dizer que se você incluir apenas um caractere, as outras trezes posições serão preenchidas com espaço.

Obs3: Após a definição do tipo dos três primeiros campos aparece “not null”.  Essa instrução informa ao Firebird que é obrigatório entrar com um valor nos mesmos para cada registro informado, ou seja, não é permitido deixá-los em branco.

 

Criando a chave primaria da tabela cliente

alter table Cliente

add primary key(Codigo);

 

Obs4: Nesse exemplo criamos uma chave primaria simples.  Caso fossemos criar uma chave composta usando, por exemplo, os campo Codigo e CPF bastaríamos, na linha, ter escrito “primary key(Codigo, CPF)”.

Obs5: Embora seja permitido criar a chave primeira junto com a criação da tabela, nesse exemplo criamos a chave primeira depois de termos criado a tabela.  Para criarmos junto com a tabela só seria preciso colocar uma virgula após a definição do campo “DtNasc” e incluir “primary key(Codigo)” como mostrado abaixo:

create table Cliente(

  Codigo integer not null,

  CPF char(14) not null,

  Nome varchar(50) not null,

  Ender varchar(50),

  Bairro varchar(30),

  Cidade varchar(30),

  UF char(2),

  DtNasc date,

  primary key (Codigo)

);

 

Criando o trigger utilizado pela tabela cliente

set term^;

 

create trigger TCliente for Cliente

active before insert position 0

as begin

  new.Codigo = gen_id(Gen_Cliente, 1);

end;

 

Obs6: O Firebird não possui um campo do tipo Autoincremente, mas podemos driblar isso com o uso do “Trigger” como mostrado acima.

Obs7: A linha “create trigger TCliente for Cliente” manda o SGBD criar um “Trigger” com o nome “TCliente” para a tabela “Cliente”.

Obs8: A linha “active before insert” pede que esse “Trigger” seja acionado antes de se inserir um novo registro.  O comando “position 0” informa que caso exista mais de um “active before insert”, esse será o primeiro a ser executado.  Caso existisse um segundo “active before insert” o comando irá aparecer “position 1”.

Obs9: O “begin... end” informa o inicio e o fim de um bloco de código.

Obs10: A linha “new.Codigo = gen_id(Gen_Cliente, 1);” utilize a função “gen_id( )” para incrementar em 1(um) o gerador “Gen_Cliente”(criado anteriormente) e jogar esse valor no campo “Codigo” do novo registro.

 

Tabela Produto

 

Criando a tabela produto

create table Produto(

  Codigo varchar(13) not null,

  Descr varchar(50) not null,

  Valor numeric(15, 2) not null

);

 

Criando a chave primaria da tabela produto

alter table Produto

add primary key(Codigo);

 

            Após ter criado as tabelas, trigger e generators, faça uma cópia da base e renomeia para ClubeDelphi_Rec.fdb, essa base será usada para receber os dados gerados.  Vale ressaltar que embora a base de recebimento seja igual a de transferência(nome das tabelas, campos, tipos e tamanhos), nem sempre isso acontece na vida real.

 



Incluindo Dados na Base de Transmissão

 

            Vamos agora alimentar a base ClubeDelphi_Transf.fdb com alguns registros como mostrado a seguir:

 

Incluindo registros na tabela cliente

 

insert into Cliente(CPF, Nome, Ender, Bairro, Cidade, UF, DtNasc)

values ('111.111.111-11', 'Jose da Silva', 'Rua da Flores, 123', 'Romeirao', 'Juazeiro do Norte', 'CE', '12/31/1970');

commit;

 

insert into Cliente(CPF, Nome, Ender, Bairro, Cidade, UF, DtNasc)

values ('222.222.222-22', 'Maria da Silva', 'Rua Sao Pedro, 234', 'Centro', 'Juazeiro do Norte', 'CE', '02/28/1975');

commit;

 

insert into Cliente(CPF, Nome, Ender, Bairro, Cidade, UF, DtNasc)

values ('333.333.333-33', 'Joao Carvalho', 'Rua Sao Jose, 345', 'Salesianos', 'Juazeiro do Norte', 'CE', '10/01/1980');

commit;

 

insert into Cliente(CPF, Nome, Ender, Bairro, Cidade, UF, DtNasc)

values ('444.444.444-44', 'Joana Alencar', 'Rua Padre Cicero, 456', 'Matriz', 'Juazeiro do Norte', 'CE', '01/10/1985');

commit;

 

Obs11: Não foi informado o campo “Codigo” pois o mesmo será gerado pelo trigger da tabela.

Obs12: Note que a data está no formato MM/DD/AAAA, este é o formato aceito pelo comando insert para data quando se utiliza a barra “/”.

Obs13: Como esses dados são apenas para questões didáticas, os CPF informados são inválidos.

 

Incluindo registros na tabela produto

 

insert into Produto(Codigo, Descr, Valor)

values ('1234567890123', 'Telefone XT-72', 83.99);

commit;

 

insert into Produto(Codigo, Descr, Valor)

values ('2345678901234', 'Celular RM-50', 390.5);

commit;

 

insert into Produto(Codigo, Descr, Valor)

values ('3456789012345', 'Carregador para celular MP-65', 78);

commit;

 

insert into Produto(Codigo, Descr, Valor)

values ('4567890123456', 'Bateria para celular FL-900', 102.05);

commit;

 

insert into Produto(Codigo, Descr, Valor)

values ('5678901234567', 'Celular XR-60', 1050.55);

commit;

 

Obs14: Verifique que usamos o sinal de ponto no lugar da vírgula como símbolo decimal e que o símbolo de agrupamento de dígitos inexiste.

 

Artigo criado por http://www.cassic.com.br/

 

Artigos relacionados