Microsoft Access De Transactions Nasıl Kullanılır

1 2
06/05/2020, 14:45

accessman

https://codekabinett.com/rdumps.php?Lang...ransaction
adresinde anlatılıyor ama ben çok anlayamadım
Public Sub TransactionDemo()
On Error GoTo tran_Err

    DAO.DBEngine.BeginTrans   
    CurrentDb.Execute "INSERT INTO tblLog (Text1) VALUES ('New banana delivery')", dbFailOnError
    CurrentDb.Execute "UPDATE tblInfo SET InfoText = 'Banana count: 2983' WHERE ID = 6 ", dbFailOnError
    CurrentDb.Execute "DELETE FROM tblTemp", dbFailOnError
    DAO.DBEngine.CommitTrans
   
Exit Sub
   
tran_Err:
    DAO.DBEngine.Rollback
    MsgBox "Transaction failed. Error: " & Err.Description

End Sub
06/05/2020, 17:18

ozanakkaya

Bu kod ile ne yapmak istediğinizi açıklar mısınız??
06/05/2020, 18:16

accessman

Tabloyu silip yeni veri ekleyeceğim
Ama ekleme kısmında sıkıntı olursa silmeyi geri almalı
Belki Ekledikten sonrada silebilirim ama amacım bunu kullanmak
16/05/2020, 12:02

accessman

1. mesajda eklenen kod ile 
CurrentDb.Execute "INSERT INTO tblLog (Text1) VALUES ('New banana delivery')", dbFailOnError
CurrentDb.Execute "UPDATE tblInfo SET InfoText = 'Banana count: 2983' WHERE ID = 6 ", dbFailOnError
CurrentDb.Execute "DELETE FROM tblTemp", dbFailOnError
ilk satır yeni veri ekliyor , ikincisi veri güncelliyor üçüncüsü tabloyu boşaltıyor
DAO.DBEngine.BeginTrans
satırı ile bu 3 sorgu işleminden önce veritabanını kilitliyoruz.
sonra sorguları sırası ile çalıştırıyoruz
eğer tüm sorgular sıkınıtısz bir şekilde görevini başarı ile tamamlarsa 
DAO.DBEngine.CommitTrans
satırı ile veritabanını güncelliyoruz. vertabanı kilidi kalkıyor
eğer bu üç sorgu işleminden herhangi birisinde işlem hatası olursa 
tran_Err:
    DAO.DBEngine.Rollback
ile tüm işlemleri geri alıyoruz. yani son satırdaki silme sorgusunda hata çıktığında
ilk satırdaki ekleme işlemide iptal oluyor. Yani Undo gibi birşey
birinci ve ikinci sorgularda olan işlemler hiç olmamış gibi veri tabanı ilk haliyle kalıyor
Bu konuda iki önemli  husus var bunlardan birincisi 
*hatayı yakalamak yani bu üç sorgudan en az birinde hata olduğunu anlamak için
CurrentDb.Execute ..............................., dbFailOnError
 "dbFailOnError" kelimesini mutlaka eklememiz lazım
ikinci önemli husus ise 
*BeginTrans ve CommitTrans satırları arasında veritabanı sadece bize çalışıyor olacak
bir kaç kullanıcı veritabanına bağlanıyorsa onlar salt okunur açabilecekler.
bir de resimdeki şu ayar yapılmalı


16/05/2020, 12:18

accessman

alt for ile nasıl kullanılacak derseniz

Private Sub btnBeginEdit_Click()
    DBEngine.BeginTrans
End Sub

Private Sub btnSaveChanges_Click()
    DBEngine.CommitTrans
End Sub

Private Sub btnUndoChanges_Click()
    DBEngine.Rollback
End Sub

Private Sub Form_Current()
    ' loading the child records for the current master record
    Set Me.subActorRatings.Form.Recordset = _
        CurrentDb.OpenRecordset("SELECT * FROM tblActorRatings WHERE ActorId=" & Me!ActorId)

    ' Setting the correct default value for new records
    Me.subActorRatings.Form.Controls("txtActorIdHidden").DefaultValue = Me!ActorId
End Sub

Private Sub Form_Load()
    Set Me.Recordset = CurrentDb.OpenRecordset("SELECT * FROM tblActors")
End Sub


16/05/2020, 12:50

accessman

bir diğer husus şu  ki ilişkili formlarda bu işlem galiba çalışmıyor
begin dediniz
yeni kayıt eklediniz
commit veya rollback demeniz bir şey değiştirmiyor. kayıt işlemi bitmiş oluyor

bir başka husus ise tablonuzda id alanı otomatik olarak artıyor ise
rollback deseniz bile otomatik sayı kullanılmış oluyor
mesela en son id 8 idi siz
DAO.DBEngine.BeginTrans
CurrentDb.Execute "INSERT INTO tblLog (Text1) VALUES ('" & "New banana delivery" & "')", dbFailOnError
DBEngine.rollback
 dediniz. böylece geri alsanız bile id = 9 kullanılmış oldu.
bir sonraki 10 dan devam edecek

ayrıntılı açıklama için
https://codekabinett.com/rdumps.php?Lang...ransaction
1 2