PR

Access VBAで更新エラー時のデータ破損を防ぐ|DAOトランザクション処理の基本と実践例

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をコピーしました