バッチ処理を使ってAccessテーブルのデータを加工する方法について解説しています。
前編ではRun SQLメソッドを連鎖させてバッチ処理を行うプログラミングを解説しました。
前編はこちらから読めます。
後半にあたる今回は、 コードマスタテーブルに格納した SQL文を活用してバッチ処理を行う方法について解説します。
コードマスタを作り上げるのは大変ですが、一度作ってしまえばコードを直接触ることはありません。
本記事ではマスタテーブルの編集画面に始まり、テーブルの構成やVBAコード、処理の流れについて解説していきます。
これらの情報は実務でそのまま使える方法ですが、他のサイトでもあまり書かれていない貴重なものです。
本記事の最後までをしっかり学習し、Accessを便利にカスタマイズしていきましょう。
プログラムを実行するサンプルコードは以下のリンクからダウンロードしてください。
≫ サンプルデータベース(Batch_Processing.accdb)
コードマスタ編集画面の解説
フォーム「F00更新用SQLマスタM」を開きます。
サブフォームにコードマスタテーブルのデータが表示されています。
編集ボタンをクリックすると、選んだレコードの単票フォームが起動します。
起動した単票フォームの画面です。
ここでSQL文の編集を行えます。
クエリの実行順番も単票フォームで入れ替えることができます。
中間テーブルを起動する場合は、中間物の名前と種類を入力します。
中間生成物は「WT(ワークテーブル)」や「WQ(ワーククエリ)」から始めると分かりやすいです。
サンプルデータベースでは実装していませんが、SQL文だけでは処理しきれない動きはプロシージャ名の指定で実現できます。
そのときは「Pro実行」にチェックを入れます。
マスタテーブルの構成
マスタテーブルのフィールド名は以下のとおりですが、あくまでも一例です。
フィールド名 | 内容 |
---|---|
ID | ただの番号(特に意味なし) |
動作 | 処理内容を明記(備考のようなもの) |
SQL文 | 実際に処理するSQL文やプロシージャ名 |
中間物名称 | 中間テーブルやクエリの名称 |
起動時 | 起動時に作動するものはチェック(Yes/No型) |
起動時順番 | 処理の順番 |
中間作成物 | 中間生成物の種類を選択(テーブル、クエリ) |
Pro実行 | 実行するプロシージャ名(Yes/No型) |
上の構成がベストではありませんので、フィールド名は必要に応じて調整してください。
この構成で工夫したところは、中間生成物とプロシージャ実行の2点です。
実際にバッチ処理の流れを組み立ててみると分かりますが、アクションクエリ(更新・追加)だけでは希望どおりの出力テーブルを作りきれないこともあります。
中間クエリや中間テーブルを使えば、より複雑な計算も可能です。
さらに条件分岐や繰り返しが必要な場合は、プロシージャを使った処理が便利です。
バッチ処理を実行するコード
コードマスタを使ったバッチ処理のコードは下の通りです。
Private Sub バッチ集計2_Click()
Dim SQL_DAO_KS As String
Dim DB_KS As DAO.Database
Dim RS_KS As DAO.Recordset
Dim Qdf As QueryDef
'コードマスタを実行順に並べ替え
SQL_DAO_KS = "SELECT * FROM T09更新用SQLマスタ WHERE 起動時 = Yes ORDER BY 起動時順番;"
Set DB_KS = CurrentDb()
Set RS_KS = DB_KS.OpenRecordset(SQL_DAO_KS)
RS_KS.MoveFirst
'順番に処理
Do Until RS_KS.EOF
If RS_KS.Fields(6).Value = "クエリ" Then '中間クエリの作成
If ExtQry(RS_KS.Fields(3).Value) = False Then
Set Qdf = CurrentDb.CreateQueryDef(RS_KS.Fields(3).Value, RS_KS.Fields(2).Value)
Set Qdf = Nothing
End If
ElseIf RS_KS.Fields(6).Value = "テーブル" Then '中間テーブルの作成
If ExtTbl(RS_KS.Fields(3).Value) = False Then
DB_KS.Execute RS_KS.Fields(2).Value
End If
ElseIf RS_KS.Fields(7).Value = True Then 'プロシージャの実行
Run RS_KS.Fields(2).Value
Else
DB_KS.Execute RS_KS.Fields(2).Value 'SQLを実行
End If
RS_KS.MoveNext
Loop
RS_KS.Close: Set RS_KS = Nothing
DB_KS.Close: Set DB_KS = Nothing
'中間クエリとテーブルの削除
SQL_DAO_KS = "SELECT * FROM T09更新用SQLマスタ WHERE 起動時 = Yes AND 中間物名称 Is Not Null ORDER BY 起動時順番;"
Set DB_KS = CurrentDb()
Set RS_KS = DB_KS.OpenRecordset(SQL_DAO_KS)
RS_KS.MoveFirst
Do Until RS_KS.EOF
If RS_KS.Fields(6).Value = "クエリ" Then
CurrentDb.QueryDefs.Delete RS_KS.Fields(3).Value
Else
CurrentDb.TableDefs.Delete RS_KS.Fields(3).Value
End If
RS_KS.MoveNext
Loop
RS_KS.Close: Set RS_KS = Nothing
DB_KS.Close: Set DB_KS = Nothing
Me.F04月別カテゴリ集計DS.SourceObject = "F04月別カテゴリ集計DS"
End Sub
長めのコードですが、大まかには3つの処理に分かれます。
- コードマスタを実行順に並べ替える
- 出力テーブルの作成
- 中間生成物の削除
15~35行までの出力テーブルの作成処理では4つに分岐させています。
- 中間クエリ作成 → CreateQueryDefメソッド
- 中間テーブル作成 → Executeメソッド
- プロシージャ実行 → Runメソッド
- SQLを実行 → Executeメソッド
37~52行までは中間生成物を削除する処理です。
コードマスタで処理できる方法を確立すると、VBAコードの書き換えが不要になるので、メンテナンス性をかなり上げることができます。
まとめ
以上、コードマスタでバッチ処理を行う方法について解説しました。
コードマスタを使ったバッチ処置は、テーブルの書き換えだけで制御を変えることができるのでぜひ覚えておきたい方法です。
また、コードの手直しによるバグ発生のリスクを下げられるので、Accessシステムの安定運用につながります。
本記事のようなバッチ処理で行う方法以外にも、コードマスタを使える場面があります。
少しずつでもいいので、コードマスタに使い慣れておくのが大事です。