【実務・中級編】【上級者向け】SQL Server上の図面メタデータとVSDXのプロパティを同期し、保存時に双方向更新する連携ロジック – Visio VBA解析バイブル

スポンサーリンク

VisioとSQL Serverを同期せよ:VBAによる「真の」図面ライフサイクル管理

Visioの図面を単なる「絵」として扱っているうちは、自動化の恩恵の半分も享受できていない。図面はデータであり、そのデータはエンタープライズの基幹システム(SQL Server)と一元化されるべきだ。

今日は、Visioの保存イベントをトリガーに、図面内のカスタムプロパティをSQL Serverへ書き戻し、常に情報の鮮度を担保する「双方向同期」の設計論を授ける。

—

1. なぜ「保存時イベント」なのか

多くのエンジニアが犯す最大の過ちは、ユーザーに「同期ボタン」を押させることだ。人は忘れるし、間違える。エンジニアの責務は、ユーザーの操作を介さずに状態を確定させることにある。

Visioの `Document.BeforeDocumentSave` イベントをフックすることで、保存が試行される直前にデータベースとの整合性を強制する。これが堅牢なシステム構築の第一歩だ。

—

2. アーキテクチャの要点:切断と接続の極意

VBAからSQL Serverへ接続する際、最も注意すべきは「タイムアウト」と「リソースリーク」だ。

  • 接続文字列の外部化: コード内に直書きは論外。環境変数か、隠しシートのセルに保持せよ。
  • ADOの明示的クローズ: `ADODB.Connection` は、処理が終わるたびに必ず `Close` し、`Nothing` をセットする。Visioはメモリ管理が繊細であり、接続を放置すれば図面自体が不安定になる。

—

3. 実装:プロダクションコード

以下のコードを `ThisDocument` モジュールに配置せよ。

‘ ———————————————————
‘ 概要: 保存直前にカスタムプロパティをSQL Serverへ同期
‘ 依存: Microsoft ActiveX Data Objects 6.x Library
‘ ———————————————————
Private Sub Document_BeforeDocumentSave(ByVal doc As IVDocument)
On Error GoTo ErrorHandler

Dim conn As Object
Dim cmd As Object
Dim strConn As String

‘ SQL接続文字列 (実際には構成管理ファイル等から取得すること)
strConn = “Provider=SQLOLEDB;Data Source=SERVER_NAME;Initial Catalog=DB_NAME;Integrated Security=SSPI;”

Set conn = CreateObject(“ADODB.Connection”)
conn.Open strConn

‘ 図面のDocumentプロパティを取得
Dim docName As String: docName = doc.Name
Dim docVersion As String: docVersion = doc.CustomProps(“Version”).Value

‘ SQL実行: Upsert (存在しなければInsert、あればUpdate)
Set cmd = CreateObject(“ADODB.Command”)
With cmd
.ActiveConnection = conn
.CommandText = “usp_UpdateDrawingMetadata”
.CommandType = 4 ‘ adCmdStoredProc

.Parameters.Append .CreateParameter(“@DocName”, 200, 1, 255, docName)
.Parameters.Append .CreateParameter(“@Version”, 200, 1, 50, docVersion)
.Execute
End With

conn.Close
Exit Sub

ErrorHandler:
MsgBox “同期失敗: ” & Err.Description, vbCritical
‘ 必要に応じて保存をキャンセルするロジックをここに挿入
End Sub

—

4. 運用上の「罠」と解決策

A. ネットワーク遅延による「保存のフリーズ」

上記のコードは保存プロセスに同期的に割り込む。SQL Serverの応答が遅いと、ユーザーは「Visioが固まった」と感じる。
解決策: タイムアウト値を短く設定し、失敗した場合はログを残して非同期処理(別途バックグラウンドで走るPowerShellスクリプト等)へフォールバックさせる設計を推奨する。

B. コンフリクトの回避

複数人が同時に同じ図面を触る環境では、楽観的排他制御(`Version`カラムによる整合性チェック)が必須だ。SQL側で `UPDATE … WHERE Version = @OldVersion` を行い、影響行数が0なら競合エラーを発生させよ。

C. PDF出力の自動化

図面保存時にPDFを生成したい場合、`doc.ExportAsFixedFormat` を使うのがモダンな作法だ。これも同期処理の最後に組み込むことで、ドキュメント管理システム(DMS)への自動登録フローが完結する。

—

最後に:エンジニアとしての矜持

VBAはレガシーではない。使い手次第で、それは高度なシステム制御のインターフェースとなる。

今回提示したコードは、あくまで「動く最小単位」だ。実戦では、ここにエラーログの集約、接続のリトライロジック、そして何より「失敗した時にユーザーにどう伝えるか」というUXの設計を積み重ねること。

ツールを作るのではない。業務の「あり方」を設計するのだ。健闘を祈る。

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