Membuat Parameter untuk ZStoredProcedure On Runtime

Pengguna Delphi maupun lazarus yang suka dengan namanya free component atawa komponen gratisan pasti tahu yang nama Zeos.

Zeos adalah salah satu komponen yang berfungsi memudahkan akses ke database sebagai alternatif ADOQuery.

Banyak fitur yang dimiliki oleh Zeos salah satunya adalah adalah ZStoredProcedure.
Okelah sekarang anggaplah semua menggunakan MySQL sebagai database nya (gratisan lagi tentunya), didalam MySQL terdapat fitur StoredProcedure yang biasanya digunakan untuk menjalankan proses yang cukup besar apabila dilakukan dengan koneksi yang terus menerus namun lebih ringan apabila dijalankan di server dan client hanya mengirimkan beberapa parameter.

Sebagai contoh :
DELIMITER $$

USE `owas`$$

DROP PROCEDURE IF EXISTS `iebahanriset`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `iebahanriset`(p_id INT,p_nama VARCHAR(50),p_sex CHAR(1),p_pekerjaan VARCHAR(50),p_lahir DATE,p_owas INT,p_reba INT,p_rula INT,OUT neoid INT)
BEGIN
 IF p_id=0 THEN
  SELECT IFNULL(MAX(id_bahanriset)+1,1) FROM bahan_riset INTO neoid;
  INSERT INTO bahan_riset(id_bahanriset,nama_bahanriset,sex_bahanriset,pekerjaan_bahanriset,lahir_bahanriset,hasil_owas,hasil_reba,hasil_rula)
  VALUES(neoid,p_nama,p_sex,p_pekerjaan,p_lahir,p_owas,p_reba,p_rula);
 ELSE
  UPDATE bahan_riset SET nama_bahanriset=p_nama,sex_bahanriset=p_sex,pekerjaan_bahanriset=p_pekerjaan,lahir_bahanriset=p_lahir,
  hasil_owas=p_owas,hasil_reba=p_reba,hasil_rula=p_rula WHERE id_bahanriset=p_id;
 END IF;
    END$$

DELIMITER ;

Ada beberapa parameter yang harus diisikan pada saat akan memanggil storedprocedure iebahanriset dari ZStoredProcedure. Permasalahan nya apabila kita memiliki lebih dari 10 storedprocedure maka tidak mungkin kita mengcreate satu persatu nama parameter nya.

Untuk memudahkan nya berikut ada procedure untuk memudahkan create nama parameter secara runtime dan dinamis.

procedure ExecStored(const namaprocedure :string;var qry : TZQuery;var sp : TZStoredProc);
var
   listParam,listSpasi : TStringList;
   loopcmb : integer;
   strSql : string;
begin
  sp.StoredProcName:= '';
     listParam := TStringList.Create;
     listSpasi := TStringList.Create;
  listParam.Clear;
  listSpasi.Clear;
  strSql := 'SELECT param_list FROM mysql.proc WHERE '+
  'db=%s AND NAME=%s';
  strSql := FORMAT(strSql,[
         QuotedStr(DataModule1.ZConnection1.Database),
         QuotedStr(namaprocedure)
  ]);
  OpenSql(qry,strSql);
  Explode(listParam,qry.Fields[0].AsString,',');
  for loopcmb := sp.Params.Count-1 downto 0 do
  sp.Params.Delete(loopcmb);
  loopcmb := 0;
  while loopcmb <= listParam.Count-1 do
  begin
       listSpasi.Clear;
       Explode(listSpasi,listParam[loopcmb],' ');
       sp.Params.Add;
       if listSpasi[0]='OUT' then
       begin
          sp.Params[loopcmb].ParamType:=ptOutput;
          if listSpasi[2]='INT' then
             sp.Params[loopcmb].DataType:= ftInteger
          else
             sp.Params[loopcmb].DataType := ftString;
          sp.Params[loopcmb].Name:= listSpasi[1];
       end
       else
       begin
         sp.Params[loopcmb].ParamType:=ptInput;
         if listSpasi[1]='INT' then
            sp.Params[loopcmb].DataType:= ftInteger
         else
             sp.Params[loopcmb].DataType := ftString;
         sp.Params[loopcmb].Name:= listSpasi[0];
       end;
       inc(loopcmb);
  end;
  sp.StoredProcName:=namaprocedure;
  listParam.Free;
  listSpasi.Free;
end;
Lalu untuk memanggilnya dari delphi cukup mengetikan

ExecStored('iebahanriset',ZQuery1,ZStoredProc1);
untuk mengisi parameter nya lakukan dengan menggunakan :
ZStoredProc1.ParamByName('p_id').AsInteger := xxx;
..dst
Untuk mendapatkan parameter OUT nya gunakan :

hasiloutput := ZStoredProc1.ParamByName('neoid').AsInteger;
Selamat bekerja dengan ZStoredProcedure
Share on Google Plus

About Unknown

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 comments:

Post a Comment