Olá amigos da Active Delphi! Como andam os estudos? Dando continuidade aos artigos básicos, vamos ver como trabalhar com Stored Procedured no Delphi usando DbExpress com Firebird, e para montarmos o nosso exemplo, vamos criar uma tabela chamada Clientes, onde vamos inserir, alterar e apagar os registros.
CREATE TABLE CLIENTES (
ID_CLI INTEGER NOT NULL,
NOME VARCHAR(50),
DTANAS DATE,
SEXO CHAR(1)
);
ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (ID_CLI);
Criando as Stored Procedured de Inserção, edição
e exclusão.
Vamos primeiro conhecer a estrutura básica de uma sp:
CREATE PROCEDURE NEW_PROCEDURE (
Parametro Tipo de dado)
AS
begin
/* Procedure Text */
suspend;
end
Onde:
New_Procedure = Nome da Stored Procedured
Parâmetro, Tipo de dado = Nome e Tipo dos parâmetros,
ex.: ParamString Varchar(20)
/* Procedure Text */ = O Código da Stored Procedured propriamente
dito, dentro de um bloco begin end;
Vamos criar nesse exemplo duas SPs, uma para inserir e editar os registros
e uma segunda para apagar.
Inserção e Alteração (Insert e Update)
CREATE PROCEDURE UPD_INS_CLIENTE ( ID_CLI INTEGER, NOME VARCHAR(50), DTANAS DATE, SEXO CHAR(1)) AS begin if (exists(
select id_cli from clientes where (id_cli = :id_cli)
)) then update clientes set nome = :nome, dtanas = :dtanas, sexo = :sexo where (id_cli=:id_cli); else insert into clientes ( id_cli, nome, dtanas, sexo) values ( GEN_ID(GEN_CLIENTES_ID,1), :nome, :dtanas, :sexo); end
Explicando a primeira sp: Usamos o comando "if (exists(select
id_cli from clientes where (id_cli = :id_cli))) then" para verificar se o registro
existe, e caso exista,
usamos o comando update (Atualizar). Se não existir, usamos o comando
insert (Inserir).
Excluir (Delete)
CREATE PROCEDURE DEL_CLIENTE ( ID_CLI INTEGER) AS begin delete from clientes where id_cli = :id_cli; end
Explicando a segunda sp: Nessa stored procedure, usamos o
comando já conhecido
por todos, o delete, onde o parâmetro passado seja igual ao campo Chave.
Obs: Podemos criar uma única sp para as três tarefas
citadas acima, mas para fins de estudos, as deixremos separadas
mesmo.
Criando uma Aplicação para Exemplo
Crie um novo projeto no delhi: File / New / Application. Agora criaremos
um DataModule, para concentrar nossos componentes de acesso a dados.
Chame-o de dtmPrincipal e salve como UdtmPrincipal.
Como usaremos a paleta (Engine de Conexão) Dbexpress para conectar
ao Banco de Dados, insira os seguintes componentes no DataModule:
1 - SQLConnection1 = Name = ConnConexao.
1 - SQLQuery1 = Name qrylstcli.
2 - SQLStoredProc1 = Name = spLstCli e spdelCli.
Agora da paleta dataAccess:
1 - DataSetProvider1 = Name = dspLstCli
1 - ClientDataSet1 = Name = cdsLstCli
1 - DataSource1 = Name = dsLstCli

Figura 1 - Data Module: componentes de acesso a dados.
Ligação dos Componentes
Não entrarei em muitos detalhes sobre a ligação
e conexão dos componentes, pois já fiz isso em um artigo anterior,
sobre "Driver
DbExpress específico para Firebird”.
Como vocês já devem ter observado, estarei trabalhando com
um trio de componentes básico de ligações dbexpress, para
mostrarmos os dados em um dbgrid, e com duas SQLStoredProc para executar as
procedures no banco de dados.
Ligação do Trio de Componentes:
Figura 2 – Ligação do Trio de Componentes
Paras as SQLStoredProc, faremos como mostrado nas figuras abaixo:
Figura 3 – Ligação da sp de Inserção/Alteração
Observe que ligamos a SQLStoredProc ao sqlconnection e
já podemos especificar na sua propriedade StroredProcName, a sp que
desejamos trabalhar. Depois de especificamos, podemos acessar seus parâmetros
clicando na propriedade Params.

Figura 4 – Ligação da sp de delete
Para listarmos os clientes no dbgrid, selecione a qryLstCli e na sua propriedade
SQL digite:
select id_cli, nome, dtanas, sexo from clientes
Feito isso vamos adicionar todos os campos TFields na Query. Como na figura
abaixo, clique com o botão direito sobre a qryLstCli e escolha a opção
Fields Editor. Clicando com o botão direito novamente, escolha
a opção Add All Fields, para listar todos os campos
trazidos na referente
consulta SQL. Clique em Ok para confirmar.
Figura 5 – Configuração da Query que listará os Clientes
Faça o mesmo processo para o cdsLstCli, lembrando que vamos
nos referenciar ao clientdataset e não a sqlquery, e por último, ligue
a propriedade Dataset do dsLstCli para o CdsLstCli.
Formulário de Exemplo
Volte para o Form principal que foi criado automaticamente pelo delphi e Salve
o mesmo como frmPrincipal e sua unit como ufrmPrincipal.
Para temos acesso aos componentes de conexão precisamos adicionar o
nosso dtmPrincipal ao uses do nosso frmPrincipal. Para isso, vá em File
/ Use Unit. (veja Figura Abaixo).
Figura 6 – Acessando unit do DataModule
Crie o design do seu form de cadastro de Clientes Parecido com o exemplo da
figura abaixo.

Figura 7 – Form de Cadastro do Exemplo
Explicação Básica sobre o Form principal
Temos os botões btnNew, btnAlter, btnDel, btnSearch, btnCancel e btnSave
(bitbtn = Paleta Adittional), um MonthCalendar para servir como calendário,
que nesse tipo de janela
fica bem Mais Pratico (Name = mtcDataNasc – Paleta Win32).
Temos um DBGrid com name = dbGrdCadCli, para exibir os clientes cadastrados.
Não
se esqueça de ligar sua propriedade datasource ao nosso datasource
do dtmPrincipal (dtmPrincipal.dsLstCli).
Observe que temos um painel no meio do form que servirá de tela de
cadastro, onde quando clicarmos nos botões Novo ou Alterar, o mesmo
será exibido. Seu Name é pnlCADCLI.
Configurações Básicas
- Configure os campos que desejar visualizar no DbGrid.
- Altere a propriedade visible do pnlCADCLI para False.
Declare os seguintes métodos na seção public do frmPrincipal
- procedure GravaDados(Codigo: Integer);
- procedure Lista_Clientes;
Para criar o corpo das duas procedures, use a combinação de
teclas CTRL + SHIFT + C.
A procedure Grava vai executar a sp de inserção e alteração
de dados:
procedure TfrmCADCLI.GravaDados(Codigo: Integer); begin dtmPrincipal.spInsUpdCli.Close; dtmPrincipal.spInsUpdCli.Params[0].Value := Codigo; dtmPrincipal.spInsUpdCli.Params[1].Value := edtNomCli.Text; dtmPrincipal.spInsUpdCli.Params[2].Value := mtcDataNasc.Date; if cbxSexo.ItemIndex = 0 then dtmPrincipal.spInsUpdCli.Params[3].Value := 'M' else dtmPrincipal.spInsUpdCli.Params[3].Value := 'F'; dtmPrincipal.spInsUpdCli.ExecProc; end;
Observe que o Campo sexo será gravado conforme o valor que estiver
no ComboBox.
A procedure Lista_Clientes vai servir para atualizar os dados no dbgrid, sempre
que for realizada alguma alteração, inserção ou
exclusão de um registro. Sua função é fechar
e abrir o cdsLstCli.
procedure TfrmCADCLI.Lista_Clientes;
begin
dtmPrincipal.cdsLstCli.close;
dtmPrincipal.cdsLstCli.Open;
end;
Código Botão Novo:
pnlCADCLI.Visible:= True;
edtNomCli.SetFocus;
No botão Novo só mostramos o Painel de Cadastro e jogamos o
foco para a edit do Nome.
Código Botão Alterar
if dtmPrincipal.cdsLstCli.RecordCount > 0 then begin edtCodigo.Text := inttostr(dtmPrincipal.cdsLstCliID_CLI.asInteger); edtNomCli.Text := dtmPrincipal.cdsLstCliNOME.AsString; if dtmPrincipal.cdsLstCliSEXO.AsString = 'M' Then cbxSexo.ItemIndex := 0 else cbxSexo.ItemIndex := 1; pnlCADCLI.Visible := True; end else ShowMessage('Nenhum Registro Encontrado');
No botão Alterar, passamos para os edits os valores do registro selecionado
no dbgrid, somente se tiver registro na nossa tabela.
Código Botão Apagar
Observe que nessa Rotina, executamos nossa segunda sp, onde vamos deletar
o cliente que o código chave estiver como parâmetro:
dtmPrincipal.spDelCli.close;
dtmPrincipal.spDelCli.Params[0].Value :=
dtmPrincipal.cdsLstCliID_CLI.AsString;
dtmPrincipal.spDelCli.ExecProc;
Lista_Clientes;
Executo a sp e depois atualizo os dados.
Código Botão Cancelar
pnlCADCLI.Visible:= False;
Esconde o painel de cadastro.
Código Botão Salvar
if edtNomCli.Text <> '' then
Begin
if edtCodigo.Text = '' then
GravaDados(incrementa('clientes',
dtmPrincipal.cdsLstCliID_CLI,
dtmPrincipal.ConnConexao))
else
GravaDados(strtoint(edtCodigo.text));
end
else
ShowMessage('O campo Nome é Obrigatorio');
Lista_Clientes;
pnlCADCLI.Visible:= False;
edtCodigo.Clear;
No botão salvar, verificamos se há algum dado no edit
de nome, e caso tenha, verificamos se o edit de código tem algum valor.
Caso não tenha, passamos a função Incrementa, que vai
gerar o próximo id fazendo com que a sp saiba que a operação
atual se trata de uma inserção, pois não achará
esse id no banco de dados.
Caso o edit tenha algum valor, a sp vai executar um comando de update para
esse
cliente, pois encontrará esse registro.
Por último e finalizando, caso o edit de nome esteja em branco, será apresentada
uma mensagem de erro para o usuário, informando que “O Campo Nome
é Obrigatório”.
Listamos os Clientes, desabilitamos o painel de cadastro e limpamos o edit
de código.
Conclusão:
Primeiramente queria agradecer a oportunidade de continuar escrevendo para
o site, adoro muito participar e contribuir. Em segundo, queria agradecer as
pessoas que me enviam e-mail fazendo sugestões e pedindo ajuda. Também
queria pedir desculpa aos que, por falta de tempo, acabo não respondendo.
Foco do Artigo
Lembro-me que um dia passei algumas horas pesquisando na Internet sobre um
artigo como esse, simples mas que explica como trabalhar com stored procedure
com
delphi. Acabei achando um muito bom, que foi muito útil e por isso,
sempre que posso procuro escrever artigos focados em usuários iniciantes,
com dicas simples mas que são sempre bem vindas.
Clique aqui para fazer o download do exemplo.
Abraços e até a próxima.
Sérgio de Castro Guedes - Desenvolvimento MAIS Sistemas inteligentes®,
atualmente
atuando como desenvolver Delphi em
Sistemas Client/Server e MultiCamadas, utilizando
os banco de dados: SQL Server, Firebird 1.5 e 2.0.
Contato:
Sergio_rj45@yahoo.com.br
|