Diyelimki bir program hazırlıyorsunuz.Database olarak da Firebird kullanıyorsunuz.Malum Firebird server tabanlı bir database ve ağ üzerinde güvenli ve etkili kullanım, aynı anda bir çok kullanıcının edit,insert ve post işlemlerini yapmasına olanak sağlayacak özellikte.Yeterki biz bunu kullanmasını bilelim.Kısaca Firebird databaseden triggerler sayesinde alacağımız mesajları işlemeyi nasıl yapacağımız anlatmaya çalışayım.
Tablonun after insert, after update, after delete olaylarında tetiklenecek triggeri aşağıdaki gibi yazabiliriz.
CREATE TRIGGER HASTALARCHNG FOR HASTALAR
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
post_event 'HASTALARDEGISTI';
end
Bu şu demektir.Hastalar tablosunda bir kayıt ekleme, düzenleme ve silme olursa veritabanından exemize (ki exemizde ibevent nesnesi ile bu mesajı alacağız.) Hastalardegisti mesajı gelecek.
Gelelim delphi tarafına.
Şimdi gelelim bu mesajı nasıl alıp nasıl kullanacağımıza.
Dikkat edecğimiz iki nokta var.Bu mesaj bize geldiğinde bizim datasetimiz edit yada insert modda olabilir.Her mesaj geldiğinde dataseti açıp kapatırsak istem dışı kayıtlar yada problemler olur.Mesela adam kayıt yapıyor, ad soyad yazmış adresi yazıyor.Ağda başka bir user insert yaptı ve database bütün clientlere yani exelere değişiklik mesajını gönderdi.Senin exen de bu mesajı alır almaz dataseti kapatıp açarsa nolur.Adam adresi yazamadan , diğer bilgileri giremeden istem dışı kayıt yapıldı.Ekranda o kayıt kayboldu..Hem ayrıca belki cancel yapacaktı post etmeyecekti.Ben bunu kontrol etmek için bir procedure kullanıyorum.Datasetin edit modda olup olmadığını kontrol edip eğer değilse close open yapıyor.(Bu arada şunuda belirtelim IBX bileşenlerinde Refresh olayı yerine Close Open yapıyoruz.)
procedure Tazele(DatasetAdi: TIBDataSet);
var
BM: TBookmark;
begin
if DatasetAdi.State in [dsedit, dsinsert] then
begin
//Eğer Dataset açıksa ve aynı zamanda da kayıt modda ise
exit;
//procedurden çıkalım
end;
//=======================
with DatasetAdi do
try
DisableControls; //Kontrolleri Datasetten ayıralım
try
BM := GetBookmark; //Kayıst setinin yerini işaretleyelim
//=======================
DatasetAdi.Close;
DatasetAdi.Open;
GotoBookmark(BM);
except
on e: Exception do
ShowMessage('Bir Hata Oldu.Hata Mesajı:' + CrLf + e.Message);
end;
finally
EnableControls;
end;
end;
Şimdi bu proceduru ve mesajları nerede kullanacağımıza bakalım.
OlayYakala adındaki IBEvent nesnemizin OnAlert eventine resimde de görüleceği üzere şu kodu yazıyoruz.
//========================================================//
if EventName = 'HASTALARDEGISTI' then
begin
Tazele(HastaDataSet);
end;
//========================================================//
Yani HASTALARDEGISTI mesajı geldiyse(ki bu mesaj HASTALAR tablosunda değişiklik olduğunda geliyordu,) ve datasetimde edit yada insert modda değil ise dataseti açıp kapatarak tazeliyoruz.
Bunları uygulayın.Programınızdan iki adet çalıştırın.Bir tanesinde kayıt ekranını açın.Diğerinde de aynı ekranı açıp yeni bir kayıt ekleyin, silin yada düzenleyip post yapın .Post komutunu verir vermez diğer programınzıdaki verilerinde kendiliğinden anında güncellendiğini göreceksiniz.
s.a.
Newmember kardeş
Aklın yolu birdir derler, bende aynı mantığı kullanırım programlarımda.
Aynı satırları defalarca yazacağınıza ya bir fonksiyon yada bir procedure tanımlarsınız.
Yalnız sizin bu kodda Gotobookmark(BM) dan sonra bir de Freebookmark(BM) olması gerekmiyor mu dikkatimi çekti
Kolay gelsin
yakgul yazdı:s.a.
Newmember kardeş
Aklın yolu birdir derler, bende aynı mantığı kullanırım programlarımda.
Aynı satırları defalarca yazacağınıza ya bir fonksiyon yada bir procedure tanımlarsınız.
Yalnız sizin bu kodda Gotobookmark(BM) dan sonra bir de Freebookmark(BM) olması gerekmiyor mu dikkatimi çekti
Kolay gelsin
a.s.
Procedure içinde tanımlanan değişkenler o prosedurden çıkılınca otomatik olarak bellekten atılır diye biliyorum.O yüzden free etme ihtiyacı hissetmedim.
Ustam elline sağlık güzel bir noktaya temes etmişin
Ustam herşeyi dediğin gibi yaptım ama
procedure Tazele(IBDATASET1: TIBDataSet);
var
BM: TBookmark;
begin
if IBDATASET1.State in [dsedit, dsinsert] then
begin
//Eğer Dataset açıksa ve aynı zamanda da kayıt modda ise
exit;
//procedurden çıkalım
end;
//=======================
with IBDATASET1 do
try
DisableControls; //Kontrolleri Datasetten ayıralım
try
BM := GetBookmark; //Kayıst setinin yerini işaretleyelim
//=======================
IBDATASET1.Close;
IBDATASET1.Open;
GotoBookmark(BM);
except
on e: Exception do // ShowMessage('Bir Hata Oldu.Hata Mesajı:' + CrLf + e.Message);
end;
finally
EnableControls;
end;
end;
procedure TForm3.IBDataSet1AfterPost(DataSet: TDataSet);
begin Tazele(IBDataSet1);end;
procedure TForm3.TAZELEEventAlert(Sender: TObject; EventName: String;
EventCount: Integer; var CancelAlerts: Boolean);
begin
if EventName = 'KAYITGIRILDI' then
begin
Tazele(IBDataSet1);
end;
end;
end.
ama şöle bir hata veriyor
[Error] Unit3.pas(447): Missing operator or semicolon
acaba burada post_event mesajını dinamik hale getirme şansımız var mı ? örneğin kaç numaralı kaydın değiştiğini almak istiyorum. post_event 'KAYIT'||new.kayitno gibi bişey yapsak. bunu delphi tarafında yakalamanın bir yolu var mı?
yada değişen kaydın hangisi olduğu nasıl bulunabilir.