こんにちは、なかぜんです。
業務システムをAccessで作っていると、「このデータ、今どんな状態?」「処理済かどうかをどう管理する?」といった“状態管理”の悩みにぶつかること、ありませんか?
そんなときに役立つのが「フラグ管理」の設計パターンです。今回は、上級者向けにしっかりと、でもわかりやすく解説していきますね。
フラグ管理とは?なぜ必要?
業務でよくある「状態管理」
Accessでは、データの「状態」を把握して処理を分岐させたり、表示を制御したりする場面が多くあります。たとえば、
- 請求済みかどうか
- 削除済み(論理削除)かどうか
- 承認されたかどうか
こうした情報を効率的に管理するために、「フラグ(Flag)」という項目をテーブルに設けるのが一般的です。
シンプルな構成と運用のしやすさ
フラグを使えば、1つのフィールドで複数の状態を明確に管理できます。たとえば「0=未処理、1=処理済」のように、値と状態を対応させます。
これにより、クエリやVBAでの処理もシンプルになり、業務ロジックを明確に保つことができるのです。
基本の設計パターン
単一状態フラグ(Yes/No型または数値型)
まずはシンプルな例から。
' 例:納品済みフラグの更新
CurrentDb.Execute "UPDATE T_受注 SET 納品済フラグ = True WHERE 受注ID = 1001"
解説:このコードは、受注IDが1001のデータに対して「納品済み」とフラグを立てる処理です。Yes/No型の「納品済フラグ」を使っています。
複数状態を管理する場合(状態コード型)
状態が2つ以上ある場合は、「数値型」で管理し、マスタテーブルと組み合わせて使うのがおすすめです。
' 状態コード(例:0=未処理, 1=承認待ち, 2=承認済み)
CurrentDb.Execute "UPDATE T_申請 SET 状態コード = 2 WHERE 申請ID = 500"
マスタテーブル「M_状態」などとリレーションを組んでおけば、フォーム上での表示もわかりやすくなります。
画面イメージと制御例
フォーム上でボタンの表示を切り替える
' 状態に応じてボタンの可視性を切り替える例
Private Sub Form_Current()
Select Case Me!状態コード
Case 0 ' 未処理
Me!btn承認.Enabled = True
Case Else
Me!btn承認.Enabled = False
End Select
End Sub
解説:フォームの現在レコードが未処理の場合のみ「承認ボタン」を有効にする制御です。業務ルールの明確化にもつながります。
注意点とよくあるミス
- フラグが増えすぎて「状態の意味」が分かりづらくなる
- フラグ値に意味がない(True/Falseだけで処理分岐できない)
- マスタと連携していないため、表示が固定的
フラグは便利ですが、「使いすぎ」「意味を込めすぎ」には注意。ルールを明文化して、マスタ連携とセットで考えるのがコツです。
応用ポイント
状態変更ログの自動記録
VBAでフラグを更新するたびに、「状態履歴」テーブルにログを残す設計もおすすめです。
Sub UpdateStatusWithLog(申請ID As Long, 新状態 As Integer)
Dim SQL1 As String, SQL2 As String
SQL1 = "UPDATE T_申請 SET 状態コード = " & 新状態 & " WHERE 申請ID = " & 申請ID
SQL2 = "INSERT INTO T_状態履歴 (申請ID, 状態コード, 変更日時) VALUES (" & 申請ID & "," & 新状態 & ", Now())"
CurrentDb.Execute SQL1
CurrentDb.Execute SQL2
End Sub
解説:状態を変えた記録を自動で別テーブルに残すことで、「誰がいつ変更したか?」のトレースが可能になります。
複数条件での表示制御
フラグに加えて「ユーザー権限」や「担当部署」なども組み合わせて、柔軟なアクセス制御が可能になります。
まとめ:状態管理の第一歩は「意味あるフラグ」から
今回は、Access上級者の方向けに「状態管理のフラグ設計パターン」について紹介しました。
- フラグは「状態を明確に表す」ための便利な仕組み
- Yes/No型や状態コード型を使い分けよう
- マスタ連携・履歴ログとの組み合わせで強力に!
「うちのシステム、処理状況が分かりにくいんだよな…」と思ったら、まずはフラグの設計から見直してみてください。
それではまた、なかぜんでした!
