Trigger ile alan guncelleme(Fahrettin Beyin Makalesinde)

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ı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Trigger ile alan guncelleme(Fahrettin Beyin Makalesinde)

Mesaj gönderen gkimirti »

ilk önce bu mesajı fahrettin beyin makalesinin ardına ekliyeyim dedim sonra vazgecip buraya bir baslık acıp atmak daha uygun geldi
öncelikle makale cok guzel. kafamdaki bir cok sey yerine oturdu
verdiginiz uygulamayı yaptım (fb1.5 da ibexpert ile)
lakin bir sorun var gibi
urun tablosundaki update triggeri urun_no degistirilirse
urun_giris tablosundaki ilgili urun_no alanlarını guncelliyor,guzel
ama urun_giris tablosu bu guncelleme sonucunda urun_giris_update triggerini cagırıp stok ta bir hareket olmamasına ragmen urun tablosundaki
urunun miktarını ikiye katlıyor
biraz uzerinde oynadım ama olmadı
ilgili trigger asagıda
procedureler sizin kodladıgınız gibi
bir degisiklik yapmadım

Kod: Tümünü seç

CREATE TRIGGER TUPD_URUN_GIRIS FOR URUN_GIRIS
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
    EXECUTE PROCEDURE SPD_URUN_GIRIS OLD.URUN_NO, OLD.GIRIS_MIKTARI;
    EXECUTE PROCEDURE SPI_URUN_GIRIS NEW.URUN_NO, NEW.GIRIS_MIKTARI;
end

bu konu takıldı kafama sabahtan beri ugrasıyorum
boyle bir uygulama cok faydalı olacak bu mevzuları ogrenmek icin
amam ben takıldım mı bir nokta da (kod yazarken)
onu asana kadar bir sey yapamıyorum,
huyum kurusun iste :?
neyse yine de makale icin cok tesekkurler
Sp le ile Rapor hazırlama kısmını da sabırsızlıkla bekliyorum
Tesekkurler
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Anlasilir olmasi icin örneği basit tutalım derken bu konu ile ilgili klasik bir hatanın içine düştük.

URUN tablosundaki URUN_NO alanını güncelemek istendigiğinde URUN_GIRIS ve URUN_SATIS tablolarındaki URUN_NO alanlarının da güncellenmesi referential integrity geregi yapılıyor. Bu doğal fakat bunun dezavantajı URUN_GIRIS'in update triggeri çalişiyor ve de de eski URUN_NO lu STOK_MIKTARI'nı azaltıyor ki yok artik oyle bir satir. Yenisini de arttiriyor. Dolayısıyla çift girişer oluıyor.

Aslında gerek stok gerekse cari hesapları tutmak için ayrı bir tablo kullanırız. Şöyleki URUN_STOK isimli bir tabloda sadece URUN_NO ve STOK_MIKTARI şeklinde iki alan olur. Bu tablo'nun diğer tablolarla bir referential integrity ilişkisi olmaz. Bu tabloda başlangıçta hiç kayıtta olmaz. triggerlar vasıtasıyla gerekirse kayıot eklenip gerekli updateler yapılır. Aslında bunu bir kural olarak dikkat ederiz. Triggerlar vasıtasıyla update edilen bu tur stok ve cari tabloları ayrı tablolar olur ve diğer tablolarla bir ilişkisi olmaz. Ben örneği daha basit olarak planlayım derken bu hatanın içine düştüğümü farkedemedim. :(

Makaleyi bu duruma uygun bir şekilde düzenleyeceğim.
ikazınız için teşekkür ederim....
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

cok tesekkurler acıklamalar icin
bu isin kitabını okumayınca (vt programlama) bazı seylerin yaklasım mantıgınıda bilmiyoruz.yavas yavas bir seyler gelişiyo
oyleki uzayda bir nesne gibi gelirdi client/server vt (veri tabanı) programlama
ewt sizin de acıklamalarınız ile bayagı biseyler ogrendim
allah razı olsun sizden
tesekkurler
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

estağfirullah, Allah cümlemizden razı olsun...

URUN_STOK şeklinde ayrı bir tabloyu ve bu duruma göre değişen stored procedure kodlarını yazdım. Trigger kodlarına birşey değişmiyor. Bir de SPD_URUN_GIRIS procedure'unun kodunu eklemeyi unutmuşum sanıyorum onu da ekledim.

Kolay gelsin.....
Cevapla