MS ACCESS(へたれな)コネタ フォームにバインドしたデータのトランザクション処理
MS-ACCESSにおいて、明細形式の複数行表示されている画面で表示データ全体に対するトランザクション処理を行ないました。以前、MS-ACCESSを利用していたとき、そのような場合には編集用のワークテーブルを用意してコミットする場合に編集内容を転記する仕組で実現していました。しかし、ちょっとしたアプリを作成するのにいちいちワークテーブルを作成するのは面倒です。そこで、トランザクション処理は使えないものかと調べてみました。もちろん、VBAでデータ処理する場合にはトランザクション処理は今までにも行ったことがあります。フォームにデータをバインドしてる状態での実績はありませんでした。
単純に、MS-ACCESSの「Workspaces(0)」でトランザクションOKかと思って次のコードで全然ダメでした。
Private Sub cmdキャンセル_Click() Workspaces(0).Rollback DoCmd.Close acForm, Me.Name End Sub Private Sub cmd登録_Click() Workspaces(0).CommitTrans DoCmd.Close acForm, Me.Name End Sub Private Sub Form_Open(Cancel As Integer) Workspaces(0).BeginTrans End Sub
MS-ACCESSのフォームにバインドされたDBとコードで扱うDBは別セッションで管理されているようです。たしかに、SQLServerやORACLEのDBをリンクして利用しているときでも、コード上からDBにアクセスしているセッションとMS-ACCESS内でフォームがデータを取り扱っているセッションが異なることはわかっていたのですが、純粋にDAOだけを扱っている場合には同じセッションなのかなと勘違いしていました。やはり、コネクションを同一にするために、フォームのバインドソースをコード上で指定してあげる必要があったのですね。デザイン時データソースにテーブル指定した状態では同一のコネクションが使用されないようです。
Private Sub Form_Open(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("SELECT * FROM Customers", dbOpenDynaset) Set Me.Recordset = rs End Sub