Firebird : Trigger hangi koşullarda çalışır veya çalışmaz ?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Mesaj gönderen Master43 »

Öncelikle doganzorlu beye herkezin başını az çok ağrıtan bu konuda değerli bilgileri paylaştığı için teşekkür ederim.

Generator ve Constraint kısmı ok. Peki DB tarafında çalışan Trigger'da yapılan hesapları-değişiklikleri Gride eşgüdümlü olarak nasıl yansıtabiliriz.
(Active := False; Active := True; olmadan)
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Mesaj gönderen Fatih! »

NULL Hatasını engellemek için field editörden requirefield özelliğini false yapabilirsiniz. bence sorun tetiklenip tetiklenmemesinden değil database tarafından oluşan işlemleri delphide eş zamanlı olarak gösterebilmek.

bu konudada düşünüyorum düşünüyorum ampülü yakamıyorum. illaki dataseti kapatıp açmak gerekiyor.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Delphi tarafında Trigger ile değeri koyulan AutoInc alanları IBX vs. bileşenleri ile alamazsın. GEN_ID ile alıp alana manuel koyman gerekir.

Aynı mantıkla, Default değerler, yeni kayıt insert edildiğinde alanlarda görünmez, çünkü bileşenler bu değerleri Firebird den fetch edemez. Gözükmesini istiyorsan BeforeInsert te kendin alanlara atama yaparsın.

Bu IBO'da da böyle, IBX de de bu şekilde. Sanırım Default değerlerin alınması için bir Interbase API bulunmuyor, metadata dan parse edilip alınması gerekiyor.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

IBDataset1.refresh;

gibi bir komutla triggerlar içinde meydana gelen değişiklik ve defaultlardan gelen değerler yenilenebilir. Fakat en iyisi property lerden ForcedRefresh değerini true yapmak olacaktır. Sadece aktif row un refresh edildiğini sanıyorum.. (Emin değilim bir yerde okumuştum.. Sadece IBDataSet e mahsus olarak)
En son doganzorlu tarafından 14 Ağu 2005 07:52 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Mesaj gönderen Fatih! »

refresh işlemez
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

refresh bende çalışıyor.. Sizde çalışmayan nedir ? Bu arada default değerlerin db de atanması için ekranda görünmemesi gerekiyor. Ekranda gorunen değerler null dan farklı gittiği için db tarafında default değerleri almıyorlar...

Dikkat edilecek en önemli şey refresh SQL bölümüne girip ordaki optimistik aramayı primary keye göre düzenlenmesidir. Zira ekrandaki tum alanlara göre arıyor ve siz içerde değeri değiştirdiğinizden dolayı refresh edemiyor.. Başıma gelmedi ama bunu atlarsanız kayıt başkası tarafından değiştirilmiş gibi bir hatayla da karşılaşabilirsiniz.

Test için bir trigger da atama yaparak denedim..
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
Fatih!
Kıdemli Üye
Mesajlar: 1172
Kayıt: 26 Kas 2004 10:46
Konum: Malatya
İletişim:

Mesaj gönderen Fatih! »

:oops: :oops: :oops: :oops: :oops: :shock:
şoke oldum ben firebirde ilk başladığımda böyle yaptığımda sonuç alamamıştım. hem çok sevidim hem de cehaletime ağladım :(
beni uykudan uyandırdığın için teşekkürler.
Hala Şoktayım :shock:
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Sayın @doganzorlu benim bahsetmek istediğim dataset i Insert ettiğinizde DBGrid de oluşan boş row, kendiliğinden default değerleri ve generator değerini alamayacaktır. Post yaptıktan sonra bahsettiğiniz şekilde trigger dan atanan değerleri görmek mümkündür. Ancak post etmeden beforeinsert te bu değerleri kendimiz atamamız gerekir. BAhsettiğiniz yöntem ile Insert ten sonra refresh yaparsak dataset otomatik post edecek, değer giriş bölümünü kaçıracağız.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@coderlord yazdı: Ancak post etmeden beforeinsert te bu değerleri kendimiz atamamız gerekir. BAhsettiğiniz yöntem ile Insert ten sonra refresh yaparsak dataset otomatik post edecek, değer giriş bölümünü kaçıracağız.
- Bu duruma paralel başka bir ekleme daha yapayım.. :idea:

- İlk verdiğim kod örneklerinde göreceğiniz gibi, Not Null kontrollü ve Trigger tarafından :

Kod: Tümünü seç

      SQL.Add('ACTIVE BEFORE INSERT POSITION 0');
olayında görüldüğü gibi Before Insert ile AutoIncremental artışa ayarlanmış bir alan olan T1_ID alanına atanan değeri TDBGrid'de OnLine göremeyişime rağmen, şöyle bir deneme yaptım.

- Verdiğini değerlendirdiğim değere karşın INSERT aşamasında bu alana kendim rastgele bir değer girdim. POST sonrası bir sürpriz ile daha karşılaştım. Verdiğim rastegele değer değil Trigger'in verdiği değerlendirmeye alınmış...!!!

- Şöyle bir durum daha söz konusu olduğu görüyorum, yanılıyorsam düzeltiniz; Trigger ile Before Insert olayında şartlar ile kontrolü sağlamak üzere verdiğimiz değerleri, program içerisinden normal INSERT sırasında zaten Trigger çoktan belirlemiştir ama biz yenisini yazalım desek bile, TDBGrid ile yeniden değerleme yapamıyoruz... Böyle bir mecburiyet varsa taa başa gidip trigger üzerinde yeni duruma göre güncelleme yapmak gerekiyor veya TDBGrid'i devre dışı bırakıp TIBSQL ile direkt kayıt yapmak gerekiyor...

- Mesela "Pazar günlerine rastlayan tarihlerde %50 indirim yapar" diye ayarlanmış bir trigger için, program içerisinden "Resmi Tatile rastlayan şu tarihte bunu uygulama" demek için DBGrid'den girişe müsade etmemek gerekiyor... 8)
Resim
Resim ....Resim
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Kod: Tümünü seç

Sayın @doganzorlu benim bahsetmek istediğim dataset i Insert ettiğinizde DBGrid de oluşan boş row, kendiliğinden default değerleri ve generator değerini alamayacaktır.
thread in biraz üzerlerindeki bir yazımdan;

Kod: Tümünü seç

Default değerleri, DataSet de de set edersiniz. Burada yapıyorsam bir de DB ye neden yapıyorum demeyin. Oraya birisi başka bir kaynaktan veri insert ederse DB stabilitesi için gerekli olacaktır. 
Bunu zaten belirtmiştim...
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Cevapla