Trigger içerisindeki "old.field" and "new.fie

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
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Trigger içerisindeki "old.field" and "new.fie

Mesaj gönderen delphi_programmer »

Selamlar,

Trigger içerisinde "old.field_name" ve "new.field_name" tanımları var.

Eğer bir alan değişmedi ise "new.field_name" ' in içeriğinde yine de bilgi bulunur mu ?

Teşekkürler.
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

Bulunur. Aslında bu soruyu sormak yerine denemek sanırım daha kolay olurdu :).

Alanın değişip değişmediğini ise:

Kod: Tümünü seç

if (old.alan = new.alan) then
....
....
....

şeklinde öğrenebilirsin.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

Ali Erdoğan yazdı:Bulunur. Aslında bu soruyu sormak yerine denemek sanırım daha kolay olurdu :).

Alanın değişip değişmediğini ise:

Kod: Tümünü seç

if (old.alan = new.alan) then
....
....
....

şeklinde öğrenebilirsin.
Teşekkürler.
"Neden denemiyorsun" sorusuna hazırlıklıydım zaten :)

Kod: Tümünü seç

if (old.alan = new.alan) then
....
....
....
koşulunda bir UDF geliştirmiştim, o çalışıyor.
Çalışınca bir mail grubuna yeni bilgileri mail gönderiyor.
Mail gitsin istemedim, onun dışında nasıl test edeceğimi de bilemedim.
Yani consola bir yazı yazmak falan varmıdır onu da bilmiyorum aslında.
FireBird'a başlayalı 1 hafta oldu, 1 hafta sonra da bırakırım sanırım :)
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

Eee ?
O zaman ben trigger içerisinde bir alanın değiştiğini nasıl anlarım ki ?

Açıklıyayım :
Bir tablo üzerinde trigger yazdım. Bir de mail gönderen UDF var.
3 ayrı tablo alanı üzerinde değişiklik varsa bu alanların eski değerlerini ve yeni değerlerini kullanıcıya mail ediyor.

Örnek :

Kod: Tümünü seç

                    ESKİ DEĞERLER | YENİ DEĞERLER
ADI SOYADI          AHMET POLAT       AHMET POLAT
TELEFON             333 33 33         333 33 33
FAKS                444 44 44         555 55 55

Yukarıdaki örnekte FAKS alanı değişmiş ama diğerleri değişmemiş.
Dolayısı ile eğer alanda değişiklik yoksa ilgili alanın Yeni değerini BOŞ göndermeliyim ki, UDF içerisinde karşılaştırma yapabileyim ve değişmeyen alanları mail ile göndermiyeyim.

İnşallah anlatabilmişimdim.

Cevaplar için şimdiden teşekkürler.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
peki bu karşılaştırma işlemini udf den yapsan olmazmı.?
trigerlarde değişken kullanabilirsin.
değişkenlere sadece değişen alanların datasını atarsın.
udf ye de parametre olarak değişkenleri gönderirsin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

aslangeri yazdı:s.a.
peki bu karşılaştırma işlemini udf den yapsan olmazmı.?
trigerlarde değişken kullanabilirsin.
değişkenlere sadece değişen alanların datasını atarsın.
udf ye de parametre olarak değişkenleri gönderirsin.
kolay gelsin.
Evet ben de öyle yapmayı, yani karşılaştırmayı UDF'den yapmayı düşünüyorum.

Ama UDF'e hem OLD hem de NEW'i gönderiyorum.
OLD ve NEW aynı olduğu için (ilgili alanda değişiklik olmasa bile aynı olduğu için) UDF'den de karşılaştırma yaptığımda alanlar eşit oluyor.

Yani değiştiğiniz anlayamıyorum.

Değiştiğini Trigger'dan anlayıp, değişmediyse NEW VALUE ' yu UDF'e gönderirken boş göndermeliyim ki, UDF'de karşılaştırma yapabileyim.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

Bu arada farazi konuşmuş olmamak için de aşağıda TRIGGER kodumu vereyim.

Kod: Tümünü seç

AS
declare variable sonuc varchar(200);
declare variable eski_firma varchar(200);

declare variable eski_departman varchar(200);
declare variable yeni_departman varchar(200);

declare variable eski_bolum varchar(200);
declare variable yeni_bolum varchar(200);

begin

SELECT companyname FROM company where companyid=old.companyid INTO :eski_firma;

SELECT description FROM departments where (department=old.department AND companyid=old.companyid) INTO :eski_departman;
SELECT description FROM departments where (department=new.department AND companyid=new.companyid) INTO :yeni_departman;

SELECT description FROM subdepartments where (subdepartment=old.subdepartment AND companyid=old.companyid) INTO :eski_bolum;
SELECT description FROM subdepartments where (subdepartment=new.subdepartment AND companyid=old.companyid) INTO :yeni_bolum;

/* Trigger text */
if (((old.exitdate is NULL) AND (new.exitdate is not NULL)) OR (old.department<>new.department) OR (old.subdepartment<>new.subdepartment))  then
  begin
sonuc=yep(new.PAYROLLEMPNO,new.name,eski_firma,eski_departman,old.empno,yeni_departman,old.companyid,new.exitdate,eski_bolum,yeni_bolum);
  end
end



Yapmak istediğim ise şu :

EĞER "DEPARTMENT" alanında değişiklik YAPILDIYSA
OLD.DEPARTMENT ve NEW.DEPARTMENT alanlarını UDF'e parametre olarak geç.

EĞER "DEPARTMENT" alanında değişiklik YOKSA OLD.DEPARTMENT alanını gönder ancak NEW.DEPARTMENT alanını "BOŞ" gönder.

Bu sayede ben UDF tarafında

if eski_bolum<>yeni_bolum then ...

gibi bir işlem yapabileceğim.
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

Arkadaşlar kodların karışık olduğuna aldanmayın:)
Sadece Trigger içinde ilgili field'da değişiklik yapılıp yapılmadığını bilsem o da yetecek, lütfen :)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Veri tabanında Exceptions kısmında aşağıdaki gibi bir EXCEPTION tanımlanıp;

Kod: Tümünü seç

CREATE EXCEPTION DUR 'BEKLEME NOKTASI';
Daha sonra da SP veya TRIGGER de uygun yere;

Kod: Tümünü seç

EXCEPTION DUR 'Buraya geldi...';
şeklinde mesajlar verdirilebilir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

delphi_programmer yazdı:Arkadaşlar kodların karışık olduğuna aldanmayın:)
Sadece Trigger içinde ilgili field'da değişiklik yapılıp yapılmadığını bilsem o da yetecek, lütfen :)
Hocam ilk mesajımda da yazmıştım. Eğer old değeri new değerinden farklı ise alan değişmiş demektir. Bu iş bu kadar basit.

Kod: Tümünü seç

if (old.alan <> new.alan) then
begin
 alan değişdiğinde yapılacak işlemler....
end
delphi_programmer
Üye
Mesajlar: 53
Kayıt: 01 Haz 2005 11:47

Mesaj gönderen delphi_programmer »

Ali Erdoğan teşekkürler.
Onun öyle olduğunu zaten biliyordum ama problem Delphi tarafındaymış.
UDF'a gönderdiğim parametreleri mecburen PCHAR cinsinden tanımlanmıştım.

Delphi tarafında

Kod: Tümünü seç

if eski_deger<>yeni_deger then ...
yapmıştım ancak bu karşılaştırma çalışmıyordu.

Kod: Tümünü seç

if string(eski_deger)<>string(yeni_deger) then ...
şeklinde değiştirince problem çözülmüş oldu.

Yakın zamanda Makaleler kısmına (veya neresi uygunsa oraya) Trigger içerisinde, "table üzerinde değişen bilgileri UDF aracılığı ile mail gönderme" gibi bir konu açıp göndereceğim.

Konunun çözülmesine yardımcı olan tüm arkadaşlara teşekkürler.
Cevapla