segunda-feira, 7 de abril de 2008

Módulo de consulta para CRUD win32 - For Dummies

Definindo uma forma metódica de construir um modulo de consulta para CRUD.

Passo 1 – Crie um Data Module (menu file ▶ new ▶ Data Module), se por caso ainda não houver um pronto para isso:
Adicione ao DM um conector com o banco de dados: ADOConnection, SQLConnection ou DataBase, dependendo da tecnologia de acesso a dados. Configure a conexão, botão direito sobre o componente escolha a opção de configuração de conexão. No caso do ADOConnection: EditConnectionString.

Passo 2 – Adicione um DataSet. Este será responsável por recuperar os registros que você deseja retornar na consulta do CRUD. Por Exemplo, num cadastro de produtos para alterar/editar ou excluir um determinado registro é imprescindível buscar, recuperar, o registro no banco de dados. Se você está trabalhando com ADO, adicione um ADODataSet. Se a tecnologia de acesso a dados que você usa é DBExpress adicione um SQLDataSet.

Passo 3 - Configure o DataSet conforme exemplificado em: Configuração de um DataSet de Consulta - CRUD - For Dummies
Passo 4 – Criar um método público no DM para executar a consulta, cujo o argumento é o parâmetro esperado do DataSet criado anteriormente que fará a consulta. Exemplificando abaixo o método ConsultarClientes:


type
TDM = class(TDataModule)
ADOConnection: TADOConnection;
AdsClientes: TADODataSet;
public
function ConsultarClientes(const Nome: String): Boolean;


com o class complete – Ctrl + Shift + C, codifique o corpo do método.


function TDM.ConsultarClientes(const Nome: String): Boolean;
begin
AdsClientesCons.Close;
AdsClientesCons.Parameters[0].Value := Nome;
AdsClientesCons.Open;
(* retorna verdadeiro se a consulta obtiver sucesso *)
Result := not AdsClientesCons.IsEmpty;
end;


Essa idéia pode ser aplicada a qualquer outro CRUD por exemplo:


function TDM.ConsultarProdutos(const Descricao: String): Boolean;
begin
AdsProdutosCons.Close;
AdsProdutosCons.Parameters[0].Value := Descricao;
AdsProdutosCons.Open;

Result := not AdsProdutosCons.IsEmpty;
end;


Estou tentando fazer um grupo de posts sobre técnicas de CRUD para alunos, estagiários e programadores jr. Nesse primeiro momento minha principal preocupação é introduzir a idéia através de exemplos simples para sedimentar a importância de uma forma padronizada de se construir programas. Nosso objetivo não é apenas definir uma forma padronizada, mas também uma forma otimizada podendo assim ser usada satisfatoriamente em diversas situações. É importante destacar também que o ganho em se padronizar uma metodologia de desenvolvimento não fica restrito apenas no que tange a produtividade na fase de construção do módulo. O principal ganho, na minha opinião, é posteriormente na manutenção e evolução do módulo.

Passo 5 – Adicione um Form para a interface da consulta: menu file ▶ new ▶ Form
Configure as seguintes propriedades do form:
Name = ClientesLstFrm
BorderStyle = bsDialog
Position = poMainFormCenter
Caption = ‘Consulta Clientes’

Adicione os seguintes componentes:
BitBtn1 = BtnConsultar

object BtnConsulta: TBitBtn
Caption = 'Pesquisar'
OnClick = BtnConsultaClick
end


BitBtn2 = BtnOk

object BtnOk: TBitBtn
.
.
Kind = bkOK
end

BitBtn3 = BtnSair

object BtnSair: TBitBtn
Caption = '&Sair'
ModalResult = mrCancel
.
.
end


Adicione um TDataSource. A propriedade “Name” vou alterar para DsDados. Em Seguida associe ele ao DataSet que se encontra no DM, criado no passo 1. Para fazer isso será necessário fazer com que essa unit, do ClientesLstFrm faça “uses” da unit do DM. Portanto, Alt + F11para fazer u Use Unit do DM. Agora sim você pode associar a propriedade DataSet do DataSource o AdsClientesCons.
Adicione um TEdit, um Label e um DBGrid. As configurações do DBGrid mais importantes são:

Name: Vou chamá-lo de GrdDados.

Propriedade do Grid: DataSource: Deverá ser associada ao DataSource (DsDados) associado ao DataSet que configuramos anteriormente no passo 2 (AdsClientesCons).

Propriedade Columns: Adicione colunas de acordo com os campo do AdsClientesCons que você deseja que sejam listados no Grid.



Cada coluna deve ter as propriedade FieldName e Title/Caption configuradas. Exemplo:



Esse módulo de consulta vai se comunicar com o módulo de cadastro. A idéia é que ele seja uma listagem, no caso, de “Clientes” para que o usuário possa seleciona um registro para alterá-lo ou excluí-lo. Portanto, é muito importante cuidar da comunicação deste Form com qualquer outro que use da sua funcionalidade. Uma técnica comum e eficiente é criar propriedades neste Form onde poderemos persistir os valores que desejamos comunicar para outro módulo.
Na seção “public” codifique conforme exemplificado abaixo:

public;
property ClienteID: Integer;
property NomeCliente: String;
property CPF: String;
end;


Chame o class complete para completar o código das propriedades: Ctrl + Shift + C. Veja como deve estar a sua unit agora:

type
TClientesLstFrm = class(TForm)
EditPesq: TEdit;
Label1: TLabel;
BtnConsulta: TBitBtn;
DsDadosLst: TDataSource;
Panel1: TPanel;
GrdDados: TDBGrid;
BtnSair: TBitBtn;
BtnOk: TBitBtn;

private
FClienteID: Integer;
FCPF: String;
FNomeCliente: String;
procedure SetClienteID(const Value: Integer);
procedure SetCPF(const Value: String);
procedure SetNomeCliente(const Value: String);
{ Private declarations }
public
property ClienteID: Integer read FClienteID write SetClienteID;
property NomeCliente: String read FNomeCliente write SetNomeCliente;
property CPF: String read FCPF write SetCPF;
end;



Em seguida, codifique o evento OnClick dos botões: BtnConsulta e BtnOk.

procedure TClientesLstFrm.BtnConsultaClick(Sender: TObject);
begin
if not DM.ConsultarClientes(EditPesq.Text +'%') then
ShowMessage('Nenhum registro encontrado!!!');
end;



procedure TClientesLstFrm.BtnOkClick(Sender: TObject);
begin
if GrdDados.DataSource.DataSet.IsEmpty then Exit;
(* Valores de output do módulo de consulta *)

SetClienteID(GrdDados.DataSource.DataSet.FieldByName('ID_Cliente').AsInteger);
SetNomeCliente(GrdDados.DataSource.DataSet.FieldByName('Nome').AsString);
SetCPF(GrdDados.DataSource.DataSet.FieldByName('CPF_CNPJ').AsString);

end;


Fechando o DataSet de consulta ao sair do módulo: No evento OnClose do From.

procedure TClientesLstFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
// Garantindo que o DataSet seja fechado ao término da consulta
GrdDados.DataSource.DataSet.Close;
end;


Nenhum comentário:

Postar um comentário

 
BlogBlogs.Com.Br