Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)

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ı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)

Mesaj gönderen NewMember »

Merhaba Arkadaşlar;

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.



Kod: Tümünü seç

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.


Resim



Gelelim delphi tarafına.


Resim



Ş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.)



Kod: Tümünü seç

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.


Resim




OlayYakala adındaki IBEvent nesnemizin OnAlert eventine resimde de görüleceği üzere şu kodu yazıyoruz.

Kod: Tümünü seç

//========================================================//
  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.


Herkese çalışmalarında başarılar.
Saygılarımla......
En son NewMember tarafından 16 Oca 2007 08:37 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

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
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

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.
erginas
Üye
Mesajlar: 5
Kayıt: 14 Kas 2005 10:11

Eline sağlık

Mesaj gönderen erginas »

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

nasıl yapabilirim şimdiden teşekkürler
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Unit3.pas daki 447 nolu satır hangisi :?:

Ayrıca mesajını edit leyip daha okunaklı hale getirebilirsin. Çünkü TAG ler birbirine girmiş :roll:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Sanırım syntax hatası yapmışsın.Bir daha yeniden dikkatli yazmaya çalış.
try
Üye
Mesajlar: 44
Kayıt: 14 Nis 2005 03:21

Mesaj gönderen try »

selamlar,

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.
Cevapla