Buscar

Relacionamento master/detail com dbexpress

Código

DELPHI 6/7 - PASSO A PASSO PARA FAZER UM RELACIONAMENTO MASTER/DETAIL com DBEXPRESS

1) Possuindo as tabelas TABELA_MESTRE e TABELA_DETALHE em seu banco de dados
e um componente SQLConnection devidamente
configurado, adicione ao seu DataModule os componentes seguintes e dê nome a eles (os nomes
deste exemplo seguem entre parênteses à frente do nome do componente):
   - Dois SQLDataSet (dst_Mestre e dst_Detalhe)
   - Um DataSetProvider (dsp_Mestre)
   - Dois ClientDataSet (cds_Mestre e cds_Detalhe)  
   - Três DataSource (dts_LinkMestre, dts_Mestre e dts_Detalhe)
2) Escreva a SQL de dst_Mestre na sua propriedade CommandText:
"SELECT <colunas_da_tabela_mestre>
FROM TABELA_MESTRE
WHERE <coluna_chave_do_relacionamento_na_tabela_mestre> = :parametro "

3) Configure na propriedade Params "parametro" conforme seu tipo, neste caso,
DataType = ftInteger.
4) Mude a propriedade DataSet de dts_LinkMestre para dst_Mestre
5) Escreva a SQL de dst_Detalhe na sua propriedade CommandText:
"SELECT <colunas_da_tabela_detalhe)
FROM TABELA_DETALHE
WHERE <coluna_chave_do_relacionamento_na_tabela_detalhe> =
 :<coluna_chave_do_relacionamento_na_tabela_mestre>
   NOTA IMPORTANTE: O nome do parâmetro na tabela detalhe tem que obrigatoriamente ser igual
ao nome da coluna a que corresponde na tabela mestre.
6) Mude a propriedade DataSource de dst_Detalhe para dts_LinkMestre
7) Mude a propriedade DataSet de dsp_Mestre dst_Mestre
8) Mude a propriedade ProviderName de cds_Mestre para dsp_Mestre
9) Adicione os TFields do cds_Mestre e note a presença de um campo novo (campo anhinhado)
que é quem será o responsável pelo relacionamento com a tabela detalhe.
10) Mude a propriedade DataSetField do cds_Detalhe, colocando nela o nome do campo anhinhado
mencionado no item anterior.
11) Mude a propriedade DataSet de dts_Mestre para cds_Mestre
12) Mude a propriedade DataSet de dts_Detalhe para cds_Detalhe
13) Adicione os TFields do cds_Detalhe

Agora é só fornecer o valor de "
parametro" (item 2) e abrir o cds_Mestre que o resto
será feito automaticamente!  

OBSERVAÇÕES
   a) Ocorrerá o erro "
dbExpress Error: Operation not supported" na abertura (Open) do
ClientDataSet mestre, caso na SQL da propriedade CommandText do SQLDataSet mestre não
contiver uma clásula WHERE com o campo chave do relacionamento. Portanto, SQL do tipo
"
SELECT * FROM TABELA_MESTRE" não é aceito. Necessariamente tem-se que colocar a cláusula
"
'WHERE CAMPO_CHAVE = '+(VALOR DO CAMPO_CHAVE)"
   b) Em decorrência da falta da cláusula WHERE na tabela mestre também ocorre o erro
"
SQL Error: Error mapping failed" na abertura (Open) do ClientDataSet detalhe.
   c) Não é preciso abrir o ClientDataSet detalhe, isto é feito automaticamente pelo Delphi
no momento que se abre o ClientDataSet mestre.
   d) Não é necessário abrir e fechar o SQLDataSet. A partir do momento que sua SQL na
propriedade CommandText esteja definida, a abertura do ClientDataSet ligada a ele abre-o e
fecha-o automaticamente. Alias, na revista ClubeDelphi há uma recomendação de se trabalhar
diretamente com o ClientDataSet. Por isso, testei alterar a SQL da propriedade CommandText
do ClientDataSet em vez de fazer na CommandText do SQLDataSet e ele funcionou perfeitamente.
Não sei se há alguma contra-indicação para isto, mas estaria de acordo com a orientação do
Guinther do Revista Clube Delphi. ATENÇÃO: para que seja possível utilizar a propriedade
CommandText do ClientDataSet (e não do SQLDataSet) é preciso colocar TRUE na propriedade
poAllowCommandText do DataSetProvider ligado ao ClientDataSet.
   e) A quem possa interessar, fiz um pequeno projeto a partir das instruções contidas no
livro do Srs. Bastiaan Pieter e Marcelo Frank (Delphi 6 Cliente/Servidor com Firebird/Interbase
- Aplicação de PDV e Controle de Estoques), que recomendo a leitura, e posso mandar em
private.
   f) Ficaria grato se me fosse reportado problemas ou outra forma de fazer este mesmo trabalho
usando outra técnica para j.b.c@terra.com.br

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Componentes
Adicionada dia: 18/11/05
Por: Marcio J Pereira
Visualizada: 23273 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009