IBEvents için mesajları kolay bir biçimde register etmek ve.

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
Z.D.
Üye
Mesajlar: 104
Kayıt: 01 Nis 2006 01:48
Konum: İstanbul

IBEvents için mesajları kolay bir biçimde register etmek ve.

Mesaj gönderen Z.D. »

Her programcının kendi yazdığı ve işini kolaylaştırmak için kullandığı fonksiyonlar, prosedürler vardır.bende kendi yazdığım programlarımda kullandığım fonksiyonları, prosedürleri zaman buldukça kod ve makale biçiminde vermeye çalışıcam.

ö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
//---------------------------------------
db tarafında bunları yazmalısınız, delphi tarafındada ibevent bileşenine
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 ;/
//============================================
bu triggerı powerdesigner scripte dönüştürürken, verdiğiniz trigger isminin başına tablo ismini, postevent mesajını gönderirken belirlediğiniz mesajın başına da tablo ismini ekliyor. bu sayede bu triggerımız diğer tablolar için
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
//============================================
burda gördüğünüz gibi değişkenler yalnızca tablo isimleri. delphi tarafında
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');
burda fonksiyonu çağırırken ilk parametrede insert ve delete triggerında belirlediğimiz sabiti, 2. parametredede update için belirlediğimiz sabiti gönderiyoruz. bu gönderilen fonsiyonda datamoduldeki bütün bdatasetlerin selectsql cümlelerini okuyarak tablo ismini buluyor. daha sonra gönderdiğiniz parametreye ekleyip IBEvents bileşenine register ediyor.

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;
mesajları register ettik şimdide gelen mesajları yakalayalım

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;

bu iki fonksiyon ile ibevents karmaşasından kurtulmuş oluyoruz. daha detaylı anlatım ve source kod için birde örnek uygulamalı paket hazırladım. paketin için powerdesigner için resimli örnek tablo ve trigger tasarımı, power designerın oluşturduğu script dosyasındaki syntax problemini aşmak için örnek program, vede bu mesajları yakalayan örnek programın source kodu.
http://rapidshare.de/files/25382768/IBEvent.zip.html
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Paylaşımınız için teşekkürler
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Faydalı bir çalışma olmuş.Teşekkürler.... :lol: :lol: :lol:
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

S.a. hocam örnek upload ettiğiniz yerden silinmiş. Bu örneği tekrar almamız mümkünmü. teşekkürler
nedimtrc
Üye
Mesajlar: 23
Kayıt: 02 Nis 2007 09:31

Mesaj gönderen nedimtrc »

merhaba acaba bu yazdığın kodu ibexpert ile yapmak mümkün mü ben denedim ama invalid tokin % işretini gösteriyor ibexpert ilede bunu oluşturup aynı işlemeleri yapmak mümkün mü acaba heralde ufak bir noktaya takıldım heralde
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

elbette mümkün.
options dan visual options u incele.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla