システムアート研究所:トランザクションと定義域集合関数

トランザクション中に定義域集合関数を使う場合には注意が必要です。トランザクションを開始してから加えた変更は DLookup などの定義域集合関数には反映されません。それに対し、Recordsetオブジェクトを使った場合はコミットする前でも変更が反映されます。

以下のサンプルはトランザクション中で、レコードのないテーブルに一件のレコードを追加し、これをDLookupとRecordsetの2つの方法で表示させようというものです。フィールド:f1を持つテーブル:T1を予め作成してこのプロシージャを実行してください。

Sub Temp()
  BeginTrans
  CurrentDb.Execute "INSERT INTO T1 (F1) VALUES(100)", dbFailOnError
  MsgBox "F1(DLookup):" & DLookup("F1", "T1")
  With CurrentDb.OpenRecordset("T1", dbOpenDynaset)
    .MoveFirst
    MsgBox "F1(Recordset):" & !f1
    .Close
  End With
  CommitTrans
End Sub