AutoCAD×SQL Server:図面管理の「不整合」を根絶するアーキテクチャ設計
CADオペレーターが「最新版だと思って編集していた図面が、実は旧版だった」というヒューマンエラー。この悲劇をVBAだけで解決しようとするのはナンセンスです。AutoCADはあくまで「描画エンジン」であり、ファイル管理の真実(Truth)はデータベースにあるべきだからです。
今回は、SQL Serverを信頼できる唯一のデータ源(Single Source of Truth)とし、AutoCAD起動時にローカルキャッシュを強制同期させる「堅牢な図面管理自動化」の神髄を伝授します。
—
1. なぜ「ファイル名」で管理してはいけないのか
多くの現場が `図面_最新.dwg` といったファイル名運用をしていますが、これは破綻の元です。
- 競合の問題: ネットワークドライブの遅延で書き込みが重なる。
- バージョンの乖離: 誰かがローカルにコピーした瞬間から、その図面は孤立する。
我々が目指すべきは、「DBがリビジョンIDを保持し、ローカルファイルは常に使い捨てのキャッシュとして扱う」という設計です。
—
2. システムのアーキテクチャ
1. DB接続: ADODBライブラリを使用し、SQL Serverから最新のリビジョン情報(ファイルパス・ハッシュ値・更新日時)を取得。
2. 検証プロセス: ローカルに存在するファイルのハッシュ値と、DBの値を比較。
3. 同期: 不一致があれば、サーバーから最新版をダウンロード(または上書きコピー)。
4. AutoCAD操作: `ThisDrawing.Application.Documents.Open` で開く。
—
3. 実装コード:堅牢な同期ロジック
このコードは、エラーハンドリングを徹底し、万が一DBが落ちていてもAutoCADがフリーズしない設計にしています。
‘ 必要な参照設定: Microsoft ActiveX Data Objects 6.x Library
Option Explicit
Public Sub OpenLatestDrawingFromDB(ByVal DrawingID As String)
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim localPath As String, serverPath As String
On Error GoTo ErrorHandler
‘ 1. DB接続(接続文字列は環境に合わせて最適化すること)
Set conn = New ADODB.Connection
conn.ConnectionString = “Provider=SQLOLEDB;Data Source=YOUR_SERVER;Initial Catalog=CAD_DB;Integrated Security=SSPI;”
conn.Open
‘ 2. 最新情報の取得
Set rs = conn.Execute(“SELECT FilePath, Revision FROM Drawings WHERE DrawingID = ‘” & DrawingID & “‘”)
If Not rs.EOF Then
serverPath = rs(“FilePath”).Value
localPath = “C:\CAD_Cache\” & DrawingID & “.dwg”
‘ 3. ファイル同期(簡易的なサイズ比較による更新チェック)
If NeedUpdate(localPath, serverPath) Then
FileCopy serverPath, localPath
End If
‘ 4. AutoCADでオープン
Application.Documents.Open localPath
Else
MsgBox “指定された図面はデータベースに存在しません。”, vbCritical
End If
rs.Close
conn.Close
Exit Sub
ErrorHandler:
MsgBox “致命的なエラー: ” & Err.Description, vbCritical
End Sub
‘ ファイルサイズが異なれば更新とみなす簡易チェック関数
Private Function NeedUpdate(local As String, server As String) As Boolean
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FileExists(local) Then
NeedUpdate = True
Else
‘ 本来はMD5ハッシュ比較が望ましいが、速度重視ならサイズ比較
If fso.GetFile(local).Size <> fso.GetFile(server).Size Then
NeedUpdate = True
End If
End If
End Function
—
4. 運用上の極意:ここがプロの設計
非同期処理を意識する
AutoCADのVBAはシングルスレッドです。巨大な図面のコピー中にAutoCADを操作させると、システムが「応答なし」になります。もしファイルサイズが数GBに及ぶ場合は、`FileSystemObject` を使うのではなく、バックグラウンドでPowerShellをキックし、`BITS`(バックグラウンド転送サービス)を活用してダウンロードする設計に切り替えてください。
「読み取り専用」での強制オープン
設計者は時に、最新版を「誤って上書き」します。コード内で `Documents.Open` を呼び出す際、あえて `ReadOnly:=True` をデフォルトに設定し、編集が必要な場合のみ「チェックアウト」プロセスを経て属性を変更するフローにすべきです。
ログの重要性
誰が、いつ、どのバージョンの図面を開いたか。SQL Server側にログテーブルを用意し、`Documents.Open` の直後に `INSERT INTO Logs …` を走らせてください。これが後のトラブルシューティングにおいて、唯一の「真実」となります。
—
結び:技術は「管理」のためにある
VBAはレガシーと言われますが、AutoCADのAPIをダイレクトに叩ける唯一無二のツールです。しかし、「コードを書くこと」が目的になってはいけません。
今回提示した「DB連携による自動同期」は、図面管理という泥臭い作業をコードで抽象化し、設計者が本来の「設計業務」に集中するためのインフラです。まずはこの雛形を現場のデータベースに合わせてカスタマイズしてください。
あなたの書いたコードが、現場から「バージョン不一致」という言葉を抹殺することを期待しています。
