Stored Procedure - SQL
Stored Procedure - SQL
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.
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ı.....
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
ÜŞENME,ERTELEME,VAZGEÇME
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 ?
IBexpert te düzgün çalışıyor. Delphi tarafı için kısa ipucu yazabilir misiniz ?
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
Sevgi, Saygı.....
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
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
Çok teşekkürler hocam,
Giriş Tablosu
------------------------
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...
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
Sevgi, Saygı.....
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 ?gkimirti yazdı:hocam muhtemelen yapılabiliyordur
ama benim kafa iftara kadar durur simdi
Kod: Tümünü seç
with SPTEMPSIP do
begin
Close;
ParamByName ('SIPNO').AsInteger := StrToInt(desipno.Text);
ExecProc;
end;
Sevgi, Saygı.....
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
)
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
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
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ı.....