Firebird : Trigger hangi koşullarda çalışır veya çalışmaz ?
Ö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)
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)
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.
bu konudada düşünüyorum düşünüyorum ampülü yakamıyorum. illaki dataseti kapatıp açmak gerekiyor.
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.
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.
-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
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)
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)
------------------------
"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)
-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
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..
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)
------------------------
"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)
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.
- Bu duruma paralel başka bir ekleme daha yapayım..@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.

- İ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');
- 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...

-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
Selam,
thread in biraz üzerlerindeki bir yazımdan;
Bunu zaten belirtmiştim...
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.
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.
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)
------------------------
"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)