Sonsuz döngüye giren trigger

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ı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Sonsuz döngüye giren trigger

Mesaj gönderen armadillo »

Kod: Tümünü seç

CREATE TRIGGER GIRIS FOR FUELOIL_GIRIS
ACTIVE BEFORE INSERT POSITION 0
AS
begin update fueloil_giris
set   fueloil_giris.gelen= fueloil_giris.gelen / (select d_carpan.deger from d_carpan where d_carpan.turu='fueloil');
end
yukarıdaki trigeri update özelliğinide girersem sonsuz döngüye giriyor bunu nasıl önlerim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Öncelikle ne yapmak istediğinizi yazmalısınız :idea:
Bu şekilde her yeni kayıt girişinden önce ilgili tablonun tüm kayıtlarını güncelleler :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

Yapmak istediğim tam olarak kayıt değişikliğinde değişen veya yeni eklenen kaydı diğer bir tablodaki değere bölmek yani birim dönüşümü gelen miktar ton cinsinden yazılıp carpan tablosundaki katsayıya bölmek ( bu şekilde tank cinsinden % hesabı yapıyorum yani gelen 3000 ton yakıt tankın %50 si yapıyor gibi.)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

INSERT olayının anlık öncesinde (Before Insert te henüz yeni boş kayıt eklenmeden öncesi) veya sonrasında (After Insert te yeni boş bir kayıt eklendi) sadece tabloda boş bir kayıt olacağından bu tür bir işlemi bu şekilde yaptıramazsınız :!: Buradaki BEFORE INSERT yerine AFTER INSERT olunca tablodaki alanlara bilgi atanabilir. Fakat bu şekilde de yine sizin üzerinde işlem yapacağınız alanda bilgi olmadığından işe yaramıyacaktır. Çözüm: bu trigger AFTER UPDATE olarak değiştirip, delphi içinden kayıttan sonra;

Kod: Tümünü seç

Tablo.Edit;
Tablo.Post;
ile AFTER UPDATE triggerini tetiklemek olacaktır :idea:

Ya da AfterPost içinde de yapılabilir;

Kod: Tümünü seç

Tablo.AfterPost := nil;
Tablo.Edit;
Tablo.Post;
Tablo.AfterPost := TabloAfterPost; // adı her ne ise;)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
armadillo
Üye
Mesajlar: 67
Kayıt: 07 Tem 2005 01:16
Konum: Antalya

Mesaj gönderen armadillo »

sayın hocam yukarıda verdiğim kod sorunsuz çalışıyor fakat bu koda before update eklersem sonsuz bir döngüye giriyor. Zaten trigger alanın değerini değiştiridiği için tekrar update etmiş oluyor ve bu sürekli devam ediyor. Firebird kulanmamdaki amacım herhangi bir hesaplamayı program ara yüzünden ayrı tutmak ve kendimi FB de geliştirmekti. Programım tek kullanıcılı olacağı için FB belkide gereksiz diye düşüne bilirsiniz. Paradoxlada çözülebilirdi. ama asıl amacım FB de kendimi geliştirmek ve bütün hesaplamaları ve diğer tablo lar ile bağlantılı güncelleştirmeleri Server tarafında çözmek yani sizi benim programımı kullanmadan veri girişi veya değişikliği yapsanız dahi proje bütünlüğü bozulmaması Ayrıca sizden ricam (Sanırım ben anlatmak istediğinizi tam olarak anlayamadım.) biraz daha basit bir dille anlatmanız. Buradaki ana sorun yukarıdaki hesaplamanın update olayı sonrasında da sorunsuz çalışması ama ana problem update ten sonra tetiklene olayında bir update gerçekleştirmesi ve sonsuz döngü sadece FB tarafında bir çözüm var ise onu kullanmak istiyorum. (En basiti dephide prog tarafında hesaplamayı yapıp sonucu vt ye atmak olurdu ama bu çözüm vt ye başka bir yolla veri girişi yapıldığında veri bütünlüğünün bozulmasına sebep olacak) Saygılarımla İsmail YILDIRIM
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

FB kullanıyorsanız,

UPDATE INSERT ve DELETE Triggerlarında

NEW ve OLD diye Tablonun alanlarının tutulduğu yerler vardır.

Yani
Bir UPDATE triggerında siz yeniden bir UPDATE Cümlesi göndermeden, bulunduğu (yani o anda işlem gören kaydı değişikliğe uğratabilirsiniz.

Sizin örneğinizde,

Kod: Tümünü seç

CREATE TRIGGER GIRIS FOR FUELOIL_GIRIS
ACTIVE BEFORE INSERT POSITION 0
AS
begin 
  NEW.gelen= NEW.gelen / (select d_carpan.deger from d_carpan where d_carpan.turu='fueloil') ;
end
Trigger'ınızı bu şekilde yazın. Sorunsuz çalışır.

Kolay gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla