e: R3 20090311T1047">lientDataSet

Geração de chaves com master-detail e ClientDataSet

 

Neste artigo veremos

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

...

Quer ler esse conteúdo completo? Tenha acesso completo