PR

Access VBA逆引き集|DAOトランザクション処理でデータ整合性を守る実践テクニックとCopilot活用術

VBA

Access VBAで業務システムを開発していると、

  • 複数テーブルを同時更新したい
  • 更新途中でエラーになった
  • データ不整合を防ぎたい
  • 在庫更新と履歴登録を同時に行いたい
  • 絶対に中途半端な更新を許したくない

という場面が発生します。

重要な更新処理ではDAOのトランザクション処理を利用するべきです。

トランザクションを利用すると、

全て成功

更新確定

途中で失敗

全て元に戻す

ことができます。

業務システムでは必須レベルの技術です。


スポンサーリンク

トランザクションとは

例えば受注処理を考えます。

更新対象

T_ORDER

T_STOCK

T_HISTORY


実行内容

受注登録

在庫減算

履歴登録


もし途中でエラーになると

受注登録済

在庫更新失敗

履歴未登録

になります。


問題

データ不整合

が発生します。


トランザクションを利用すると

受注登録

在庫更新

履歴登録

成功

Commit


失敗時

受注登録

在庫更新

エラー

Rollback

全取消

となります。


DAOのトランザクション命令

主に使用するのは3つです。

BeginTrans

開始

DBEngine.BeginTrans

CommitTrans

確定

DBEngine.CommitTrans

Rollback

取消

DBEngine.Rollback

基本構文

On Error GoTo ErrHandler

DBEngine.BeginTrans

'更新処理

DBEngine.CommitTrans

Exit Sub

ErrHandler:

DBEngine.Rollback

これが基本形です。


逆引き① 更新成功時に確定したい

最も基本的なパターンです。

DBEngine.BeginTrans

CurrentDb.Execute "UPDATE T_STOCK " & "SET 数量 = 数量 - 1"

DBEngine.CommitTrans

結果

更新確定

になります。


逆引き② エラー時に取消したい

実務では必須です。

On Error GoTo ErrHandler

DBEngine.BeginTrans

CurrentDb.Execute strSQL1

CurrentDb.Execute strSQL2

DBEngine.CommitTrans

Exit Sub

ErrHandler:

DBEngine.Rollback

効果

途中失敗なら全取消です。


逆引き③ 複数テーブル更新したい

代表例です。

DBEngine.BeginTrans

CurrentDb.Execute strOrderSQL

CurrentDb.Execute strStockSQL

CurrentDb.Execute strHistorySQL

DBEngine.CommitTrans

効果

一括更新

になります。


逆引き④ DAO Recordset更新をまとめたい

Recordsetも対象です。

DBEngine.BeginTrans

rs.Edit

rs!数量 = 100

rs.Update

DBEngine.CommitTrans

逆引き⑤ 更新件数を確認したい

更新チェックです。

CurrentDb.Execute strSQL

件数取得

Debug.Print CurrentDb.RecordsAffected

失敗判定に利用できます。


実務活用例① 受注登録システム

受注処理です。


処理

受注登録

在庫減算

履歴登録


コード

DBEngine.BeginTrans

CurrentDb.Execute strOrderSQL

CurrentDb.Execute strStockSQL

CurrentDb.Execute strHistorySQL

DBEngine.CommitTrans

メリット

整合性保証


実務活用例② CSV取込システム

大量取込です。


処理

CSV取込

エラーチェック

登録


エラー発生

全取消

できます。


コード

DBEngine.BeginTrans

'登録処理

DBEngine.CommitTrans

実務活用例③ 設備管理システム

設備状態変更です。


更新対象

設備マスタ

履歴テーブル


同時更新を保証できます。


実務活用例④ 売上管理システム

売上確定処理です。


更新

売上

売掛

履歴


同時更新が必要です。


実務活用例⑤ ログ管理

バッチ処理です。


処理結果

ログ登録


整合性を維持できます。


実務で最も多いパターン

ベテラン開発者がよく使う形です。

On Error GoTo ErrHandler

DBEngine.BeginTrans

CurrentDb.Execute strSQL1

CurrentDb.Execute strSQL2

CurrentDb.Execute strSQL3

DBEngine.CommitTrans

MsgBox "完了"

Exit Sub

ErrHandler:

DBEngine.Rollback

MsgBox Err.Number & vbCrLf & Err.Description

非常によく見かけます。


トランザクションを使わない危険性

例えば

CurrentDb.Execute strSQL1

CurrentDb.Execute strSQL2

途中で失敗すると

SQL1成功

SQL2失敗

になります。


結果

データ不整合

が発生します。


CommitTransのタイミング

重要です。


悪い例

Execute

Commit

Execute


良い例

全更新終了

Commit


途中では確定しません。


Rollbackの威力

例えば

10回更新

9回成功

10回目失敗


Rollbackすると

全て元に戻る

のが最大の特徴です。

Copilot活用術①

Access VBAです。

DAOトランザクションを利用して

受注登録と在庫更新を

同時実行するコードを

作成してください。


Copilot活用術②

以下のDAOコードへ

Rollback処理を

追加してください。


Copilot活用術③

以下の更新処理に

トランザクションが必要か

レビューしてください。


DAOトランザクション利用時の注意点

Commit忘れ

忘れると更新確定されません。


Rollback忘れ

エラー発生時に危険です。


長時間処理に注意

大量更新ではテーブルロックが長くなります。


BeginTransの範囲を最小化

必要な処理だけ囲みます。


DAOトランザクションが必須な処理

特に重要なのは次の処理です。

  • 受注登録
  • 売上確定
  • 在庫更新
  • 入出庫管理
  • CSV一括取込
  • データ移行
  • バッチ処理

開発現場での利用頻度

順位用途
1位受注登録
2位在庫更新
3位CSV取込
4位バッチ処理
5位データ移行

業務システムでは非常に重要です。


まとめ

DAOのトランザクション処理は、Access VBA開発においてデータ整合性を守るための最重要技術の一つです。

特に

  • 受注登録
  • 売上管理
  • 在庫管理
  • CSV取込
  • データ移行

などで大きな効果を発揮します。

重要なのは次の3つです。

DBEngine.BeginTrans

DBEngine.CommitTrans

DBEngine.Rollback

これらを正しく利用することで、

中途半端な更新を防ぐ

データ不整合を防ぐ

運用品質を向上する

ことができます。

Copilotを活用すれば、

  • トランザクションコード生成
  • Rollback追加
  • エラーハンドリング強化

も効率的に進められます。

Access VBAで本格的な業務システムを開発するなら、DAOトランザクションは必ず習得しておきたい技術です。

Access 実践マスターガイド~仕事の現場で即使える | 今村 ゆうこ |本 | 通販 | Amazon
Amazonで今村 ゆうこのAccess 実践マスターガイド~仕事の現場で即使える。アマゾンならポイント還元本が多数。今村 ゆうこ作品ほか、お急ぎ便対象商品は当日お届けも可能。またAccess 実践マスターガイド~仕事の現場で即使えるもアマ…

コメント

タイトルとURLをコピーしました