Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

ÖNEMLİ AÇIKLAMA: MUTLAKA OKUYUNUZ!

Gönderen Konu: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)  (Okunma sayısı 4542 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı NewCoder

  • Üye
  • ***
  • İleti: 30
  • Rep: +0/-0
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: [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.






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




Kod: [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.







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

Kod: [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.
(Not=Değişikliklerin algılanabilmesi için transactionun commit edilmesi gerektiğini unutmayalım)

Herkese çalışmalarında başarılar.
Saygılarımla......
« Son Düzenleme: 27 Kasım 2006 22:20:14 by NewCoder »
Patch'i Çıkmamış Programdan Ümit Kesilmez.

Mal kaybeden, bir şey kaybetmistir, onurunu kaybeden birçok şey kaybetmiştir.
Fakat cesaretini kaybeden her şeyini kaybetmistir.
--Goethe--

Çevrimdışı Fatih

  • Emekli Yönetici
  • *****
  • İleti: 2.217
  • Rep: +43/-10
  • Cinsiyet: Bay
    • Delphi Dünyası
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #1 : 27 Kasım 2006 20:43:20 »
Teşekkürler. Makalede bulunan resimleri sunucumuza attım
Malulen emekli programcı / yazar. Bildiklerini unutmakta olduğundan size cevap veremez.

Çevrimdışı NewCoder

  • Üye
  • ***
  • İleti: 30
  • Rep: +0/-0
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #2 : 27 Kasım 2006 22:13:19 »
Eyvallah hocam.Zaten bir süre sonra ResimLoad siliyordu.Böyle daha kalıcı olmuş.
Patch'i Çıkmamış Programdan Ümit Kesilmez.

Mal kaybeden, bir şey kaybetmistir, onurunu kaybeden birçok şey kaybetmiştir.
Fakat cesaretini kaybeden her şeyini kaybetmistir.
--Goethe--

Çevrimdışı Ahmet YILMAZ

  • Yeni Üye
  • *
  • İleti: 2
  • Rep: +0/-0
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #3 : 01 Aralık 2009 22:38:56 »
Bu işlemin Sql de olanı yokmu acaba

Çevrimdışı dabaddah

  • Yeni Üye
  • *
  • İleti: 8
  • Rep: +0/-0
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #4 : 06 Ağustos 2010 11:30:18 »
Arkadaşlar konu ile ilgili internette bulabileceğiniz neredeyse tek makale bu diyebilirim.ondan dolayı yazanların ellerine sağlık.belki örnekleri vardır ama derdinizi anlatmak için hep aynı şeyleri yazdığınızdan arama motoruna,hep aynı sonuçlar çıkıyor.

bu makalede herşeyi birebir denedim ama şöyle bir durum sözkonusu. yazdığım küçük test uygulamasında.

client bilgisayardan yaptığım kayıt anamakineye yansımıyor taki client tarafındaki tabloyu close yapıncaya kadar

aslında triggerdan mesaj geliyor ama ibevent nesnesinin oneventsalert olayındaki kod ben client tarafından tabloyu kapattığım zaman çalışıyor.

bunuda şu şekilde anladım server tarafında test uygulamasını debug ederek çalıştırdım ibevent nesnesinin oneventsalert olayına breakpoint koydum bu event tabloya kayıt girildiğinde yada güncellendiğinde çalışmadı.

bu olay ben client tarafında tabloyu close ettiğim zaman çalıştı tabi breakpoint koyduğum için triggerden gelen mesajın doğru olduğunu gördüm ve dolayısıyla tazele procedure ü çalıştı tazelemeyi yaptı.

ancak sacede dediğim gibi client tarafında tabloyu kapattığım zaman bu event çalıştı.bunun nedeni ve çözümü ne olabilir.

ayrıca birde unidac bileşeninde ibevent nesnesinin işini görecek bir bileşen var mı?

Çevrimdışı SsEeRrCcAaNn

  • Kıdemli Üye
  • *****
  • İleti: 703
  • Rep: +5/-0
  • Cinsiyet: Bay
  • Delphi and JALv2 programmer
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #5 : 06 Ağustos 2010 13:34:57 »
@dabaddah aynı sorunu geçenlerde ben yaşamıştım çözüm olarak sonradan fark ettiğim üzere ekleme işleminden sonra kod ile transactionu Commit yaptığımda sorun çözüldü.. fikir vermesi açısından yazıyorum..

kolay gelsin..
Artık bir insanın önüne bir bilgisayar koyarak onu daha üretici yapamıyoruz. O günler geride

Çevrimdışı dabaddah

  • Yeni Üye
  • *
  • İleti: 8
  • Rep: +0/-0
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #6 : 06 Ağustos 2010 14:14:46 »
SsEeRrCcAaNn dostum ilgin ve cevabın için teşekkür ederim.

haklısın dostum kaydı  yaptıktan sonra commit yaptığımda sorun çözüldü.

ancak birşeyin nedenini niçinini bilirsek hem bizim için hem forum için daha iyi olur bunun neden kaynaklandığını bilen varsa ve paylaşırsa daha iyi olur.

ayrıca ikinci sorumda devam ediyor unidac bileşen setinde ibevent nesnesinin yaptığı işi yapan bir bileşen var mı?

Çevrimdışı SsEeRrCcAaNn

  • Kıdemli Üye
  • *****
  • İleti: 703
  • Rep: +5/-0
  • Cinsiyet: Bay
  • Delphi and JALv2 programmer
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #7 : 06 Ağustos 2010 14:59:17 »
@dabaddah transaction commit işlemi yapılmadığı zaman veriler veritabanına yansımyacaktır..table kapandığı zaman commit işlemi gerçekleşiyor fakat program kapanıyor..sizde söylemişsiniz zaten table kapanınca olay gerçekleştiğini.. ben ekleme güncelleme işlemlerinde genellikle sonunda transaction.CommitRetaining kodunu ekliyorum ve değişiklikleri veritabanına yansıtıyorum.. kendimce açıklamaya çalıştım..

sonraki soruna gelince unidac bileşen setini kullanmadığım için o konuda deneyimli ve bilgili arkadaşlar yardım edeceklerdir..

kolay gelsin..
Artık bir insanın önüne bir bilgisayar koyarak onu daha üretici yapamıyoruz. O günler geride

Çevrimdışı dabaddah

  • Yeni Üye
  • *
  • İleti: 8
  • Rep: +0/-0
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #8 : 06 Ağustos 2010 15:22:43 »
SsEeRrCcAaNn dostum çok teşekkürler verdiğin bilgi için çok teşekkürler

unidac bileşen setinde eventalerter nesnesini buldum özellikleri aynı zannedersem ibevent ile aynı işi yapıyor.

şuanda testlerini yapıyorum sonucu yazıcam.

Çevrimdışı 61_soner_61

  • Kıdemli Üye
  • *****
  • İleti: 186
  • Rep: +0/-0
  • Cinsiyet: Bay
  • lafa değil önce lafı söyleyene bakarım
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #9 : 23 Mayıs 2011 20:00:45 »
arkadaşlar konu eski ama bi sorum var bu yapılanlar local ağda 5 bilgisayrlı ağda biri server olmak üzere sıkıntısız clientler oto güncelleme yapıyor ama ben servera başka yani web üzerinden bağlanınca clientim donuyor hatta servera bağlantı bile yapamıyor görevi sonlandır diyorumda kapatıroeum client programımı o derece yani ama ibevent nesnesini pasif yapnca client çok güzel veri alış verişi yapıyor serverla ekle sil düzelt gibi işlemleri. ama ibevent aktif olunca donuyor client neden ne olabilir yardımcı olurmusunuz

Çevrimdışı 61_soner_61

  • Kıdemli Üye
  • *****
  • İleti: 186
  • Rep: +0/-0
  • Cinsiyet: Bay
  • lafa değil önce lafı söyleyene bakarım
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #10 : 25 Mayıs 2011 12:21:40 »
sorunuma çözüm arıyorum arkadaşlar fibplus komponentlerinide kullandım aynı sıkıntı

Çevrimdışı omurolmez

  • Kıdemli Üye
  • *****
  • İleti: 123
  • Rep: +0/-0
  • Cinsiyet: Bay
Ynt: Firebird(Değişikliklerin tüm clientlerde oto güncellenmesi)
« Yanıtla #11 : 31 Mayıs 2011 15:40:16 »
ibevent ikinci bir port (varsayılan tcp3051) kullanır. Bu portun istemcide firewall ve modemde izinli olması gerekebilir.

Öte yandan, web üzerinde ibevent kullanmak web programlamanın mantığına ters. Bkz: TRemoteDataSet ve stateless environment
Ömür Ölmez