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,
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,
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/ |