Transaction ve Delphi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fearless
Üye
Mesajlar: 15
Kayıt: 26 Kas 2005 10:15

Transaction ve Delphi

Mesaj gönderen fearless »

Selam Arkadaşlar
öncelikle şunu belirtmek istiyorum formda transaction hakkında 10 sayfa arama sonucunu okuduktan sonra bu soruyu soruyorum :)
çok yararlı bilgiler olmakla birlikte son derece acemi olduğum için aradıgımı bulamadım bu sayfalarda
delphi 6, adoconneciton ile MSSQL Server a bağlanıyorum.

çok basit bir tabe adotable ım var bir tanede adocconection

şimdi sorularıma gelınce

1-) kayıt eklemek istediğimde transactionu nasıl kullanacağım adotable ye uyguluyamıyorum sanırsam, sadece adoconnectionun begintrans özeligi var.

2-) try exception bloğu kullansam transactiona gerek var mı? yoksa bunlar tamamen farklı olaylar mı?

cevap verirseniz çok sevinirim
Teşekkür ederim.
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

Kod: Tümünü seç

begin
ADOConnection1.BeginTrans;
//kayıt işlemleri...
if ADOConnection1.InTransaction then
  ADOConnection1.CommitTrans;
end;
eğer tek bir satır kayıt yapacaksanız transaction başlatmanıza gerek yok.Birden fazla birbirine bağlı kayıtlar yaptığınızda önce transaction başlatmanız sonra kayıt işlemlerini yaptıktan sonra commit etmeniz gerekiyor.böylece post ettiğniz tüm satırlar veritabanına yazılacak eğer bir hata olursa hiç biri yazılmayacaktır.transaction ın amacıda budur zaten.
kolay gelsin.
menderes

Mesaj gönderen menderes »

Kolay gelsin,
Geri alınabilir işlem yapmak için Transaction işlemi başlatılır.
Değişiklikleri veritabanına uygulamak için commit,
iptal etmek için Rollback.
diyelimki

Kod: Tümünü seç

ADOConnection1.BeginTrans; //işlemiyle transaction işlemini başlattınız. 
//mesela kayıt veya silme işlemi yaptınız.

try
//uygulanacak kodlar
ADOConnection1.CommitTrans;//değişiklikleri uygula

except // eğer uygulama esnasında hata oluşursa programı kırmak için 
// çalışacak kod buraya yazılır. 

{Sorduğunuz soruyla alakalı olarak buraya mesela
 Hata oluşursa değişiklikleri geri al manasında}

ADOConnection1.RollbackTrans;

//Eğer silme yaptıysanız kayıta geri dönmek için

ADOTable1.ReQuery;
// hatta hata durumu haber vermek için
ShowMessage('Veriler Güncellenemedi! İşlem iptal edildi'); 
end;
kolay gelsin.
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

Tabi bu tip olaylarla ilgili vertitabanı tarafında fk ler vb. işlemlerle yaptıgın bırcok ıslemde trigger kullandıgın zaman tabi her yerde degil işlemleri trigger vasıtasıyla rollback vb. yapabilirsin.....kolay gelsin
Kullanıcı avatarı
ozsal
Üye
Mesajlar: 108
Kayıt: 22 Oca 2006 07:55
Konum: izmir
İletişim:

benim sormak istediğim soru da aynı

Mesaj gönderen ozsal »

bu yüzden yine başlık açmak istemedim.
Peki arkadaslar;
bu transactionu nerede kullanmamız gerekiyor?

adoconnecttion1.begintrans ile transaction başlııyor muş
bu nerede olmalı ?
yani formcreate olayına mı yazmalıyız?

ben bir cafe programı yazmaya çalışıyorum;
malum uzun süre acık duran adisyonlar;
masalar
stoklar vs olacak

burda formcreate de mi olması gerekiyor transactionun
striinggridde masanoları var. bunlara tıkladıgım zaman yeni adisyon acılıyor. adisyonu kapattıgım zaman bunu post etmem gerekiyor. bir de adisyonun iptali var. transaction commit ve rollbacki nereye yazmam gerekiyor.

teşekkürler
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Muameleler

Mesaj gönderen sabanakman »

Muamele; kayıt, veri tabanına yazılma noktasına gelince ama hiç bir değer yazılmadan önce başlatılmalı ve yazma işlemi biter bitmez bitirilmelidir. Tabi yazma anında hata oluşursa geri sarılmalıdır. Hatta bir çok yerde karşına çıkmış olmalı, aşağıdaki yapıyı kullanırsan sağlıklı bir yapın olacaktır.

Kod: Tümünü seç

try
  ADOConnection1.BeginTrans;
  //kayıt
  //işlemleri
  //vs. vs.
  ADOConnection1.CommitTrans;
except
  ADOConnection1.RollbackTrans;
end;
görüldüğü üzere form açıkken AdoConnection nesnesi InTransaction durumunda değildir. Sadece yazma anında bu muameleler kullanılır. Burada try-except bloğunu kullanmanın amacı ise hata kontrolünü sağlamaktır. Bir hata durumunda (exception) BeginTrans tan sonraki tüm işlemleri geri almayı (RollBackTrans) sağlar, eğer hata çıkmazsa zaten CommitTrans, yapılan işlemleri direk kayıt edecektir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
ozsal
Üye
Mesajlar: 108
Kayıt: 22 Oca 2006 07:55
Konum: izmir
İletişim:

Mesaj gönderen ozsal »

ilk olarak ilgilendiğiniz için teşekkür ederim Şaban Bey.
Mazur görürseniz bir iki şey sormak istiyorum bu konu ile ilgili.

ben bi cafe programı yapmaya çalışıyorum.
masalar,adisyonlar,adisyonhareket isimli tablelarım var.

programın ana menusunde strınggrid ile masalar db baglanıp masaların listesini alıyorum. Daha sonra bu gridde panellere tıklayınca masanın acıkkapalı durumuna gore ya yenı adisyon acıyorum yada masaya ait adisyonu öne getiriyorum. ( İyorum derken mek istiyorum) .
mesela masa3 tıkladıgım zaman masa3 ün acık kapalı olup olmadıgına bakmak ( masalar\ dbinde masano,acıkkapalı,adisyonno fieldleri var);
eger kapalı ise yeni adisyon acmak ( adisyonlar insert)
daha sonra bu adisyona ürün girmek(adisyonhareket insert)

tabi formun üstünde de tahsil et ve iptal et buttonları var. eğer tahsil et dersem (ki sadece tahsil etme ihtimali olsaydı hiç bir problem olmayacaktı.)
adisyon hareketteki ürünler stoklardan düşecek.
normalde postla düşürüyorum ama

oldu ki tahsil etmedi yada adisyonda yanlışlık oldu yada elektrıikler kesildi vs. bu gibi durumlarda adisyonharekete gecen ürünlerin stoklara geçmemesi ve kaydın gerçekleşmemesi lazım .

bu konuda ne önerirsiniz?
nasıl bir yol izlemem gerekiyor?
şu ara strınggrid ile başım bela da olsada dogru tablo ile hareket yapabiliyorum.
masa ac dediğim zaman
masalar tableında acıkkapalıyı 1 konumuna getiriyorum
adisyon tableına insert-post ilse kayıt ekliyorum
adisyonnoyu masalar\adisyonnoya kayıtediyorum.
adisyonhareket ile ürün ekliyorum vs.

takıldıgım nokta ise dediğim gibi
mesela elektrik gittiğini düşündüğümüz zaman ne olacak yada kullanıcı adisyonu iptal ettiği zaman?

o zaman teker teker

Kod: Tümünü seç

adisyonhareket \ select adisyonno,urunkodu,urunadedi where adisyonno=: iptal adisyonno
stokhareket select  urunkodu,miktar where urunkodu=:adisyonhareket.urunkodu    
stokhareket urunkodu.valu=stokhareketmiktar.value +adısyonhareketurunadedi
.....

diyerek bir döngü içine mi almam lazım
yoksa bu işin bi püf noktası var mı ;


Yazarken kaptırmışım. Bayağı uzun olmuş.
ilgilneip okuyan herkese teşekkür ederim
Cevapla