Stored Procedure - SQL

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Stored Procedure - SQL

Mesaj gönderen Salih »

Merhaba,

Firebird kullanıyorum. SP kullanarak, bir tablomun içinden bazı kayıtları seçip, aşağıda anlattığım işlemleri yaparak başka bir tablo oluşturmak ve bu oluşturulan tabloyu Qreport ile yazıcıdan yazdırmak istiyorum. Biraz SP tecrübem var, ama hep execute tipi idi yazdıklarım. Bu ilk Select tipi SP olacak inşallah.

Mevcut tablo şu şekilde :

Cns, X, Y, adet, alan
-- ----- ----- ---- -----
B, 750, 2000, 1, 1.5
A, 500, 1000, 1, 0.5
B, 2000, 750, 1, 1.5
A, 1000, 500, 2, 1.0
A, 800, 1500, 3, 1.2

Yapmak istediğim ise bu bilgileri şu şekilde özetlemek :

1- Her satırdaki X,Y ikilisi sıralanacak, 750,2000 -> 2000,750

2- Cins, X, ve Y değerleri aynı olanların adet ve alan bilgilerini tek satırda toplamak,

3- Sonuç tablosunu Cins , X ve Y sütunlarına göre sıralamak.

4- Bir başka tablodan Cns bilgisinin uzun ismin alarak yeni tabloya eklemek.

Yani, yukarıdaki örnek için sonuç şöyle olacak :

Cns, X, Y, adet, alan, Adı
-- ----- ----- ---- ----- -------
A, 1500, 800, 3, 1.2, Ankara
A, 1000, 500, 3, 1.5, Ankara
B, 2000, 750, 2, 3.0, Balıkesir

SP ile bu ilşlemi nasıl yapabilirim ? IB expert te gerekli SQL i oluşturmaya çalıştım, ama henüz başaramadım.
Sevgi, Saygı.....
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Kod: Tümünü seç

for select ALAN1 from TABLON into :DEGISKENALAN1  do
begin

  --CIKIS DEGERLERİNİ ATAMA
  if (bu satır gösterilecek) then
     suspend;
end
yapısı ile delphide islm yapar gibi degiskenlere aktarılan alanlar uzerinde islem yapabilirsin
ÜŞENME,ERTELEME,VAZGEÇME
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

Teşekkürler,

Sitede arama yaparak önceki SP örneklerini de inceliyorum ama henüz başarılı olamadım. Rica etsem biraz daha yardımcı olabilir misiniz ?
Sevgi, Saygı.....
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

Rica etsem, aşağıdaki koda gözatabilir misiniz ? istediğim işlemi hemen hemen hallettim sayılır. Düzeltilmesi gereken yerler var mı sizce ?

Kod: Tümünü seç

CREATE PROCEDURE SP_TEMPSIP (SIPNO INTEGER)
RETURNS (
    HESAPKISA VARCHAR(14),
    EBADX SMALLINT,
    EBADY SMALLINT,
    ADET SMALLINT,
    ALAN NUMERIC(15,2),
    UNITEKODU CHAR(1))
AS
DECLARE VARIABLE NUMROWS SMALLINT;
DECLARE VARIABLE OLCU SMALLINT;
BEGIN
  DELETE  FROM TMPSIP;
  FOR
    SELECT SIPDETAY.HESAPKISA, SIPDETAY.EBADX, SIPDETAY.EBADY,      SIPDETAY.ADET, SIPDETAY.ALAN, SIPDETAY.UNITEKODU
    FROM SIPDETAY
    WHERE (SIPDETAY.SIPARISNO = :SIPNO)
    INTO :HESAPKISA,  :EBADX, :EBADY, :ADET, :ALAN, :UNITEKODU
  DO
  begin
    if (EBADY > EBADX) then
    begin
      OLCU = :EBADY;
      EBADY = :EBADX;
      EBADX = OLCU;
    end
    if (unitekodu is null ) then  UNITEKODU = ' ';
    select count(*) from TMPSIP
      where
        TMPSIP.HESAPKISA = :HESAPKISA AND
        TMPSIP.EBADX     = :EBADX     AND
        TMPSIP.EBADY     = :EBADY     AND
        TMPSIP.UNITEKODU = :UNITEKODU into numrows;
    if (numrows = 0) THEN
      INSERT INTO TMPSIP (HESAPKISA, UNITEKODU, EBADX, EBADY, ADET, ALAN)
       values (:HESAPKISA, :UNITEKODU, :EBADX, :EBADY,0,0);

    update tmpsip set TMPSIP.ADET = TMPSIP.ADET + :ADET,
                      TMPSIP.ALAN = TMPSIP.ALAN + :ALAN
      where
        TMPSIP.HESAPKISA = :HESAPKISA AND
        TMPSIP.EBADX     = :EBADX     AND
        TMPSIP.EBADY     = :EBADY     AND
        TMPSIP.UNITEKODU = :UNITEKODU;
  END
END
IBexpert te düzgün çalışıyor. Delphi tarafı için kısa ipucu yazabilir misiniz ?
Sevgi, Saygı.....
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

tmp tabloya yazmaya nicin ihtiyac duydunuz...
eger islem sonucunda soylediginiz tarzda kayıtları dondurmek istiyorsanız
:HESAPKISA, :UNITEKODU, :EBADX, :EBADY
donus parametrelerini uygun degerlerle doldurup hemen altında
suspend komutunu kullanmak yeterli

delphi tarafında ise kayıt donduren spler icin ibquery kullanın
kayıt dondurmuyor ise ibsql

ibquery ile select * from benimsp(:parametre1,:parametre2) sql i yeterli

Kod: Tümünü seç

  with ibquery1 do
  begin
    Close;
    ParamByName('parametre1').AsInteger:=...
    ParamByName('parametre2').AsInteger:=...
    Open;
  end;
ÜŞENME,ERTELEME,VAZGEÇME
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

Çok teşekkürler hocam,

Giriş Tablosu
------------------------

Kod: Tümünü seç

Cns, X, Y, adet, alan                        SP den dönen tablo
-- ----- ----- ---- -----               -----------------------------------
B, 750, 2000, 1, 1.5                 A,1500, 800, 3, 1.2, Ankara
A, 500, 1000, 1, 0.5                 A,1000, 500, 3, 1.5, Ankara
B, 2000, 750, 1, 1.5                 B,2000, 750, 2, 3.0, Balıkesir
A, 1000, 500, 2, 1.0
A, 800, 1500, 3, 1.2
Kayıtlar karışık girilecek, SP onları cins, X ve Y değerlerine göre toplayıp getirecek. Rapor ise cins, X ve Y değerlerine göre sıralanmış olarak istendiği için bu şekilde düşündüm. Tmp tabloda cins, x ve Y yi anahtar olarak tanımladım. TMP tablo kullanmadan yapılabilir mi bu olay ? Array filan mı kullanmalı ? Bu kadarını yapabilmeme dahi şaşırdım, onun için yöntemi geliştirme işi yarına kalsın artık...
Sevgi, Saygı.....
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

hocam muhtemelen yapılabiliyordur
ama benim kafa iftara kadar durur simdi
:?
ÜŞENME,ERTELEME,VAZGEÇME
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

gkimirti yazdı:hocam muhtemelen yapılabiliyordur
ama benim kafa iftara kadar durur simdi
:?
benimki de durdu. Hocam SP yi aşağıdaki gibi çağırdım da işe yaramadı sanki. SP nin sonunda create edilen TMP dosyasının commit edilmesi filan mı gerekiyor ?

Kod: Tümünü seç

 with SPTEMPSIP do
  begin
    Close;
    ParamByName ('SIPNO').AsInteger := StrToInt(desipno.Text);
    ExecProc;
  end;
Sevgi, Saygı.....
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ibstoredproc kullanma
eger sp recordset donduruyor ise calısmıyordu
yukarıda dedigim gibi yap en iyisi...
tblonun yazılması ve varsa diger updatelerin yansıması icin sp nin tabiki
commit edilmesi gerekiyor...
ama aynı transaction icinde bu degisiklikleri de gorebilirsin...
(ibexpertte oldugu gibi :) )
ÜŞENME,ERTELEME,VAZGEÇME
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

Hocam,

SP ile olayı hallettim ama, gelen sonucun bazı alanlara göre sort edilmesi gerektiği için, delphi tarafında da tekrar bir query kullanıp kulağımı tersten tutmuş oldum. Gerekli işlemlerin tamamını SP içinde yapıp senin önerdiğin gibi output parametreleri ile sonuç döndüreyim ve IBQuery bileşeni ile alayım dedim ama parametre hatası verdi.

Hata mesajı konumuzla direk ilgili olmadığı için ayrı bir konu başlığında yazdım olayı :
viewtopic.php?t=5315
Sevgi, Saygı.....
Cevapla