Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 06 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
64 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Stored Procedured com Firebird e DbExpress
Publicado por ActiveDelphi : Sexta, Fevereiro 16, 2007 - 08:47 GMT-3 (9715 leituras)
Comentários 1 Comentário   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Sérgio Guedes 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

  1. procedure GravaDados(Codigo: Integer);
  2. 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



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: edioilha : Nov 18, 2007 - 08:54
(Informações sobre o membro | Enviar uma mensagem) http://
Olá Sergio!
Parabens pelo esforço e dedicaçao!
Sei q muitas vezes é complicado deixar o q esta fazendo e dedicar um tempo a criar um exemplo para contribuir com a comunidade delphiana.

E este tópico vc aborda um assunto muito importante!
Apenas fiquei com uma duvida em relaçao a Funçao 'incrementa', como é a implementaçao da funçao?
Obrigado mais uma vez!!
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados