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

スポンサーリンク

Accessの深淵を可視化せよ:Relationオブジェクトを解剖し、依存関係の「地図」を生成する

Accessシステムが肥大化し、開発者が入れ替わるたびに「このテーブルを消すと何が壊れるのか?」という恐怖が現場を支配する。DAOの`Relation`コレクションは、システムという名の迷宮のコンパスだ。しかし、このコンパスを使いこなしている者は驚くほど少ない。

今日は、混沌としたDB構造を可視化し、システムへの敬意を取り戻すための、アーキテクト級のソリューションを提示する。

—

1. なぜ「Relationオブジェクト」を直接操作するのか

GUIのリレーションシップウィンドウは、ある程度の規模を超えると「スパゲッティの巣」と化す。我々が求めるのは、GUIの視覚的な整理ではない。プログラムによって抽出されるデータとしての構造情報だ。

`CurrentDb.Relations`を走査することで、我々は以下を得る。

  • 物理的な制約: 参照整合性がどこで効いているか。
  • 論理的な結合: システムが暗黙的に期待しているキーの依存関係。

これをテキスト(Mermaid形式等)に落とし込むことで、Wikiや設計ドキュメントと同期させることが可能になる。これが保守フェーズにおける「真の武器」だ。

—

2. 実装の設計指針:メモリとパフォーマンスの極致

Access VBAにおいて、`DAO`や`ADO`のオブジェクトを安易にループで回すのは、メモリリークとパフォーマンス低下の入り口だ。以下のコードでは、以下の鉄則を遵守する。

1. オブジェクトの明示的解放: `Set obj = Nothing`は宗教儀式ではなく、リソースの生存期間を制御する必須の責務である。
2. 遅延束縛の回避: 可能な限り早期束縛を行い、コンパイル時に型チェックを行う。
3. 文字列構築の最適化: 頻繁な連結には `StringBuilder`的アプローチ(あるいは極力シンプルな連結)を意識する。

—

3. リレーションシップ構造抽出ツール(実装コード)

以下のコードは、現在のデータベースの全Relationを走査し、Mermaid.jsでそのまま描画可能なテキストをイミディエイトウィンドウに出力する。

‘ ———————————————————————-
‘ リレーションシップ構造抽出アーキテクチャ
‘ 依存関係をMermaid.js形式で抽出する
‘ ———————————————————————-
Public Sub ExportDatabaseRelationships()
Dim db As DAO.Database
Dim rel As DAO.Relation
Dim fld As DAO.Field
Dim relOutput As String

‘ DBオブジェクトの初期化
Set db = CurrentDb

‘ Mermaid.jsのグラフ定義開始
Debug.Print “erDiagram”

‘ DAO.Relationコレクションを走査
For Each rel In db.Relations
‘ 外部キー制約を持たない一時的なリレーションを除外するならここで判定
‘ If (rel.Attributes And dbRelationDontEnforce) = 0 Then …

For Each fld In rel.Fields
‘ 依存関係の定義: テーブルA ||–o{ テーブルB : “FK_Name”
Debug.Print ” ” & rel.Table & ” ||–o{ ” & rel.ForeignTable & ” : “”” & rel.Name & “”””
Next fld

Set fld = Nothing
Next rel

‘ クリーンアップ:メモリを解放し、リファレンスカウントを適正化する
Set rel = Nothing
Set db = Nothing

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

—

4. 伝説のエンジニアからの提言

レガシー環境での注意点

古い`.mdb`形式のAccessでは、システムテーブルである`MSysRelationships`に直接クエリを投げる手法も存在する。しかし、それは禁じ手だ。Accessの内部構造はバージョンによって密かに変更されるリスクがある。DAOのインターフェースを通すことは、将来のバージョンアップに対する「緩衝材」となる。

応用:自動化の先へ

このツールを拡張し、`VBA.FileSystemObject`を使用して、定期的に自動生成されたテキストをネットワーク共有フォルダのMarkdownファイルへ書き出すバッチを組めば、「システム構成図が常に最新である状態」を強制的に維持できる。

ドキュメントを書かないプログラマを責めるのは無益だ。ドキュメントを「生成される副産物」へと昇華させれば、その問題は解決する。

—

最後に:コードは「対話」である

Access VBAは、現代の言語と比較すれば確かに泥臭い。だが、その泥臭さの中にこそ、数百万行のトランザクションを支えてきた堅牢なアーキテクチャの魂が宿っている。

このコードを起点に、貴殿のシステムの「地図」を完成させてほしい。それが、レガシーシステムの呪縛から解き放たれる第一歩となる。

「動くコードを書くのはプロ。動かし続ける仕組みを作るのがアーキテクトだ。」

健闘を祈る。

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