Geração de chaves com master-detail e ClientDataSet
· Geração de tabelas, generators e Stored Procedure em banco de dados Firebird;
· Criação de servidor de aplicação;
· Geração das chaves através de eventos do DataSetProvider;
· Criação da aplicação cliente e conexão através de DataSnap;
· Configuração do ClientDataset para gravação dos dados.
Qual a finalidade?
· Definir uma estrutura para se trabalhar com relacionamentos master-detail através do ClientDataSet onde as chaves primárias são geradas automaticamente pelo banco de dados.
Quais situações utilizam esses recursos?
· Relacionamentos master-detail onde as chaves são geradas pelo banco de dados através de generators.
Resumo do DevMan
Uma das maiores dificuldades dos desenvolvedores é sem dúvida quando temos dependências de chaves em um relacionamento master-detail do tipo Pedido x ItensPedido. Nesses casos precisamos passar para a tabela de detalhe a chave primária da tabela master, porém essa chave é gerada através de uma trigger (gatilho) que está no banco de dados. Isso cria uma dificuldade aos desenvolvedores para se ter controle sobre o processo, pois parte dele fica no banco de dados. Sendo assim se acaba optando por outras técnicas mais trabalhosas que podem deixar a aplicação com falhas no processo.
Neste artigo iremos criar toda uma estrutura para se trabalhar um relacionamento master-detail onde as chaves são geradas pelo banco de dados e teremos o controle dessa geração através de uma aplicação multi-camadas com a utilização dos componentes DataSetProvider e ClientDataSet.
Todos nós sabemos ou pelo menos deveríamos saber que boa parte de um sistema baseia-se em master-detail. Para os iniciantes, master-detail significa mestre-detalhe, ou seja, tabelas que dependem de outras tabelas para fazerem sentido. Alguns exemplos são clássicos tais como Notas Fiscais e Itens da Nota Fiscal. Evidentemente que em um sistema emissor de Notas Fiscais precisaremos de duas tabelas, como mencionado a pouco. A primeira tabela conterá o cabeçalho da nota. São os dados fixos, essenciais como, por exemplo, Razão Social, Endereço, Valor Total da Nota, CNPJ do Cliente, CNPJ do Fornecedor, entre outros. A segunda tabela refere-se aos itens dessa nota, que são variáveis e podem ser mais de um. Por isso dizemos que seu relacionamento é 1:n, ou, 1 para muitos. Em uma nota fiscal podemos vender mais de um item, por isso 1 para muitos.
Para os mais experientes, isso tudo não é novidade. O que muitos, até mesmo experientes, sentem dificuldade no dia-a-dia é o controle das chaves que fazem a ligação entre ambas tabelas. Os exemplos que dei aqui são apenas entre duas tabelas, mas imaginem diversas tabelas interligadas. Como controlar tantas chaves?
A idéia desse artigo é sanar as principais dúvidas referentes ao assunto e demonstrar técnicas para utilização de chaves com ClientDataSet.
Para isso iniciaremos o nosso exemplo construindo um banco de dados com uma estrutura para que se possa simular a situação na qual o nosso exemplo propõe. Em nosso exemplo iremos utilizar o Firebird como banco de dados.
Nota: Não entrarei em detalhes quanto ao download e instalação do banco de dados por não fazer parte do escopo desse artigo, porém a dica é efetuar o download do Firebird no site do desenvolvedor em www.firebirdsql.org.
Criando o banco de dados
Como mencionado vamos criar um BD no Firebird. Para isso, basta digitar o script da Listagem 1 no seu programa preferido para rodar scripts e executar. Em nosso script criamos um banco utilizando o Dialect 3, Page Size 8192 e o Character Set como nenhum (None). No endereço do banco colocamos ‘127.0.0.1:<caminho>DBExemplo.fdb’, onde 127.0.0.1 é o host (servidor) do banco, <caminho> deve ser trocado pela letra de drive e diretório onde deseja salvar o arquivo do BD e por fim o nome desse BD. Além dessas informações também é possível colocar a porta do servidor junto ao host, por exemplo: 127.0.0.1/3050.
Listagem 1. Script de criação do banco de dados
SET SQL DIALECT 3;
CREATE DATABASE '127.0.0.1:<Caminho>DBEXemplo.fdb'
USER 'SYSDBA'
PAGE_SIZE 8192
DEFAULT CHARACTER SET NONE;
Enfim, troque a string '127.0.0.1:<Caminho>DBEXemplo.gdb' pelo caminho e nome de banco de dados que desejar. Em seguida criaremos as tabelas. São elas: TB_CLIENTE, TB_VENDEDOR, TB_PRODUTO, e TB_ITEMPEDIDO. O objetivo básico do exemplo será efetuar a inclusão de um pedido onde teremos itens de pedido vinculados e também onde a chave primária do pedido será gerada pelo banco de dados em uma trigger. Porém a tabela TB_ITEMPEDIDO dependerá da chave primária gerada pela tabela master para a gravação dos dados. Na Listagem 2 temos o script para criação das tabelas, chaves primárias, chaves secundárias e generators.
Listagem 2. Script de criação das tabelas de banco de dados
01 CREATE TABLE TB_CLIENTE (
02 ID_CLIENTE INTEGER NOT NULL,
03 NM_CLIENTE VARCHAR(50)
04 );
05
06 CREATE TABLE TB_ITEM_PEDIDO (
07 ID_PEDIDO INTEGER NOT NULL,
08 ID_ITEM INTEGER NOT NULL,
09 QTD INTEGER,
10 PRECO_UNIT FLOAT
11 );
12
13 CREATE TABLE TB_PEDIDO (
14 ID_PEDIDO INTEGER NOT NULL,
15 ID_CLIENTE INTEGER,
16 ID_VENDEDOR INTEGER,
...