Procedur ve Triger kodları

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
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Procedur ve Triger kodları

Mesaj gönderen bobasturk »

Merhabalar bu pazar günü rahatsızlık verdiğim için özür diliyorum.

uzun zamandır aklıma takılan fakat ertelediğim bir soruyu sormak istiyorum.

bir depo ve müşteri takip çalışması yapıyorum. depo takipte
depo
depo giriş
depo çıkış
depo stok

tablolarım var. stok tabloma sp işlemlerimde insert olayında iki alana birden giriş yaptırıyorum giriş miktarı ve giriş tpl fiyat olarak.

çıkışta da aynı yolla çıkış miktarı ve çıkış tpl fiyat arttırıyorum. bunların birde delete sp leri var yanlış girileni sildiği zaman işlemi geri almak için.

sorunum burada başlıyor. tablolarıma tek ürün girişi yaptığımda giriş ve çıkış olarak stoktaki tüm verileri siliyor. şöyle açıklayayım tablo boş ve ilk giriş ve çıkış kayıtları yapılıyor bunları stok tablosuna yazdığını görüyorum. deneme amaçlı olarak girşi tablosundan veya çıkış tablosundan kaydı sildiğimde sadece ilgili stoku sileceğine girişleri ve çıkışları olmak üzere tümünü siliyor. ama kayıt sayısı tablolarda birden fazla olduğunda böyle bir sorun yok ilgili kaydı silerek azaltma veya çoğaltma işlemini yapıyor. sizlere kodlarımı vermek istiyorum. acaba yanlışlık bendemi yoksa ilk etapta tek kayıt olduğu için bu iş normal mi?

Kod: Tümünü seç


sp lerim şöyle..........................................

CREATE PROCEDURE SPI_DEPO_GIRIS1 (
    KAYIT_NO VARCHAR(128),
    GIRIS_MIKTARI INTEGER,
    GIRIS_TPL_FIYATI FLOAT)
AS
DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
begin 
  select count(*) 
  from DEPO_STOK where KAYIT_NO = :KAYIT_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DEPO_STOK(KAYIT_NO,GIRIS) values(:KAYIT_NO,0);
  update DEPO_STOK set
    GIRIS = GIRIS+:GIRIS_MIKTARI where
    KAYIT_NO = :KAYIT_NO;

  select count(*)
  from DEPO_STOK where KAYIT_NO = :KAYIT_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DEPO_STOK(KAYIT_NO,GIRIS_FIYAT) values(:KAYIT_NO,0);
  update DEPO_STOK set
    GIRIS_FIYAT = GIRIS_FIYAT+:GIRIS_TPL_FIYATI where
    KAYIT_NO = :KAYIT_NO;
End



CREATE PROCEDURE SPI_DEPO_CIKIS1 (
    KAYIT_NO VARCHAR(128),
    CIKIS_MIKTARI INTEGER,
    CIKIS_TPL_FIYATI FLOAT)
AS
DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
begin 
  select count(*) 
  from DEPO_STOK where KAYIT_NO = :KAYIT_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DEPO_STOK(KAYIT_NO,CIKIS) values(:KAYIT_NO,0);
  update DEPO_STOK set
    CIKIS = CIKIS+:CIKIS_MIKTARI where
    KAYIT_NO = :KAYIT_NO;

  select count(*)
  from DEPO_STOK where KAYIT_NO = :KAYIT_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DEPO_STOK(KAYIT_NO,CIKIS_FIYAT) values(:KAYIT_NO,0);
  update DEPO_STOK set
    CIKIS_FIYAT = CIKIS_FIYAT+:CIKIS_TPL_FIYATI where
    KAYIT_NO = :KAYIT_NO;
End

triger lerim şöyle.....................................

CREATE TRIGGER TI_DEPO_CIKIS1 FOR DEPO_CIKIS1
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE numrows INTEGER; 
BEGIN 
    select count(*) 
      from DEPO
      where        NEW.KAYIT_NO = DEPO.KAYIT_NO into numrows;
    IF (     numrows = 0    ) THEN 
    BEGIN 
      EXCEPTION ERWIN_CHILD_INSERT_RESTRICT; 
    END
    execute procedure SPI_DEPO_CIKIS1 NEW.KAYIT_NO, NEW.CIKIS_MIKTARI, NEW.CIKIS_TPL_FIYATI;
END



CREATE TRIGGER TI_DEPO_GIRIS1 FOR DEPO_GIRIS1
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE numrows INTEGER; 
BEGIN 
    select count(*) 
      from DEPO
      where      NEW.KAYIT_NO = DEPO.KAYIT_NO into numrows;
    IF (      numrows = 0    ) THEN 
    BEGIN 
      EXCEPTION ERWIN_CHILD_INSERT_RESTRICT; 
    END
    execute procedure SPI_DEPO_GIRIS1 NEW.KAYIT_NO, NEW.GIRIS_MIKTARI, NEW.GIRIS_TPL_FIYATI;
END
tatil günü verdiğim rahatsızlıktan özür diler çalışanlara kolaylık, tatil yapanlara iyi tatiller dilerim
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hocam kodalrı tam olarak inceleme fırsatım olmadı fakat bu konu Fahrettin hocanın Stored Procedure seminerinde güzel bir şekilde kendisi tarafından anlatılmıştı.. Seminerlerde ulaşabilirsin..

Ayrıca Ekliyen ve Eksilten iki SP yazıp bunları Triggerler de kontrol etmen yeterli.. Insert te ekleyip, Delete de çıkaracaksın.. Update de de önce old. değerleri eksiltip, sonra new. değerleri ekleyeceksin. Ana mantık bu :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Recep ustam ilgin için teşekkür ederim. Seminerleri dikkatlice izleyeceğim. Bu yaptıklarımı Fahrettin ustamın verdiği örnekten çıkarttım. insert ve delet sp lerinde bir alana uygulama yaparsam sorun olmuyor işlemler düzgün. iki ve daha fazla alana uygularsam ilk kayıtta dediğim olayı yapıyor. kayıt sayıları iki ve daha fazla olduğu zaman işlemlerde bir sorun yok topluyor veya çıkarıyor.

burda merak ettiğim tek kayıt olunca niçin hepsini siliyor. sanırım yukarıda açıklamam eksik kaldı daha iyi anlaşılması babından stok tablomun alanları şöyle

DEPO_STOK
kayıt_no
giris_miktarı
giris_fiyatı
çıkış_miktarı
çıkış_fiyatı

burada spler ile girişleri ve çıkışları toplatıyorum farklarını ise delphi tarafında calc alan ile yapmak istiyorum.

diyelimki giriş yaptık girişmiktarı ile girişfiyatı arttı. sonra çıkış yaptık ve çıkışmiktarı ile çıkışfiyatı arttı. tabloda bir kayıt var. bir giriş bir çıkış. sonra çıkışı silmek istiyoruz ve siliyoruz. amanın ne görelim girişlerde silinmiş. sadece çıkış silineceğine girişlerde silinmiş, ama bu işlem tabloda bir kayıt olduğunda yapıyor.

ustam tavsiyene uyup iyice seminerleri inceleyeceğim. aslında bu işe kalkışmadan önce yapmamız gereken iş. akılsız başın cezasını ayaklar çekermiş.

kolaylıklar dilerim.
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Sanırım fiyat dediğin alanlar tutar olacak.. Bir de kayıt no master stok tablosundaki kayıt numarası mı yoksa fiş kayıt numarası mı?
Trigger larda giriş mi çıkış bi halde belirtmen lazım... :wink:
Zaten insert durumları var delete trigger ları yok burda..
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba recep ustam,

kayıt_no olarak ürünün numarası veya barkod numarası olarak düşündüm. isim olarak genel kullanımdan uzak bi isim oldu sanırım kafaları karıştırdı. depo, depogiriş, depoçıkış ve depostok tablolarım bu kayıt_no ile birbirlerine bağlantılı. kişi isterse barkod barkodu yok ise kendi vereceği kayıt numarası girmesini istedim. ismi değiştirmem lazım bunu anladım.

delet trigerlerine gelince ise onları göndermeyi unutmuşum sen deyince aklıma geldi. yaşlanıyoruz herlande.

delete triger şöyle

Kod: Tümünü seç

CREATE TRIGGER TD_URUN_GIRIS FOR URUN_GIRIS1 AFTER DELETE POSITION 0 AS 
BEGIN 
execute procedure SPD_DEPO_GIRIS1 OLD.KAYIT_NO, OLD.GIRIS_MIKTARI, OLD.GIRIS_TPL_FIYATI; 
END
bu şekilde de kaydı sildiğimde çalıştırıyorum. SPD leri şuan gönderemeyeceğim çünki ihtiyarlık dedim ya programı işyerinde yapmaya başladım eve getirmeyi unuttum şimdi evdeyim.

yardım ve açıklamaların için teşekkür ederim.
kolay gelsin. inşeallah nöbetçi sensindir yoksa pazarını mahvetmiş olucaz.
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
onaydin

Mesaj gönderen onaydin »

Procedure ü görmeden olmaz :)
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

ustam aynı şekil evde bida yazdım. bida yazmamın sebebi recep ustamın bazı alan adı tavsiyeleri üzerine. tablolar şöyle

URUN
IDNO(PK)
barkod_no
urun_adı
urun_kodu
urun_turu
bırım_tutarı

URUN_GIRIS
idno(pk)
barkod_no
urun_adı
urun_kodu
urun_turu
giris_tarihi
giris_miktarı
giris_tutari

URUN_CIKIS
idno(pk)
barkod_no
urun_adı
urun_kodu
urun_turu
cikis_tarihi
cikis_miktari
cikis_tutari

URUN_STOK
barkod_no
giris
g_tutari
cikis
c_tutari

spi ve spd ler şöyle

Kod: Tümünü seç

CREATE PROCEDURE SPI_URUN_GIRIS (
    BARKOD_NO VARCHAR(128),
    GIRIS_MIKTARI INTEGER,
    GIRIS_TUTARI FLOAT)
AS
DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
begin 
  select count(*) 
  from URUN_STOK where BARKOD_NO = :BARKOD_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into URUN_STOK(BARKOD_NO,GIRIS) values(:BARKOD_NO,0);
  update URUN_STOK set 
    GIRIS = GIRIS+:GIRIS_MIKTARI where
    BARKOD_NO = :BARKOD_NO;

  select count(*) 
  from URUN_STOK where BARKOD_NO = :BARKOD_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into URUN_STOK(BARKOD_NO,G_TUTARI) values(:BARKOD_NO,0);
  update URUN_STOK set 
    G_TUTARI = G_TUTARI+:GIRIS_TUTARI where
    BARKOD_NO = :BARKOD_NO;
End
*******************************************************

CREATE PROCEDURE SPI_URUN_CIKIS (
    BARKOD_NO VARCHAR(128),
    CIKIS_MIKTARI INTEGER,
    CIKIS_TUTARI FLOAT)
AS
DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
begin 
  select count(*) 
  from URUN_STOK where BARKOD_NO = :BARKOD_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into URUN_STOK(BARKOD_NO,CIKIS) values(:BARKOD_NO,0);
  update URUN_STOK set 
    CIKIS = CIKIS+:CIKIS_MIKTARI where
    BARKOD_NO = :BARKOD_NO;

  select count(*) 
  from URUN_STOK where BARKOD_NO = :BARKOD_NO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into URUN_STOK(BARKOD_NO,C_TUTARI) values(:BARKOD_NO,0);
  update URUN_STOK set 
    C_TUTARI = C_TUTARI+:CIKIS_TUTARI where
    BARKOD_NO = :BARKOD_NO;
End
****************************************************

CREATE PROCEDURE SPD_URUN_GIRIS (
    BARKOD_NO VARCHAR(128),
    GIRIS_MIKTARI INTEGER,
    GIRIS_TUTARI FLOAT)
AS
begin 
  update URUN_STOK set 
    GIRIS = GIRIS-:GIRIS_MIKTARI where
    BARKOD_NO = :BARKOD_NO;
  delete from URUN_STOK 
    where BARKOD_NO=:BARKOD_NO and GIRIS=0;

  update URUN_STOK set 
    G_TUTARI = G_TUTARI-:GIRIS_TUTARI where
    BARKOD_NO = :BARKOD_NO;
  delete from URUN_STOK 
    where BARKOD_NO=:BARKOD_NO and G_TUTARI=0;
end
**********************************************

CREATE PROCEDURE SPD_URUN_CIKIS (
    BARKOD_NO VARCHAR(128),
    CIKIS_MIKTARI INTEGER,
    CIKIS_TUTARI FLOAT)
AS
begin 
  update URUN_STOK set 
    CIKIS = CIKIS-:CIKIS_MIKTARI where
    BARKOD_NO = :BARKOD_NO;
  delete from URUN_STOK 
    where BARKOD_NO=:BARKOD_NO and CIKIS=0;

  update URUN_STOK set 
    C_TUTARI = C_TUTARI-:CIKIS_TUTARI where
    BARKOD_NO = :BARKOD_NO;
  delete from URUN_STOK 
    where BARKOD_NO=:BARKOD_NO and C_TUTARI=0;
end
trigerler şöyle

Kod: Tümünü seç

CREATE TRIGGER TI_URUN_GIRIS FOR URUN_GIRIS
ACTIVE AFTER INSERT POSITION 0
AS 
DECLARE VARIABLE numrows INTEGER; 
BEGIN 
    select count(*) 
      from URUN 
      where      NEW.BARKOD_NO = URUN.BARKOD_NO into numrows;
    IF (      numrows = 0    ) THEN 
    BEGIN 
      EXCEPTION ERWIN_CHILD_INSERT_RESTRICT; 
    END
    execute procedure SPI_URUN_GIRIS NEW.BARKOD_NO, NEW.GIRIS_MIKTARI, NEW.GIRIS_TUTARI;
END
****************************************************

CREATE TRIGGER TI_URUN_CIKIS FOR URUN_CIKIS
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE numrows INTEGER; 
BEGIN 
    select count(*) 
      from URUN 
      where        NEW.BARKOD_NO = URUN.BARKOD_NO into numrows;
    IF (     numrows = 0    ) THEN 
    BEGIN 
      EXCEPTION ERWIN_CHILD_INSERT_RESTRICT; 
    END
    execute procedure SPI_URUN_CIKIS NEW.BARKOD_NO, NEW.CIKIS_MIKTARI, NEW.CIKIS_TUTARI;
END
*****************************************************

CREATE TRIGGER TD_URUN_GIRIS FOR URUN_GIRIS
ACTIVE AFTER DELETE POSITION 0
AS 
BEGIN 
execute procedure SPD_URUN_GIRIS OLD.BARKOD_NO, OLD.GIRIS_MIKTARI, OLD.GIRIS_TUTARI;
END
*****************************************************

CREATE TRIGGER TD_URUN_CIKIS FOR URUN_CIKIS
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN 
execute procedure SPD_URUN_CIKIS OLD.BARKOD_NO, OLD.CIKIS_MIKTARI, OLD.CIKIS_TUTARI;
END
sp ve trigerlerim böyle bunlarla uyguladığım zaman yukarıdaki olay meydana geliyor.

not:şunu itiraf etmeliyim ki (gerektiğini düşünüyorum) bu kodları fahrettin ustamın kodlarından uyarladım.

kolaylıklar diliyorum
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Sanırım yukarıda da söylediğim gibi yine eksik bir şeyler var. Sadece Insert ve Delete SP leri yeterli ve bunlari TI_URUN_GIRIS ve TD_URUN_GIRIS trigger leri ile çağırıp kullanıyorsun. Bir de TU_URUN_GIRIS update trigger i olacak ki değişiklikte eski değeri giriş ise mevcut değerden çıkaracak yeni değer olarak ekliyecek. TU_URUN_GIKIS trigger inde ise tam tersi olacak. Eski çıkış miktarını mevcut degere ekleyip yeni çıkış miktarını (tutarı) çıkartacak. Bunu da mevcut SP lere göndereceğin parametrelerle halledebilirsin. Sonuç olarak yazacağın her iki update trigger inde de yukarıdaki SP leri kullnacaksın. Aslında Fahrettin hocanın seminer örneği bir yerlerde olacak da şu an bulamadım. Ama mantık dediğim gibi.. şuna benzer bir şey olacak tam deneme şansım olmasa da;

Kod: Tümünü seç

CREATE TRIGGER TU_URUN_GIRIS FOR URUN_GIRIS
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
  execute procedure SPD_URUN_GIRIS OLD.BARKOD_NO, OLD.GIRIS_MIKTARI, OLD.GIRIS_TUTARI;
  execute procedure SPI_URUN_GIRIS NEW.BARKOD_NO, NEW.GIRIS_MIKTARI, NEW.GIRIS_TUTARI;
END 

Kod: Tümünü seç

CREATE TRIGGER TU_URUN_CIKIS FOR URUN_GIRIS
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
  execute procedure SPD_URUN_CIKIS OLD.BARKOD_NO, OLD.CIKIS_MIKTARI, OLD.CIKIS_TUTARI;
  execute procedure SPI_URUN_CIKIS NEW.BARKOD_NO, NEW.CIKIS_MIKTARI, NEW.CIKIS_TUTARI;
END 
Burada BARKOD_NO nun old veya new olması farketmiyor. İkisi de birbirine eşit.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla