【実務・中級編】【中級】リレーションシップの複雑な依存関係をグラフ化して可視化するVBAツール – Access VBA解析バイブル

スポンサーリンク

Accessの深淵を可視化せよ:Relationオブジェクトを掌握するリレーションシップ・マッピング技術

Access開発が泥沼化する最大の要因は、テーブル間の依存関係が「誰の頭の中にしかない」状態にあることだ。GUIのリレーションシップウィンドウは、テーブル数が増えるごとにスパゲッティと化し、結局何の役にも立たなくなる。

真のプロフェッショナルは、GUIに頼らない。DAOの`Relation`オブジェクトをコードで走査し、システムが抱える構造的負債を客観的な「データ」として抽出するのだ。

今日は、Accessの複雑怪奇なリレーションシップを可視化し、ドキュメント化を自動化するアーキテクチャを伝授する。

—

1. なぜ「DAO.Relation」を直接叩く必要があるのか

Accessのデータベースエンジン(ACE)は、リレーションシップ情報を`Database.Relations`コレクションに保持している。これをループ処理で解析することは、以下のメリットがある。

  • 依存関係の網羅: GUIで表示しきれない、隠れたリレーションも全て抽出できる。
  • 整合性チェック: 参照整合性(Referential Integrity)が設定されていない「野良リレーション」を即座に特定できる。
  • ドキュメント自動生成: 開発ドキュメントを常に最新の状態に保つための「脱属人化」ツールとして機能する。

—

2. 堅牢なリレーションシップ抽出エンジン

以下のコードは、単に情報を出すだけではない。「どのフィールドが、どのテーブルのどのフィールドを指しているか」を、外部ツール(Mermaid記法など)で解析可能な形式で抽出する。

プロダクションコード:ExportRelationMap

このコードを標準モジュールに配置し、イミディエイトウィンドウに出力結果を吐き出す設計にしている。

Option Compare Database
Option Explicit

‘ @description データベース内の全Relationを走査し、Mermaid形式の依存関係図を出力する
‘ @author Chief Architect
Public Sub ExportRelationMap()
Dim db As DAO.Database
Dim rel As DAO.Relation
Dim fld As DAO.Field
Dim output As String

Set db = CurrentDb

‘ Mermaid記法の開始
Debug.Print “erDiagram”

For Each rel In db.Relations
‘ 外部キー制約の有無を確認
Dim integrity As String
integrity = IIf((rel.Attributes And dbRelationUpdateCascade) <> 0, ” ||–o{ “, ” |o–o{ “)

‘ 複雑な依存関係を一行ずつ解析
For Each fld In rel.Fields
‘ [親テーブル] –[関係]–> [子テーブル] : [フィールド名]
Debug.Print ” ” & rel.Table & integrity & rel.ForeignTable & ” : “”” & fld.Name & “”””
Next fld
Next rel

Debug.Print “— 抽出完了: 上記をMermaid Live Editorに貼り付けてください —”
End Sub

—

3. 実務で「死なない」ためのアーキテクチャ設計

このツールを業務に組み込む際、以下の3点に注意を払わないエンジニアは二流だ。

A. 循環参照と再帰の恐怖

テーブル構造が複雑化すると、循環参照が発生する可能性がある。上記コードは単純なループだが、もしこれを「依存グラフ」としてメモリに保持する場合は、必ず訪問済みノードのフラグ管理(Dictionaryオブジェクト等)を行い、無限ループを防止すること。

B. カスケード削除・更新の可視化

リレーションの`Attributes`プロパティには、`dbRelationDeleteCascade`や`dbRelationUpdateCascade`といったフラグがビット演算で格納されている。これらを無視して設計すると、データ削除時に意図せぬ連鎖削除が起きる。ツールを拡張する際は、`Attributes`を解析して「カスケード有無」を明示的に出力するように改良せよ。

C. 実行環境の分離

このツールは、本番環境ではなく「開発用コピー」に対して実行すること。DAOは強力だが、テーブル定義を動的に変更するようなツールを作る場合、万が一の誤動作はDBの死を意味する。権限管理と実行ログの保持は必須である。

—

4. 伝説のエンジニアからのアドバイス

「なぜこの機能がAccess標準にないのか?」と不満を漏らすのは簡単だ。だが、「足りない機能は自ら実装する」のがAccess VBAエンジニアの矜持である。

今回提供したスクリプトは、単なるテキスト出力ツールではない。これを起点に、以下のようなステップアップを推奨する。

1. JSON出力: `Scripting.Dictionary`を活用し、JSON形式でエクスポートしてWebフロントエンドで可視化する。
2. 自動ドキュメント生成: Wordのテンプレートに流し込み、仕様書を自動作成する。
3. 整合性監査: 名前付け規則に従っていないリレーションを検出し、警告を出す「静的解析ツール」へと昇華させる。

Accessを単なる「事務用ツール」で終わらせるか、高度なデータ管理システムにまで引き上げるか。それは、あなたがリレーションシップという「データベースの血管」をどれだけ正確に可視化できるかにかかっている。

さあ、コードを書いてシステムを掌握せよ。

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