FireBird de commit sorunu

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
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

FireBird de commit sorunu

Mesaj gönderen rsimsek »

Forumda daha önce karşılaşılmış commit sorunlarına ilaveten, bir kaç gündür benim de bir commit sorunum oldu.

IBTable / IBQuery / IBDataSET hepsi ile ayrı ayrı denememe ve normal prosedüre göre yazmış olmama rağmen sorunu çözemedim.

Olayın hikayesi şu :wink: Bu bir stok-hareket olayı fakat master detail değil. Çünkü detail tablodan (Stok_Hareket_Detay), bilgileri mem_tabloya atıp onun üzerinden işlem yapıyorum. Sonra da kaydet butonu/tuşu/düğmesi ile de mem_tablodaki bilgiyi asıl tabloya satır satır ekleyip post ediyorum. Buraya kadar herhangi bir problem yok.

DataModule de IBDatabase ve IBTransaction uygun şekilde ekli ve birbirine bağlı. Detay tablodaki bilgileri kayıt sonunda Master tablo (ama master-detail bağlantı yok) nun afterpostunda;

Kod: Tümünü seç

IBTransaction1.CommitRetaining;
diyorum. Herhangi bir problem yok. Fakat veritabanına başka araçlarla baktığımda yazmadığını görüyorum:(

Stok_Hareket tablosu bir de Stok_Hareket_Detay tablosu var. Tarih, hareket_tipi vs. alanlar ilk tabloda hareket satırları da ikinci tabloda tutuluyor. Fis_No alanı ortak.
İkinci bir defa bu fişi düzeltmeye/kayıtı değiştirmeye çalıştığımda bilgileri grid e okuyor. kaydet deyince öncelikle eski bilgileri siliyor. Fakat veritabanından sildiği halde program bunu farkedemiyor ve sanırım cache den aynı bilgileri tekrarlayıp getiriyor.
Olayı çözmek için http://www.tamaracka.com da aşağıdaki cevabı buldum;

Hi Gregor,

> What is the real differece between Commit and CommitRetaining?
> Because, in some discusions there tells that i better to use Commit insted
> of CommitRetaining... why??

CommitRetaining keeps the cursors (related to that transaction) open and
doesn't end the transaction. If you use CommitRetaining, you need to
Commit too.

Commit closes the cursors and ends the transaction.

>Because i would like to keep my database open,
> but Commit close the database!!

No it doesn't. It closes the open cursors _linked_ to that transaction.


--

With regards,

Martijn Tonies
Database Workbench - the developer tool for InterBase & Firebird
Upscene Productions
http://www.upscene.com
Burada anladığım kadarıyla commit de demek gerekiyormuş :?:
Hatalı tercume olabilir ??

Ben de aynı AfterPost u;

Kod: Tümünü seç

procedure TDM.tblStok_HareketAfterPost(DataSet: TDataSet);
begin  // post ve delete de..
  IBTransaction1.CommitRetaining;
  IBTransaction1.Commit;
end;
bu şekilde yazdım. Bu sefer de alakasız bir şekilde o an açık olan tabloların kapalı olduğu "kapalı tabloda işlem yapmaya çalışıyorsun" mesajını vermeye başladın. Halbuki o bahsı geçen tablolardan sadece lookup yapıyorum, bilgi alıyorun edit falan yok.

Neticede hikaye biraz uzun oldu ya, klasik sözdür; anlıyan beri gelsin :wink:

Gerçi uzun hikaye konusunda rekoru kıracağımı da pek sanmıyorum :)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Abi Commit kullanımın yanlış. Commit dedikten sonra tablolar kapanacaktır ve tekrar açman gerekir. Bu sebepten dolayı Commit'i Programımızı sonlandırdığımız zaman kullanmalıyız.

Problemin anladığım kadarıyla Cache kullanımıyla ilgili burda bence sistematik hata yerine algoritma hatası yapıyorsun gibime geliyor.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Haklı olabilirsin, bilsem problem olmazdı zaten :(
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Mesaj gönderen bgoktas »

bende

Kod: Tümünü seç

IBTransaction1.CommitRetaining;
şeklinde çalışıyor. Tablelerden gelen verileri direk yazıyor fakat query ile insert into da yazmıyor. onun için update sql yapıyorum query'nin after postunda commit ediyorum...

Kolay gelsin
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Bahsettiğim gibi IBTable / IBQuery - IBUpdateSQL i de denedim sonuç aynı. Bir yerde bir yöntem hatası yapıyorum ya.. Ya da programı DBIsam dan çevirdiğim için biryerlerde böcükler mi kaldı bilemiyorum. İnsan bir konuya çok fazla yoğunlaşınca bazı şeyler gözden kaçıyor :?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

İlgilenen tüm arkadaşlara teşekkür ederim.

Söylediğim gibi böcük bulunmuştur. Master tablodaki post olayını detailleri post etmeden önce yapıyormuşum. Dolaysıyla detail leri post edince IBTransaction1.CommitRetaining; yapılmıyor fişe/kayıta tekrar girince yapılıyor ve kayıtlar tekrarlı geliyordu.

Daha önceki tespitler doğrultusunda

Kod: Tümünü seç

IBTransaction1.CommitRetaining;
ile program beklenen şekilde çalışıyor. Fakat IBTransaction1.Commit; olayında tabloların kapanmasını tam anlamış değilim. Zaten yukarıdaki alıntıda da birisi aynı problemden bahsederken cevap veren kişi de "hayır, sadece mevcut transactiondaki cursor kapanır" gibi bir laf etmişti
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla