QA@IT

Access リンクしたサブフォームのトランザクション制御がうまくいかない

4651 PV

Windows7 SP1 / Access 2010
を使用して、備品管理のツールを作成しています。

テーブルは
備品カテゴリマスタ:カテゴリコード、カテゴリ名(文具、被服など)
備品マスタ:カテゴリコード、備品コード、備品名(ペン、ユニフォーム上着など)
備品在庫:備品コード、数量
という構成です。

  • フォーム上に備品カテゴリマスタを表示するListBoxを配置
  • サブフォーム上に備品と紐づく品目の在庫一覧を表示
  • 備品カテゴリをListBoxで選択するとサブフォーム上にそのカテゴリの備品数量一覧がデータシートビューで表示されるようにしました。

(サブフォームのリンク親フィールド/子フィールドはそれぞれカテゴリコードです)

表示はうまくいったのですが、ここに「棚卸」ボタンをつけて、

  • 「棚卸」をクリックするとトランザクションを開始する
  • フォーム上の「OK」をクリックしたらCommit
  • フォーム上の「キャンセル」をクリックしたらRollback

という動作をさせようとしてつまづいています。
サブフォームのデータシートビューで数値を変更すると、変更行からフォーカスが移動したタイミングでCommitされてしまうようで、Rollbackしても戻らないのです。

試しにサブフォームのLinkMasterFieldsとLinkChildFields を空にしてリンクしない状態を試してみたところ、「キャンセル」でRollbackされました。
ということはトランザクションの制御はできていると思っているのですが、リンクするようにするとトランザクション制御ができなくなるというのは、何がよくないのでしょう?
プロパティの設定など、何か見直すべき点があれば、教えていただけないでしょうか?

コードは以下のようになっています。

Private wsp As Workspace
' フォームOpen -----------------------
Private Sub Form_Open(Cancel As Integer)
    ' WorkSpace情報の確保
    Set wsp = DBEngine.Workspaces(0)
End Sub

' 「棚卸」ボタン -----------------------
Private Sub cmdInventory_Click()
    ' トランザクションを開始
    wsp.BeginTrans
End Sub

' 「登録」ボタン -----------------------
Private Sub cmdOK_Click()
    wsp.CommitTrans
End Sub

' 「キャンセル」ボタン -----------------------
Private Sub cmdCancel_Click()
    wsp.Rollback
End Sub

回答

AccessのFormは基本的に入力したら出来るだけすぐ登録
という動きなのでトランザクション制御は難しいところがあります。
ワークテーブルを作って編集中はワークテーブルへの書き込みを
行い登録ボタンで実テーブルへの登録を行うようにした方が
よいかと思います。

編集 履歴 (0)
  • そうなんですね…
    素直にワークテーブルで制御することにします。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。