öncelikle vericeğim fonksiyonun ne işe yaradığından bahsediyim. biliyosunuz db için client-server uygulamalarında ağdaki makinanın insert,update,delete gibi işlemlerini bize haber veren interbase'n IBEvents bileşeni var bu bileşeni kullanarak datasetimizi refresh,close-open gibi işlemleri yaptırabiliyoruz.bu sayede veriler güncelliğini koruyor.
IBEvents bileşenini kullanırken mantıklı olan insert ve delete mesajını update mesajından farklı almak gerekir. çünkü update de dataseti yalnızca refresh etseniz yeterlidir. kapatıp açmanıza gerek yoktur.
veritabanımızdan
A_TABLOSU, B_TABLOSU olsun
Kod: Tümünü seç
//---------------------------------------
CREATE TRIGGER ATABLOSU_TR FOR A_TABLOSU
ACTIVE AFTER INSERT POSITION 0
as
begin
post_event 'A_TABLOSU 'NA KAYIT EKLENDİ';
end
//---------------------------------------
CREATE TRIGGER BTABLOSU_TR FOR B_TABLOSU
ACTIVE AFTER INSERT POSITION 0
as
begin
post_event 'B_TABLOSU 'NA KAYIT EKLENDİ';
end
//---------------------------------------
tablolar için yazdığınız bu mesajları tek tek belirtip register etmek zorundasınız. bu 5-10 tablo için bi problem olmaz ama düşünsenize 40-50 tablo ile çalıştığınız. tek tek ibevent bileşenine girmek bu mesajları, çok zor olur. ben bu zorluğu aşmak için bir fonksiyon yazdım. veritabanı tasarlarken powerdesigner programını kullanıyorum. dolayısıyla vericeğim fonksiyonda onunla beraber işe yaramaktadır.
Powerdesignerde,
after insert,delete triggerı için kullandığım kod
Kod: Tümünü seç
//============================================
set term /;
create trigger %TABLE%_%TRIGGER% for %TABLE%
after insert or delete as
begin
post_event '%TABLE% NA KAYIT EKLENDI VEYA SILINDI';
end;/
set term ;/
//============================================
after update için kullandığım kod
//============================================
set term /;
create trigger %TABLE%_%TRIGGER% for %TABLE%
after update as
begin
post_event '%TABLE% NDA KAYIT DEGISTIRILDI';
end;/
set term ;/
//============================================
global bir trigger oluyor. kopyala-yapıştır yaparak diğer tablolardada rahatlıkla kullanabilirsiniz.
ibexpertte bu script dosyasını rebuild edip derlediğimizde
Kod: Tümünü seç
//============================================
CREATE TRIGGER A_TABLOSU_AFT_UPT FOR A_TABLOSU
ACTIVE AFTER UPDATE POSITION 0
as
begin
post_event 'A_TABLOSU NDA KAYIT DEGISTIRILDI';
end
//============================================
CREATE TRIGGER B_TABLOSU_AFT_UPT FOR B_TABLOSU
ACTIVE AFTER UPDATE POSITION 0
as
begin
post_event 'B_TABLOSU NDA KAYIT DEGISTIRILDI';
end
//============================================
datasetin selectsql cümlesini okuyarak tablo ismini buluruz daha sonra update için sabit olan Tablo ismi+' NDA KAYIT DEGISTIRILDI' sabitini ekleriz. böylece ibevent için mesajı bulmuş oluruz. bunları aşağıdaki yazdığım kod ilede otomatik olarak ibevent bileşenine register etmiş oluruz:)
database bağlantınız yaptığınız kod kısmının altına
Kod: Tümünü seç
AA_SetIBEvents(' NA KAYIT EKLENDI VEYA SILINDI', ' NDA KAYIT DEGISTIRILDI');
Kod: Tümünü seç
//===============================================================
// IBEvent için db de belirleidğimiz mesajları register edelim
//===============================================================
Procedure TMM.AA_SetIBEvents(aaINSDEL: String; aaUPD: String);
Var
i, j: Integer;
a, b: String;
Begin
IBEvents1.Events.Clear;
For i := 0 To MM.ComponentCount - 1 Do Begin
If Components[i] Is TIBDataSet Then Begin
TIBDataSet(Components[i]).Active := TRUE;
a := TIBDataSet(Components[i]).SelectSQL.Text;
a := AnsiReplaceStr(a, #13#10, ' ');
delete(a, 1, pos(' from ', a) + 5);
For j := 0 To length(a) Do Begin
If a[j] > ' ' Then Begin
a := copy(a, j, length(a));
a := copy(a, 1, pos(' ', a) - 1);
break;
End;
End;
b := a + aaINSDEL;
IBEvents1.Events.Add(b);
b := a + aaUPD;
IBEvents1.Events.Add(b);
End;
End;
IBEvents1.AutoRegister := TRUE;
End;
Kod: Tümünü seç
//===============================================================
// IBEventin mesajlarını yakalamak için
//===============================================================
Procedure TMM.IBEvents1EventAlert(Sender: TObject; EventName: String;
EventCount: Integer; Var CancelAlerts: Boolean);
//===============================================================
Function FF_GetDataset(aaPadd: String; aaEventname: String; Var aaPrmKey: String): TIBDataSet;
Var
i, j: Integer;
a: String;
Begin
result := Nil;
With MM Do Begin
For i := 0 To MM.ComponentCount - 1 Do Begin
If MM.Components[i] Is TIBDataSet Then Begin
TIBDataSet(MM.Components[i]).Active := TRUE;
a := TIBDataSet(MM.Components[i]).SelectSQL.Text;
a := AnsiReplaceStr(a, #13#10, ' ');
delete(a, 1, pos(' from ', a) + 4);
For j := 0 To length(a) Do Begin
If a[j] > ' ' Then Begin
a := copy(a, j, length(a));
a := copy(a, 1, pos(' ', a) - 1);
break;
End;
End;
If aaEventname = a + aaPadd Then Begin
Q_BOXS.Close;
Q_BOXS.SQL.Clear;
Q_BOXS.SQL.Add(' SELECT C.RDB$RELATION_NAME as Table_Name, I.RDB$FIELD_NAME as Primary_Key');
Q_BOXS.SQL.Add(' FROM RDB$RELATION_CONSTRAINTS C');
Q_BOXS.SQL.Add(' JOIN RDB$INDEX_SEGMENTS I ON (C.RDB$INDEX_NAME = i.RDB$INDEX_NAME)');
Q_BOXS.SQL.Add(' WHERE C.RDB$CONSTRAINT_TYPE = :FFTarget and');
Q_BOXS.SQL.Add(' C.RDB$RELATION_NAME=:FFTable_Name');
Q_BOXS.SQL.Add(' ORDER BY C.RDB$RELATION_NAME, I.RDB$FIELD_POSITION');
Q_BOXS.ParamByName('FFTable_Name').AsString := a;
Q_BOXS.ParamByName('FFTarget').AsString := 'PRIMARY KEY';
Q_BOXS.Open;
If Q_BOXS.RecordCount > 0 Then
aaPrmKey := Q_BOXS.FieldByName('Primary_Key').AsString
Else
aaPrmKey := '';
aaPrmKey := AnsiReplaceStr(aaPrmKey, ' ', '');
result := TIBDataSet(MM.Components[i]);
break;
End;
End;
End;
End;
End;
//===============================================================
Var
i: Integer;
xDataset: TIBDataset;
xPrmKey: String;
Begin
//===============================================================
// INSERT VE DELETE FONKSİYONU
//===============================================================
xDataset := FF_GetDataset(' NA KAYIT EKLENDI VEYA SILINDI', EventName, xPrmKey);
If (xDataset <> Nil) And (xPrmKey <> '') Then Begin
i := xDataset.FieldByName(xPrmKey).AsInteger; xDataset.Close; xDataset.Open; xDataset.Locate(xPrmKey, i, []);
xPrmKey := 'Dataset = '+ xDataset.Name +#13#10+
'Primary Key = ' + xPrmKey +#13#10#13#10+
'Kayıt Eklendi veya Silindi. <<<<<<<<<<<<<<' ;
showmessage(xPrmKey);
exit;
End;
//===============================================================
// UPDATE FONKSİYONU
//===============================================================
xDataset := FF_GetDataset(' NDA KAYIT DEGISTIRILDI', EventName, xPrmKey);
If (xDataset <> Nil) And (xPrmKey <> '') Then Begin
xDataset.Refresh;
xPrmKey := 'Dataset = '+ xDataset.Name +#13#10+
'Primary Key = ' + xPrmKey +#13#10#13#10+
'Kayıt Değiştirildi. <<<<<<<<' ;
showmessage(xPrmKey);
exit;
End;
//===============================================================
End;
http://rapidshare.de/files/25382768/IBEvent.zip.html