quarta-feira, 22 de outubro de 2008

Front End x Back End – UDFS no Servidor SGBD


UDF: “User Defined Function”, nos SGDBs, são funções criadas pelo desenvolvedor. Os principais fornecedores de tecnologia de banco de dados disponibilizam essa feature nos seus produtos.

O modelo Cliente/Servidor caracteriza-se por centralizar a programação referente a regra de negócio no servidor SGBD. Neste artigo, veremos como executar uma função no banco Oracle (PL/SQL) a partir da aplicação em Delphi.

No Back-And

Primeiro vamos criar a função no Oracle, a qual posteriormente evocaremos de uma interface (um aplicativo, front-end), um programa desenvolvido em Delphi.

create or replace function DeterminaMaior(ZNValor1 in NUMBER, ZNValor2 in NUMBER, ZNValor3 in NUMBER) return number is
  Result number;
begin
  IF (ZNValor1 > ZNValor2) AND  (ZNValor1 > ZNValor3) THEN
    RESULT := ZNValor1;
  ELSE
    IF (ZNValor2 > ZNValor1) AND  (ZNValor2 > ZNValor3) THEN
      RESULT := ZNValor2;
    ELSE
      RESULT := ZNValor3;
    END IF;
  END IF;
  return(Result);
end DeterminaMaior;



Compile a função “DeterminaMaior” e pronto! Finalizamos aqui a parte de programação no servidor.

No Front-End

Inicie uma aplicação (no menu - File, New, Application), adicione no form1 os Seguintes componentes:

1- TADOConnection (Palheta ADO): configure a conexão com o banco na propriedade “ConnectionString”. Em seguida, Altere a propriedade “LoginPrompt” para “False”.

2- TADOStoredProc(Palheta ADO): Associe ele ao ADOConnection através da propriedade “Connection”. Em seguida, na propriedade “ProcedureName” digite o nome da função que acabamos de criar. Exemplo: “DeterminaMaior”. Pode ser conveniente digitar o nome do schema ponto o nome da função, tipo: “[eschemaName]. DeterminaMaior”.

Feto isso, click na propriedade parameters e veja alista re parâmetros que ele recupera automaticamente. Veja a ilustração abaixo:




Adicione também um TBitBtn (Palheta Additional). Na propriedade “Caption” defina: “Determinar Maior”.

Preciso adicionar três edits (TEdit – Palheta Standard) e um Memo (TMemo – Palheta Standard).




Codificando o evento OnClick do BitBtn1: Digite conforme exemplificado abaixo:

procedure TForm1.BitBtn1Click(Sender: TObject);
const
  ZnConstMsg = 'www.estacaozn.blogspot.com - O Valor maior é %s';
Var
  ZnMsg: String;
begin

  with ADOStoredProc1 do
  begin
    Parameters[0].Value := 0;
    Parameters[1].Value := GetValorEdit(Edit1);
    Parameters[2].Value := GetValorEdit(Edit2);
    Parameters[3].Value := GetValorEdit(Edit3);
    ExecProc;
  end;
  ZnMsg :=  Format(ZnConstMsg,
      [VarTOStr(ADOStoredProc1.Parameters[0].Value)]);
    Memo1.Lines.Add(ZnMsg);
    MessageDlg(ZnMsg, mtInformation, [mbOK], 0);
end;

Nas linhas 2 e 3, defini como constante o valor da mensagem a ser exibida como resultado do processamento da UDF que criamos.

Nas linhas 4 e 5, declarei uma variável para auxiliar no out put do processamento que estamos realizando. Quando recuperar o valor retornado pela UDF vamos usá-la para compor a mensagem para o usuário.

Na liha 6, a palavra reservada “begin” inidca o início do bloco de comando executados pelo procedimento “BitBtn1Click”.

Na linha 7, espaço em branco. Devemos deixar espaços em branco em alguns casos onde desejamos que, na leitura do nosso código, o entendimento fique mais fácil.

Da linha 9 a 12, passamos os valores para os parâmetros do “ADOStoredProc1”. Note que criei uma função “GetValorEdit” para poder recuperar o valor dos edits de forma segura. veremos o código dela mais adiante.

Na linha 13, chamamos o método ExecProc, de TADOStoredProc, o qual executa a UDF, “DeterminaMaior”, no banco.

Na linha 15, formatamos o valor da mensagem que deverá ser exibida composta do valor retornado do processamento no banco.

Na linha 17, adiciono ao Memo1 a mensagem.

Na linha 18, chamamos a função “MessageDlg”, API do Windows, para exibir o resultado do processamento para o usuário.


Codificando o Método “GetValorEdit”:

Na seção “private” vamos codificar a declaração método “GetValorEdit”. Segue trecho de código ilustrando o corpo do método:


function TForm1.GetValorEdit(Edt: TEdit): Double;
var
  AuxNum: Double;
begin
  try
    AuxNum := StrToFloat(Edt.Text);
  except
    on EConvertError do
      AuxNum := 0;
  end;

  Result := AuxNum;
end;


Agora execute a aplicação (pressione F9) e teste ...



A seguir, código completo da unit ...
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    ADOStoredProc1: TADOStoredProc;
    ADOConnection1: TADOConnection;
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    function GetValorEdit(Edt: TEdit): Double;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
const
  ZnConstMsg = 'www.estacaozn.blogspot.com - O Valor maior é %s';
Var
  ZnMsg: String;
begin

  with ADOStoredProc1 do
  begin
    Parameters[0].Value := 0;
    Parameters[1].Value := GetValorEdit(Edit1);
    Parameters[2].Value := GetValorEdit(Edit2);
    Parameters[3].Value := GetValorEdit(Edit3);
    ExecProc;
  end;
  ZnMsg :=  Format(ZnConstMsg,
      [VarTOStr(ADOStoredProc1.Parameters[0].Value)]);
  Memo1.Lines.Add(ZnMsg);
  MessageDlg(ZnMsg, mtInformation, [mbOK], 0);
end;

function TForm1.GetValorEdit(Edt: TEdit): Double;
var
  AuxNum: Double;
begin
  try
    AuxNum := StrToFloat(Edt.Text);
  except
    on EConvertError do
      AuxNum := 0;
  end;

  Result := AuxNum;
end;

end.


Nenhum comentário:

Postar um comentário

 
BlogBlogs.Com.Br