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
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo