firebird refresh işlemi.

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

firebird refresh işlemi.

Mesaj gönderen elektroumut »

en sonunda çalışan bir tane firebird 1.5 vt uygulaması yapmayı başardım.
bir tane daha yapamıyorum ama.bunun üzerinde uğraşıyorum bende :D
server üzerinde kurulu bir uygulama var.
bu uygulamayı aynen client bir bilgisayara taşıdım.client bilgisayarda da firebird 1.5 kurdum.(tam sürüm)
client te database editörde remote i seçerek protokol tcp i seçtim.
server X.X.X.X ip adresini girdim.database yolu olarak ta C:\test... diye server üzerindeki fdb dosyasının yolunu gösterdim.
hem server üzerinde hemde client üzerinde uygulama güzel çalışıyor.
Ancak iki bilgisayarın yaptığı değişiklikleri her bilgisayarda da uygulamayı kapatıp tekrar çalıştırarak görebiliyorum.Bunu zaten access ile de yapabiliyordum.
Firebird de iki kullanıcının aynı anda kayıt yapmasını engellemek ve bir buton koyarak mesala diğer kullanıcıların yaptığı değişiklikleri bu butona basarak ekrana yansıtmak istiyorum (refresh işlemi)
bunları firebird de yapmak için neler yapmam lazım?
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

bunun için trans ı kapatıp açman gerekir
Resim arama
En son ALUCARD tarafından 30 Kas 2005 11:04 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

verdiğiniz link çalışmıyor.
transaction açıp kaptmayı uygulama üzerinde bir butona nasıl bağlayabilirim veya çok kullanıcıda vt üzerinde değişikliklerin ekrana yansıması için daha iyi bir çözüm var mı kullanılan?
bir de aynı anda iki kullanıcının kayıt yapmasını nasıl engelleyebilirim?
birisi kayıt işlemini bitirdikten sonra diğeri kayıtını kayıt yapabilsin.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

ayrı bir butona yazmıyorsunuz. kaydet, sil, düzelt v.s. butonlarınızda bulunan kodlarınızın sonuna transaction.active:=true, ve false komutlarını yazıyorsunuz.

aslında transaction u çift tıklayıp arada ikinci seçeneği seçip daha sonra ibdataset in afterpost olayına

ibdataset1.transaction.commitrataining; komutunu verirseniz direkt kayıtları vt ye kaydeder.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Bu konu forumda daha önceden epey konuşuldu.Şimdi bence IBEvent hakkında bilgin varsa (eğer yoksa önce IBEvent konusunu ara) ki şöyle yapılır.Firebird vt üzerinde tablonun

Kod: Tümünü seç

after post

Kod: Tümünü seç

after delete

Kod: Tümünü seç

after insert
olaylarına birer trigger yaz.Mesela X Tablsunda kayıtlar değişti diye.Bir trigger yaz.
Sonra delphi tarafında IBEvent nesnesi ile bu eventleri yakalayarak dataseti kapatıp açarsınız.Yani bir buton koyupta Refresh yapmak yerine yani kullanıcıya bu işlemi yaptırtmak yerine ne zaman tablolarda değiişiklik olursa bunu IBevent nesnesi ile triggerin gönderdiği mesajı yakalayarak refresh yaptırırsınız.Bu konuda foruumda epey kod var.Takıldığınız yer olursa gene yardımcı olmaya çalışalım.
Kolay gelsin.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

local networkteki client lere vereceğim bir uygulamadaki dbedit ler ve dbnavigator sayesinde bir server üzerindeki fdb veri tabanına kayıt yaptıracağım.
Aynı zamanda client larda ve server da bir dbgrid ile de vt üzerinde yapılan değişiklikleri ekrana yansıtmak isityorum.
post , delete , modify olur olmaz yeni değişikliklerin ekrana yansımasını istiyorum.
sizin dediğiniz benim aradığım şeye benziyor.
trigger ve ibevents olayını bi araştırayım.
çok saolun.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

örnek kodlar aşağıda :
Bunları kendinize göre uyarlayabilirsiniz.

Firebird üzerindeki kodlar:(Trigger);

Kod: Tümünü seç

CREATE TRIGGER MUSTERICHANGED FOR MUSTERI
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
  post_event 'MUSTERIDEGISTI';
end
Buda Delphi idesindeki ayarlama kısmı:

Resim

Buda delphi tarafındaki kodlar:

Kod: Tümünü seç

procedure Tdatmodul.OlayYakalaEventAlert(Sender: TObject; EventName: string;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
  //**************************************************************************
  if EventName = 'MUSTERIDEGISTI' then
//Yani müşteri tablosunda değişklik olduysa ve datasette kayıt modd
//değilse
  begin
    if SorguGuncelle = True then//refresh yap
// Bu benim değişkenim.Datasetim kayıt modunda değilse yani insert 
//veya update yapılmıyorsa true oluyor.Yani adam tam kayıt 
//modundayken otomatik dataset refresh istem dışı kayıda yol açmasın 
//diye.
    begin
      TabloRefresh(Sorgu,'MUSTERI');
//Buda benim refresh procedurum sen buraya dataset close open diye de 
//yapabilirsin.Zaten buda aynı işi yapıyo.
          
    end;
  end;

end;
[/img]

Ben Bu şekilde yapıyorum.Ve hiç bir şekilde kullanıcının bişey yapmasına gerek kalmıyo.Eğer ağdaki bir x kullanıcısı tabloda değişiklik yaparsa trigger tetikleniyor ve bu kodlarçalışıyor ve tablo refresh oluyor.Kişi anında yeni veya update edilmiş kayıtları görüyor.
Umarım yardımcı olabilmişimdir.
Kolay gelsin.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

vt i ibexpert ile açıyorum.trigger kısmında after insert de yeni bir trigger oluşturuyorum.UYE_AI0 diye bir trigger oluşturuyorum.ismini UYAR yapıyorum.(table nin ismi UYE)
aşağıya kod olarak

CREATE TRIGGER UYAR FOR TBL_UYE
ACTIVE AFTER INSERT POSITION 0
AS
begin
post_event 'HAREKET_VAR';
end

yazıyorum.compile ediyorum.
precompiler has found some errors diyerek şu hatayı veriyor.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 0.
CREATE.

CREATE TRIGGER UYAR FOR TBL_UYE
ACTIVE AFTER INSERT POSITION 0 kısmı yukarıda sanki kendisi var gibi
aşağıya kod olarak ta yazmam lazım mı?
yazmazsam hata vermiyor.
yazarsam hata veriyor.
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Bakın hocam ibexpertte triggeri yazarken bazen böyle şeyler benim başıma geliyor.Kodun tamamını siz yazmayın.Sağ Tıklayıp NewTrigger dedikten sonra açılan pencereden yukarıdan insert delete ve update seçin after before seçme yerindende afteri seçin ve zaten ib expert kalıbı kendisi oluşturu ve size kodu yazacağınız yeri gösterir.Oraya sadece

Kod: Tümünü seç

post_event 'HAREKET_VAR'; 
yazın ve compile edin.Olacaktır.Kolay gelsin.
menderes

Mesaj gönderen menderes »

CREATE TRIGGER UYAR FOR TBL_UYE
ACTIVE AFTER INSERT POSITION 0
AS
begin
post_event 'HAREKET_VAR';
end
Burada çıkan hata mesajı UYE adındaki tablo yerine olmayan bir tablo için trigger oluşturmaya çalışılmasından kaynaklanıyor. TBL_UYE değil sadece UYE olacak.
Yani

Kod: Tümünü seç

CREATE TRIGGER UYAR FOR UYE
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
post_event 'HAREKET_VAR';
end
gibi....
Sizin IBExpertte yazacağınız sadece Name ismine triggerin adı, for table bölümünde kutucuktan tablenin seçilmesi.Gerisi
NewMember hocamın dediği gibi

Kod: Tümünü seç

post_event 'HAREKET_VAR';
yazmak. Daha sonra compile etmek. Kolay gelsin....
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

menderes demişki:
Burada çıkan hata mesajı UYE adındaki tablo yerine olmayan bir tablo için trigger oluşturmaya çalışılmasından kaynaklanıyor. TBL_UYE değil sadece UYE olacak.
Haklısınız orayı atlamışım.Önceden bende yaptığımdan direk oraya kanalize oldum.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

Çok sağolun.Dün akşam burdaki bir abinin yardımıyla problemi çözdüm.
Allah razı olsun.
Trigger ları ekledim.
ve ibevents e de HAREKET_VAR olayını girdim ve şunları yazdım.

procedure TForm1.IBEvents1EventAlert(Sender: TObject; EventName: String;
EventCount: Integer; var CancelAlerts: Boolean);
begin
if EventName='HAREKET_VAR' then //Gelen olayın istediğimiz olay olup olmadığını kontrol ediyoruz.
begin
IBDataset1.Close; //Tablo Görüntüsünü Yenile
ibtransaction1.active:=False;
ibtransaction1.active:=True;
IBDataset1.Open;
end;
end;

biz sizinde dediğiniz dataset i açıp kapatıyoruz.
şu anda vt üzerinde herhangi bir değişiklik olduğunda anında ekrana yansıyor.
İlginiz ve alakanız için çok teşekkürler.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

bir kaç kişiden fazla uygulamayı açtığında refresh işlemi ciddi yavaşlamaya neden oluyor.Hepsinde refresh işlemi yapıldığı için.
Bu durum için şunu nasıl yapabiliriz.
3 kişi aynı anda sadece bilgi girişi yapabilsin.Diğerleri o anda beklesin.
boşalan oldukça bilgi girişi yapabilsinler.
Cevapla