限界突破の設計術:OpenArgsをJSONで操り、Access画面遷移を支配する
Access開発の現場において、`DoCmd.OpenForm`の`OpenArgs`引数は、多くのプログラマにとって「単なる文字列を渡すだけの使い捨ての道具」でしかない。だが、真にスケーラブルなシステムを構築するアーキテクトにとって、ここは「画面間の状態転送ゲートウェイ」である。
今回は、単一の文字列という制約をJSONで突破し、型安全なパラメータ管理を実現する、極限の画面遷移設計を伝授する。
—
1. なぜ「JSON」を選択するのか
Access VBAは、パラメータを渡すための洗練された構造体や辞書オブジェクトを画面間で直接引き継ぐ仕組みを持たない。多くの開発者は「カンマ区切りの文字列」で頑張るが、それはスパゲッティコードへの第一歩だ。
JSONを採用する理由は明確である。
- 構造化の維持: 入れ子構造を許容し、複雑な状態を単一のシリアライズされた文字列に閉じ込められる。
- 拡張性: パラメータの追加に際し、既存のカンマ区切り位置を計算し直すという愚行から解放される。
- 外部連携: 今やAPI連携は必須。Web APIと親和性の高いJSON形式で内部状態を管理することで、将来的なWeb移行や疎結合化が容易になる。
—
2. 実装の核心:JSONによる抽象化レイヤー
AccessでJSONを扱うには、`ScriptControl`はもはや死に体であり、Windows標準の`MSScriptControl.ScriptControl`は64bit環境で動作しない。ここは、`VBA-JSON`ライブラリを使用するか、最小限のパーサーを自作するのが筋だ。
以下は、画面遷移を制御する「パラメータ・パケット」の設計例である。
‘ 画面遷移パラメータ生成クラス (簡易実装)
Public Function CreateNavigationArgs(ByVal FormMode As String, ByVal ID As Long, ByVal IsReadOnly As Boolean) As String
‘ JSON文字列を手動構築 (ライブラリ導入が難しい現場を想定)
‘ ※本番環境ではJSONConverter等の定評あるライブラリを推奨
CreateNavigationArgs = “{“”Mode””:””” & FormMode & “””,””ID””:” & ID & “,””ReadOnly””:” & IIf(IsReadOnly, “true”, “false”) & “}”
End Function
3. 受け取り側の設計:オブジェクトのライフサイクル管理
受け取り側のフォームでは、`Open`イベントで解析を行う。ここで重要なのは、「いつ解釈し、いつメモリを解放するか」というオブジェクトのライフサイクル管理だ。
Private Sub Form_Open(Cancel As Integer)
Dim rawArgs As String
Dim json As Object ‘ JSON解析後のデータ構造
rawArgs = Me.OpenArgs
If Len(rawArgs) = 0 Then Exit Sub
‘ JSON文字列をパースする (JSONConverter使用想定)
Set json = JsonConverter.ParseJson(rawArgs)
‘ 状態の反映
Me.Mode = json(“Mode”)
Me.Recordset.FindFirst “ID = ” & json(“ID”)
Me.AllowEdits = Not json(“ReadOnly”)
‘ オブジェクトの明示的解放
‘ VBAのガベージコレクションは参照カウント方式だが、
‘ 明示的なSet Nothingは、複雑なフォーム間処理における循環参照を断つための礼儀である
Set json = Nothing
End Sub
—
4. シニアエンジニアが意識すべき「極限の知見」
① 文字列の肥大化と限界
`OpenArgs`は文字列である。巨大なバイナリデータを渡すのは論外だ。JSONはあくまで「状態のポインタ」や「キー」を渡すために使うべきであり、レコードセットそのものをシリアライズして渡すような設計は、Accessのメモリ空間を瞬時に枯渇させる。
② Windows APIとの連携(パフォーマンスの深淵)
画面遷移時、APIを使用して「前画面のインスタンスを特定」し、直接メモリ上の値を書き換えるような荒技も可能だが、これは「疎結合の原則」を破壊する。JSONを使ったパラメータ受け渡しは、疎結合を保ちつつ、複雑な要件を解決する「最も知的な妥協点」である。
③ レガシー環境での保守性
もしあなたが古いAccess 2010環境で戦っているなら、JSONパーサーすら自作する必要があるかもしれない。その際は、正規表現(`VBScript.RegExp`)を用いてキー値を抽出するクラスを一つ作り、`Project`の参照設定に依存しない構成にすること。それが伝説的なエンジニアの「現場力」だ。
—
結び:技術の真髄は「規律」にある
JSONを`OpenArgs`に忍ばせる手法は、単なる小手先のテクニックではない。これは、「混沌としがちなAccessの画面状態を、データ構造として定義する」というアーキテクトの意志の表明である。
画面間を漂うデータを型にはめ、管理下に置く。それだけで、あなたのシステムは一気に堅牢になる。コードを書くことだけに満足せず、その裏側に流れる「データの流れ」を統治せよ。
Accessという古のプラットフォームであっても、設計思想さえ現代的であれば、それは最新のアプリケーションに勝るパフォーマンスを叩き出す。健闘を祈る。
