Esse artigo faz parte da revista Clube Delphi edição 31. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.
 

Sistema Datacar

Criação de um sistema completo com Delphi/Kylix

Parte III – Cadastros Mestre/Detalhe

No primeiro artigo desta série, na Edição 29, apresentamos o sistema Datacar, modelamos as tabelas, criamos o banco de dados, e construímos o formulário principal e um formulário base de cadastro. No segundo artigo (Edição 30), adicionamos funcionalidades ao formulário de cadastro, construímos um Data Module, com os componentes de acesso a dados dbExpress, e criamos os primeiros formulários de cadastros.

Os formulários criados, de Marcas e de Modelos, eram bastante simples. A maior complexidade estava no formulário de Modelos, onde havia uma procura para informar a marca do veículo. Nesta terceira parte, mostraremos técnicas para o desenvolvimento de formulários que possuem relacionamentos do tipo Mestre/Detalhe (ou Master/Detail) usando a linguagem SQL e componentes de acesso a dados.

Relacionamentos Mestre/Detalhe

Relacionamentos Mestre/Detalhe são do tipo um-para-muitos, ou seja, onde um registro (chamado Mestre) possui ligação a outros n registros de uma outra tabela (chamados de Detalhe). Um exemplo disto é a relação existente entre as tabelas CLIENTES e VEICULO_ATUAL, onde um cliente pode possuir diversos veículos, ou ainda a relação existente entre VEICULO_ATUAL e ACESSORIOS_VEICULO.

SQL de clientes

A maneira de acessar corretamente um registro de uma tabela já foi largamente discutida no segundo artigo. Neste artigo, descreveremos novamente, passo a passo, como é feito este acesso apenas para a tabela de Clientes. Para as demais, mostraremos apenas o código da instrução SELECT, bastando ao leitor seguir os passos mostrados no artigo anterior (e aqui relembrados) para fazer o acesso.

Abra o Data Module (que chamamos de DM), acrescente um SQLDataSet e um SQLConnection (paleta dbExpress) e configure suas propriedades Name para dst_clientes e SQLConnect, respectivamente. Abra o editor da propriedade CommandText e digite a seguinte instrução SQL:

 

select CL.*, CD.NOME_CIDADE

from CLIENTES CL

inner join CIDADES CD on CD.COD_CIDADE = CL.COD_CIDADE

where COD_CLIENTE =:COD_CLIENTE

 

A parte CL.* informa ao servidor que queremos que ele nos traga todos os campos da tabela CLIENTES (representada por CL).

Abra a propriedade Params de dst_clientes selecione o parâmetro no editor, configurando sua propriedade DataType para ftInteger. Adicione ao DM um componente DataSetProvider (paleta Data Access) e configure sua propriedade Name para dsp_clientes, e aponte sua propriedade DataSet para dst_clientes.

Acesso a dados de Clientes

Acrescente também um ClientDataSet (paleta Data Access) no DM, definindo sua propriedade Name para cds_clientes e ProviderName para dsp_clientes. Dê um clique com o botão direito sobre este componente e escolha a opção FetchParams. Em seguida, dê um duplo clique sobre ele e no editor de campos aperte CTRL+F para que todos os campos sejam adicionados.

Configure a propriedade Required do campo COD_CLIENTE como False (o valor deste campo é dado pelo sistema) e como True para os campos NOME_CLIENTE, ENDERECO e NOME_CIDADE. Configure também a propriedade EditMask dos campos do tipo data. Coloque máscaras de entrada para o campo CEP (00.000-999;0;_ ) e CPF (000.000.000-00;0;_).

Para configurar as instruções de INSERT, UPDATE e DELETE, dê um duplo clique em dst_clientes e, no editor de campos, aperte CTRL+F. Selecione então todos os TFields, exceto COD_CLIENTE, e configure a propriedade ProviderFlags.pfInWhere para False. Selecione apenas o campo NOME_CIDADE e configure a propriedade ProviderFlags.pfInUpdate para False (este campo não pertence à tabela CLIENTES, logo não deve estar na instrução de atualização).

Selecione agora COD_CLIENTE e configure sua propriedade ProviderFlags.pfInkey para True. Finalmente, configure a propriedade UpdateMode de dsp_clientes para upWhereKeyOnly e insira o seguinte comando no evento BeforePost de cds_clientes para atribuir a data padrão e gerar o valor da chave primária:

 

if cds_clientes.state=dsInsert then

   cds_clientesDATA_CADASTRO.Value:=Date;

Incrementa('CLIENTES', cds_clientesCOD_CLIENTE);

 

Pronto, agora já é possível incluir, alterar e excluir um cliente, porém falta ainda a procura. Adicione um SQLClientDataSet ...

Quer ler esse conteúdo completo? Tenha acesso completo