Örnek Program client/server firebird

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Size bir şey sorayım. Şöyle düşünün uygulamada veri giriyorsunuz. sonra tasarım moduna dönüyorsunuz. Tasarım modunda mı veriyi kaydetmemiş görüyorsunuz. yoksa bir daha uygulamayı çalıştırdığınızda mı verileri görmüyorsunuz. Tasarım anındaysa normal dir. Datasetin active özelliğini bir false sonra true yaparsanız. Size son kaydettiklerinizi gösterir.

Programı bir daha çalıştırınca çıkmıyorsa datasetin after post eventine

Kod: Tümünü seç

transaction1.commitretaining;
yapın. Bu kalıcı olarak vt ye kayıt. yapar.

Ben örnek yapıyorum. Hiç bir ek komuta gerek kalmadan ekleyebiliyorum.

Kolay gelsin.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

tabii ki uygulamayı çalıştırıp ta kaydetttiğim veriler uygulamayı tekrar çalıştırdığımda görünmüyor. :D
ibexpert ile fdb dosyasına bakarak buradan da kontrol ediyorum ; yine kayıt edilen veriler yok. sanki read-write yetkisi ile ilgili bir şeyler var.

procedure TForm1.IBDataSet1AfterPost(DataSet: TDataSet);
begin
transaction1.commitretaining;
end;

procedure ini ekledim forma.ama

[Error] Unit1.pas(37): Undeclared identifier: 'transaction1'
[Error] Unit1.pas(37): Missing operator or semicolon
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

hatasını veriyor. :?
menderes

Mesaj gönderen menderes »

öncelikle kolay gelsin,
Anlatacaklarımı forumda iyi bir arama yaparsanız bulabilirsiniz.

Acizane olarak şu bilgilerin bilinmesinde fayda var. Çünkü hataların çoğu bu terimlerin bilinmemesinden ve doğru yerde kullanılmamasından kaynaklanıyor.
Bilgi listelenecek; (işlemden önce veya sonra) database açıkmı, table vs. açıkmı, duruma göre transaction commit edilmiş haliyle açıkmı.
Şimdi tutturulmuş CommitRetaining bu terim her yerde geçerli değil. Mesela dataset kullanıyorsunuz. Afterpost olayına yazdınız bu komutu

Kod: Tümünü seç

transaction1.commitretaining;
dataseti istediğiniz kadar açın kapatın refresh yapın yeni durumu göremeyeceksiniz. Ancak database ile ilgili bağlantıları kapatıp açmadığınız sürece.
Bilinmesi gereken terimler :
Commit: Transactiondaki bilgileri vt ye yazar tarnsactiondaki bilgiler boşaltılır, vt ile transaction arasındaki bağlantı kesilir.

Rollback : traansactiondaki bilgiler vt ye yazılmaktan vazgeçilir. transaction boşaltılır, vt ile transaction arasındaki bağlantı kesilir.

CommitRetaining : transactiondaki bilgiler vt ye yazılır transaction boşaltılır, vt ile transaction arasındaki bağlantı devam eder.

RollbackRetaining : traansactiondaki bilgiler vt ye yazılmaktan vazgeçilir. transaction boşaltılır, vt ile transaction arasındaki bağlantı devam eder.

rsimsek hocamın bir yerde verdiği cevap;

CommitRetaining yaptığında Transaction da yaptığın işlemleri veritabanı üzerinde kalıcı hale getirirsin. Fakat diğer kullanıcının bu tablodaki bilgileri görebilmesi için DataSet i Rehresh yapmak yetmiyor
Kapatıp açmak hatta IBDatabase i de kapatıp açmak gerekiyor
Burada IBDatabase yerine;

Kod: Tümünü seç

IBDataSet1.Active then 
IBDataSet1.Close; 

IBTransaction1.Active := False; 
IBTransaction1.Active := True; 

IBDataSet1.Open;  
şeklinde Transaction u kapatıp açmak daha uygun olur.
Yani transactionun görevi güvenli bir şekilde bilgiyi veritabanına uygulamak.
Bir de;
ApplyUpdates ve CancelUpdates olayı ile ilgili kısa bir bilgi verelim.

Cached Updates değişikliklerin direk veri tabanı üzerinde değil de bellek üzerinde yapılmasını ve istendiği anda bu değişikliklerin veri tabanına uygulanmasını sağlar.
Cached updates genellikle uzak veritabanlarına erişim işlemlerinde kullanılırlar. Bunun temel sebepleri arasında ağ trafiğini rahatlatmak ve işlem zamanlarını minumuma indirmektir. Bunun kullanımında yararları ve zararları ile ilgili forumda çok bilgi bulabilirsiniz.
Özet olarak;
ApplyUpdates ve CancelUpdates transactionla değilde direkt olarak table, query veya dataset teki bilgileri hafızaya alarak çalışır. yani post komutundan sonra bilgiler chackedupdates true ise transactionda değilde hafızaya yüklenir. tabi bu durum uzun bilgi girişlerinde hafızayı doldurabilir veya performansını düşürebilmektedir. post ile hafızaya alınan bilgiler applyupdates komutu ile vt ye yazılır ve hafıza boşaltılır. cancelupdates ile de hafızadaki bilgiler vt ye yazılmaz hafıza boşaltılır.
sonuç olarak;
Genelde tercih edilen transaction olayıdır. Transaction olayında ise işlemden sonraki halinin ne olacağı kavranılmışsa hiç bir sorun yaşamazsınız.
Tekrar kolay gelsin...Umarım faydalı olabilmişimdir.
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

elektroumut yazdı: procedure TForm1.IBDataSet1AfterPost(DataSet: TDataSet);
begin
transaction1.commitretaining;
end;

procedure ini ekledim forma.ama

[Error] Unit1.pas(37): Undeclared identifier: 'transaction1'
[Error] Unit1.pas(37): Missing operator or semicolon
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

hatasını veriyor. :?
Kusura bakma yanlış bilgi vermişim. o ibtransaction1 olacaktı. Ve oraya yazdığınız sizin datasete bağlı olan hangi transaction ise onun ismini yazacaksınız. Yani ibtransaction1. yerine başka bir isim de olabilir. Sizdeki hangisi ise onu yazın.


Kolay gelsin.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

Arkadaşlar bende cidden bir problem var heralde. :oops: Olmuyor olmuyor.
En iyisi dosyayı göndereyim siz de bakın.Problem nerde?

http://rapidshare.de/files/8173537/test.rar.html

dosyanın içine aynen açın ve çalıştırın. (fdb dosyası da içinde.)
Ancak magazaadi ve birimi fields lerinin tipini integer girdiğimden kayıt eklerken sayılar girmeyi deneyin. (Hoş daha kayıt kaydetmeyi başarmış değilim. :( )
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

C nin içine açın demek istedim yani.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

yeni bir veri tabanları oluşturdum.(fdb ve gdb)
herşeyi eskisi aynen yaptım.bu sefer ekleme,çıkarma işlemlerini...yapıyor.
ama bu sefer de şöyle bir problem var.veriler ekrana yansıyor problem yok.
yeni bir veri girişi yapmaya kalktığımda aynı veriden 2-3 satır daha ekliyor gibi görünüyor ekranda yani kopyalanıyor.
veri tabanına baktığımda böyle bir şey yok.veriyi bir adet eklemiş.
tekrar çalıştırıyorum.her şey normal görünüyor..yeni bir şey daha eklemeye kalktığımda ekranda satırlar kendi kendine değişiyor , çoğalıyor.
veri tabanına baktığımda böyle bir şey yok, herşey normal.
ama uygulama çalışırken böyle kendi kendine ekleme yapması hiç hoş olmuyor , insan sapıtıyor.
makaleleri okudum herşeyi aynen yapıyorum.herkes firebird le neler yapıyor.ben daha kendi bilgisayarımda adam gibi çalıştıramadım. :oops:
bunu başarsam ağdan kullanma olayına falan girişecem.
ne problem adamım ya.
böyle bir şeyle daha önce karşılaşan var mı? nedir bunun sebebi acaba?
menderes

Mesaj gönderen menderes »

Kolay gelsin. Senin olay yukarıda bahsettiğim meselelerle ilgili diye tahmin ediyorum hala. Eğer yaptığın işlemi buraya dökersen yardımcı olabiliriz sana. Mesela ne kod yazdın ki çift kayıt yapıyor. Ama ilgili dataset le çalışan kodları da yaz. Bİr check edelim. Çözülmeyecek birşey değil sadece bir yerlerde göze görünmeyen var. Beraberce bulalım. Ama dediğim gibi ne yaptığını bilmemiz lazım.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@menderes;

Commit işleminden sonra dataset nesnesinin kapatılıp tekrar açılması son değişikliklerin görüntülenmesini sağlamak için yeterlidir, database nesnesinin disconnect-connect edilmesine lüzum yoktur, bilginize...

Kolay gelsin..
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
Örneğinize baktım. Sanırım sorununuz Ibdataset in cachedupdates propertisinden kaynaklanıyor.

Ben de örnek programınızda verileri kaydedemiyordum. Cachedupdates propertisini false yapınca kaydetmeye başladı.
Siz de öyle yapıp bir deneyin.

Ayrıca Dataset editorde şifreyi yerine yazın ve login prompt un onay kutusunu kaldırın ki size iki de bir şifre sormasın.

Kolay gelsin.
elektroumut
Üye
Mesajlar: 32
Kayıt: 22 Kas 2005 02:48

Mesaj gönderen elektroumut »

tamam.cachedupdates özelliğini false yapınca problem düzeldi.
Yardımlarınız için çok teşekkürler.
Saygılarımı sunuyorum.
dervis
Üye
Mesajlar: 22
Kayıt: 12 Eki 2005 01:39

Mesaj gönderen dervis »

:!: Arkadaşlar halen farkındaysanız bu prg yi karşılıklı olarak internet üzerinden mesajlaşmasına dair somut bi şey bulamadık. Event olayı internet üzerinde karşılıklı olmuyo heralde :cry:

Artık bu hatanın bizden kaynaklandığını düşünmüyorum yapılabilecek herşeyi yaptık gibi... fatih kardeşin en son yaptığı örneğinde buraya linkini veriyorum bi de onu inceleyelim...belki son anda bi gol atabiliriz post event a bellimi olur umut dünyası :wink:

:arrow: http://www.oemtek.com/deneme01.rar

:idea: bana ulaşmak isteyen olursa ip ile internet üzerinden deneme yapabiliriz......
İlim bir nokta idi, onu cahiller çoğalttı......(fen,matematik,kimya,vb...)

Cahilin bilmediğini inkar etmesi adettendir....
Cevapla