Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: IBStoredProc Bileşeni  (Okunma sayısı 2497 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
IBStoredProc Bileşeni
« : 10 Ekim 2005 15:51:32 »
IBStoredProc Bileşeni

IBStoredProc Bileşenini Birden fazla kayıt  döndürmek için  kullanamazsınız. SP'den Birden fazla Kayıt Dönecekse mutlaka ibquery veya ibdataset kullanmalısınız.



Tek sonuç, tek  kayıt  dönderiyorsa yada sonuç döndürmüyorsa güncelleme, silme gibi ibstoredprocedure bileşeninni kullanabilirsiniz. .



bu bileşenin kullanacağı  veritabanındaki sp nin yapacağı işlemler için göndereceğiniz input ( giriş ) parametre değerlerini bileşeni çalıştırmadan önce atamalısınız..



Return ( çıkış) Parametrelerinden dönen değerleri ise bileşeni çalıştırdıktan sonra değişken vb.ne atayabilirsiniz..





ransection,ibdatabase,Datasource ve ibdataset ekleyip bağlantıları yaptığınızı varsayarak bileşenin kullanımını öğrenelim.



Aşağıdaki gibi bir tablomuz olsun



formunuza  ibt

IBStoredProc'u forma veya data module koyduktan sonra object inspectordan  Database, Transaction özelliklerini forma eklediğiniz  Database, Transaction'ı ayarlayın.



aşağıdaKi GİBİ bir sp yazarak.



Kod: SQL
  1. CREATE PROCEDURE SP_SIL (
  2.  
  3. SIL INTEGER)
  4.  
  5. AS
  6.  
  7. BEGIN
  8.  
  9. DELETE FROM musteri
  10.  
  11. WHERE musteri.sira=:SIL;
  12.  
  13. END








Formunuza eklediğiniz IBstoredProc bileşeninin  StoredProcName özelliğini Oject  inspectordan yukarıda yazdığımız stored procedure'ün ismini seçin.



örneğimizde seçili kaydı IBStoredProc bileşeni yardımıyla seçili kaydın silinmesini sağlıyacağız.. bunun için bir buttonun Onclick olayına aağıdaki kodu yazıyoruz..







Kod: Delphi
  1. IBStoredProc1.Prepare;
  2.  
  3. IBStoredProc1.Params.ParamByName('SIL').Value :=IBQuery1SIRA.Value;
  4.  
  5. IBStoredProc1.ExecProc;  
  6.  
  7. IBStoredProc1.Unprepare;








IBStoredProc1.Params.ParamByName('SIL').Value :=IBQuery1SIRA.Value;  burada sp nin SIL adlı input parametresine tablouzda aktif olan kaydın  Primary Key alanın değerini aktarıp bu nu0maraya sahip kay9dı siliyoruz.



ExecProc komutu ibquery,ibdataset,tablenin Active ve Open komutlarıyla aynıdır. bu komutu vermeden bileşen görevini yapmayacaktır.. kesinlikle ibstoredproc bileşeninde active ve open komutu kullanmayın. bileşeni çalıştırma komutu ExcProc olduğu için input parametrelerini bu komuttan önce veriyoruz. aynı şekilde Output (çıkış) parametrelerini bu komuttan sonra alıyoruz.



                 Prepare ve Unprepare ifadeleri seçimliktir. İsterseniz yazmayabilirsiniz. Bu ifadeler stored procedure'ü birden çok kez çalıştıracaksanız faydalıdır. Mesela peş peşe 3 işçi silecekseniz Prepare komutunu verin, 3 işçiyi silin, Unprepare komutunu verin. İşlem daha hızlı yapılacaktır.







Şimdide çıkış  parametreli bir örnek yapalım. örnek sp miz Firebird bölümünde hazırlamış olduğumuz verilen tarihin haftanın hangi gününe denk geldiğini  bulan procedureyle  örneğimizi uyguluyoruz.



sp kodu



Kod: SQL
  1. CREATE PROCEDURE SP_GUN_BUL (
  2.  
  3. TARIH DATE)
  4.  
  5. RETURNS (
  6.  
  7. GUN_ADI VARCHAR(10))
  8.  
  9. AS
  10.  
  11. DECLARE VARIABLE BENIM_TARIH DATE;
  12.  
  13. DECLARE VARIABLE TARIH_KOPYASI DATE;
  14.  
  15. DECLARE VARIABLE FARK1 INTEGER;
  16.  
  17. DECLARE VARIABLE FARK2 INTEGER;
  18.  
  19. DECLARE VARIABLE GUN_FARKI INTEGER;
  20.  
  21. DECLARE VARIABLE SONUC SMALLINT;
  22.  
  23. BEGIN
  24.  
  25. /*DEGİŞKENLERE ATAMA YAP*/
  26.  
  27. BENIM_TARIH= '15.12.96'; /*HERHANGİ BİR PAZAR GUNU*/
  28.  
  29. TARIH_KOPYASI= :TARIH;
  30.  
  31. FARK1 = 1;
  32.  
  33. FARK2 = 2;
  34.  
  35. /*HESAPLA*/
  36.  
  37. WHILE &#40;&#58;FARK1 <> &#58;FARK2&#41; DO
  38.  
  39. BEGIN
  40.  
  41. FARK1 = TARIH - BENIM_TARIH;
  42.  
  43. GUN_FARKI = &#58;FARK1 / 7;
  44.  
  45. FARK2 = &#58;GUN_FARKI * 7;
  46.  
  47. IF &#40;&#58;FARK1 <> &#58;FARK2&#41; THEN
  48.  
  49. TARIH = &#58;TARIH + 1;
  50.  
  51. END
  52.  
  53. SONUC = 7-&#40;&#58;TARIH-&#58;TARIH_KOPYASI&#41;;
  54.  
  55. IF &#40;SONUC=1&#41; THEN
  56.  
  57. GUN_ADI='Pazartesi';
  58.  
  59. ELSE
  60.  
  61. IF &#40;SONUC=2&#41; THEN
  62.  
  63. GUN_ADI='Sal&#305;';
  64.  
  65. ELSE
  66.  
  67. IF &#40;SONUC=3&#41; THEN
  68.  
  69. GUN_ADI='&#199;ar&#351;amba';
  70.  
  71. ELSE
  72.  
  73. IF &#40;SONUC=4&#41; THEN
  74.  
  75. GUN_ADI='Per&#351;embe';
  76.  
  77. ELSE
  78.  
  79. IF &#40;SONUC=5&#41; THEN
  80.  
  81. GUN_ADI='Cuma';
  82.  
  83. ELSE
  84.  
  85. IF &#40;SONUC=6&#41; THEN
  86.  
  87. GUN_ADI='Cumartesi';
  88.  
  89. ELSE
  90.  
  91. IF &#40;SONUC=7&#41; THEN
  92.  
  93. GUN_ADI='Pazar';
  94.  
  95. suspend;
  96.  
  97. END


 



formunuza bir IBStoredProc, bir datatimepicker,bir edit ve bir de button ekleyin. IBStoredProc  bileşenini yukarıdaki gibi ayarlayın. StoredProcName özelliğini Oject  inspectordan yukarıda yazdığımız stored procedure'ün ismini SP_GUN_BUL  seçin.



ve buttonun onclick olayıına



Kod: Delphi
  1. IBStoredProc1.Params.ParamByName&#40;'TARIH'&#41;.AsDate &#58;=DateTimePicker1.Date;
  2.  
  3. IBStoredProc1.ExecProc;
  4.  
  5. edit1.Text&#58;=IBStoredProc1.Params.ParamByName&#40;'GUN_ADI'&#41;.Valu e;
  6.  
  7.  


yazın. datatimepickerde tarihi seçip buttona tıkladığınızda günü edit içine yazıyoruz. gördüğünüz ggibi giriş parametremizi ExecProc komutundan  önce yazıp bileşeni çalıştırdıktan sonra dönen değeri  edit içine atıyoruz..







Şimdi Birden Fazla çıkış paramretreli bir sp çalıştıralım.



sp kodıu:



Kod: SQL
  1. CREATE PROCEDURE Max_Params &#40;
  2.  
  3. IDNO INTEGER&#41;
  4.  
  5. RETURNS &#40;
  6.  
  7. AD VARCHAR&#40;15&#41; CHARACTER SET WIN1254,
  8.  
  9. SOYAD VARCHAR&#40;15&#41; CHARACTER SET WIN1254&#41;
  10.  
  11. AS
  12.  
  13. BEGIN
  14.  
  15. SELECT ADI, SOYADI FROM tbl_musteri
  16.  
  17. WHERE tbl_musteri.sira=&#58;idno
  18.  
  19. INTO &#58;AD, &#58;SOYAD;
  20.  
  21. suspend;
  22.  
  23. END


 



Öneğimiz verilen numarayı alıp o numaraya ait kaydın adı ve  soyadını editlere yazacak. bunıun için



IBStoredProc'u forma veya data module koyduktan sonra object inspectordan  Database, Transaction özelliklerini forma eklediğiniz  Database, Transaction'ı ayarlayın. StoredProcName özelliğini Oject  inspectordan yukarıda yazdığımız stored procedure'ün ismini Max_Params  seçin.



forma 3 edit bir button ekleyin. ilk edite bulmak istediğimiz kaydın nosunu yazıyoruz.buttonun onclick olayıına aşağıda ki kodu yazın.







Kod: Delphi
  1. IBStoredProc1.Params.ParamByName&#40;'IDNO'&#41;.AsInteger &#58;=STRTOINT&#40;Edit1.Text&#41;;
  2.  
  3. IBStoredProc1.ExecProc;
  4.  
  5. Edit2.Text&#58;=IBStoredProc1.Params.ParamByName&#40;'AD'&#41;.Value;
  6.  
  7. Edit3.Text&#58;=IBStoredProc1.Params.ParamByName&#40;'SOYAD'&#41;.Value;








Koddaki AsInteger :=STRTOINT(Edit1.Text);   yerine Value:=Edit1.Text; yazabilirdik. Value Variant bir tipe sahptir. atamayı yapmadan önce değerlerin birbirine uyması için çeviri işlemi yapar. buda performansımızı düşürür. bunun yerine parametrenin veritipini biz belirtebiliriz. Yukarıdaki iki örneği inceleyin.



Birden fazla çıkış parametresi kullandığımız gibi birden fazla giriş parametreside kullanabiliriz..







Birden Fazla kayıt döndüren  br sp'yi çağıralım. bunun için IBStoredProc Bleşeni Değil IBQuery veya IBDataset Kullanmalıyız.. örneğimizde IBQuery kullanıyorum.



sp kodıu:



Kod: SQL
  1. CREATE PROCEDURE SP_LISTELE
  2.  
  3. RETURNS &#40;
  4.  
  5. IDNO INTEGER,
  6.  
  7. AD VARCHAR&#40;15&#41; CHARACTER SET WIN1254,
  8.  
  9. SOYAD VARCHAR&#40;15&#41; CHARACTER SET WIN1254&#41;
  10.  
  11. AS
  12.  
  13. BEGIN
  14.  
  15. FOR
  16.  
  17. SELECT SIRA, ADI, SOYADI FROM tbl_musteri
  18.  
  19. INTO &#58;IDNO, &#58;AD, &#58;SOYAD
  20.  
  21. do
  22.  
  23. suspend;
  24.  
  25. END


 



formunuza  ibtransection,ibdatabase,Datasource ve ibquery ekleyip bağlantıları yapın. IBQuerynin SQL Özelliğine aşağıdaki kodu yazıp. çalıştırın.



Kod: SQL
  1. SELECT IDNO, AD, SOYAD FROM SP_LISTELE;




vaya



Kod: SQL
  1. SELECT * FROM SP_LISTELE;




gördüğünüz gibi tıpkı bir tablo gibi kullanıyoruz.







Peki Giriş Parameremiz olsaydı? SP mizi Değiştirelim.

Kod: SQL
  1. CREATE   PROCEDURE SP_LISTELE &#40;
  2.  
  3. ISIM VARCHAR&#40;15&#41; CHARACTER SET WIN1254&#41;
  4.  
  5. RETURNS &#40;
  6.  
  7. IDNO INTEGER,
  8.  
  9. AD VARCHAR&#40;15&#41;,
  10.  
  11. SOYAD VARCHAR&#40;15&#41;&#41;
  12.  
  13. AS
  14.  
  15. BEGIN
  16.  
  17. FOR
  18.  
  19. SELECT SIRA, ADI, SOYADI FROM tbl_musteri
  20.  
  21. WHERE ADI=&#58;isim
  22.  
  23. INTO &#58;IDNO, &#58;AD, &#58;SOYAD
  24.  
  25. do
  26.  
  27. suspend;
  28.  
  29. END


 



 IBQuerynin SQL Özelliğine aşağıdaki kodu yazıp. çalıştırın.



Kod: SQL
  1. SELECT * FROM SP_LISTELE &#40;'FAOsoft'&#41;;
yazarsanız ismi FAOsoft olan kayıtlar listelenir. parametre değerini parantez içine yazıyoruz. parametre tipi string  değilse tırnak işareti kullanmıyopruz.birden fazla giriş parametresi varsa aralarına virgül ekliyoruz.



Bizde FAOsoft kaydından bbaşlka  bir kayırt aramayacakmıyız. ben edit içindeki bilgiyi aratmak şistiyorum dediğinizi duyar gibiyim :))



Forma ek olarak bir edit birde button ekleyin.



buttonun onclick olayına aşağıaki kodu yazın



Kod: Delphi
  1. IBQuery1.Close;
  2.  
  3. IBQuery1.SQL.Add&#40;'select IDNO, AD, SOYAD from SP_LISTELE &#40;'+#39+EDIT1.Text+#39+'&#41;;'&#41;;
  4.  
  5. IBQuery1.Open;




#39 > tırnak işareti anlamına geliyor. Tırnak işaretleri karışmasın diye ben böyle kullanırım. tırnaklar fazlalaştımı.







IBStoredProc Bileşenini seçtikten sonra Object Inspectordan Params özelliğine tıkladığınız zaman karşınıza gelen parametre listesinden  birini seçtikten sonra yine Object Inspectordan Value kısmına SP'nin parametrelerine varsayılan değer atayabkilirsiniz.
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.