【入門編】【上級プロフェッショナル向け】SQL Server上の「図面ステータス」と連動した、編集権限チェック付きオープンシステム – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロ記録の先へ:SQL Serverと連動した「設計品質を守る」図面オープンシステムの構築

こんにちは。日々、図面作成や自動化の荒波に揉まれているエンジニアの皆さん。
「マクロの記録」を使って、特定の操作を繰り返す作業から卒業しようとしている……そんな素晴らしいステップアップの途中にいるあなたを、今日は心から歓迎します。

マクロの記録は、いわば「決まった動きをなぞるだけ」のものです。しかし、プロフェッショナルな開発の世界では、「状況に応じて判断し、システム全体と対話する」ことが求められます。

今日、私たちが挑戦するのは、単なる図面操作ではありません。
「SQL Serverに保存された図面のステータス(承認済みか、編集可能か)を読み取り、それに応じてAutoCADの開き方を自動制御する」という、PLM(製品ライフサイクル管理)の核心に触れるシステムです。

「勝手に承認済み図面を上書きしてしまった……」
そんなヒューマンエラーを、コードの力で根絶する。そんなエンジニアの矜持(きょうじ)を、一緒に形にしていきましょう。

1. システムの全体像:なぜ「DB連携」が必要なのか?

図面データ(DWG)は、単なるファイルではありません。設計の「正解」が詰まった極めて重要な資産です。

一般的な現場では、以下のような問題が起こります。

  • 問題: 承認が終わった図面(リリース済み)を、誰かがうっかり修正して保存してしまった。
  • 原因: ファイルの「読み取り専用」属性を手動で設定する運用が、個人の記憶に頼っていた。

これを解決するために、「図面の状態(ステータス)の真実(Single Source of Truth)は、常にSQL Serverにある」というルールを作ります。

【図解:システムフロー】

1. ユーザーがAutoCAD上で「図面を開く」を実行。
2. VBAが、その図面のパスをキーに SQL Server へ問い合わせ。
3. SQL Server が「承認済み(ReadOnly)」か「設計中(Normal)」かを回答。
4. VBA が回答に基づき、AutoCADの `Documents.Open` メソッドの引数を切り替えて開く。

2. 事前準備:道具を揃えよう

この仕組みを実現するには、VBAに「データベースと話すための言葉」を教える必要があります。

1. 参照設定の追加
VBAエディタ(Alt + F11)を開き、メニューの `[ツール]` $\rightarrow$ `[参照設定]` を選択してください。
リストの中から `Microsoft ActiveX Data Objects 6.1 Library`(バージョンは環境により異なりますが、最新のもの)にチェックを入れてください。これが「ADODB」という、DB操作の魔法の杖になります。

2. データベースの準備(イメージ)
SQL Server上に、以下のようなテーブルがあることを想定します。

  • `DrawingTable`
  • `FilePath` (nvarchar): 図面のフルパス
  • `Status` (nvarchar): ‘Approved’(承認済) または ‘Draft’(設計中)

3. 実装:魂を込めたプロフェッショナル・コード

それでは、実際のコードを見ていきましょう。初学者の方でも迷わないよう、細部までコメントを添えています。

Option Explicit

' ==============================================================================
' 目的: SQL Serverのステータスに基づき、図面を適切なモードで開く
' 開発者: 伝説のチーフアーキテクト
' ==============================================================================

Sub SmartOpenDrawing()
    Dim dwgPath As String
    Dim dbStatus As String
    Dim acadApp As AcadApplication
    Dim acadDoc As AcadDocument
    
    ' 1. 開きたい図面のパスを指定(本来はダイアログ等から取得)
    dwgPath = "C:\Projects\Design\Part_A_001.dwg"
    
    ' 2. SQL Serverからステータスを取得
    ' ここでエラーが起きる可能性を考慮し、エラーハンドリングを組み込むのがプロの技
    On Error GoTo ErrorHandler
    dbStatus = GetDrawingStatusFromDB(dwgPath)
    On Error GoTo 0 ' エラーハンドリングをリセット
    
    ' 3. AutoCADオブジェクトの取得
    Set acadApp = ThisDrawing.Application
    
    ' 4. ステータスに基づいた条件分岐(ここがシステムの心臓部!)
    If dbStatus = "Approved" Then
        ' 【重要】承認済み図面は、ReadOnly:=True で開くことで上書きを物理的に防ぐ
        Debug.Print "ステータス: 承認済み。読み取り専用で開きます。"
        acadApp.Documents.Open dwgPath, True
    ElseIf dbStatus = "Draft" Then
        ' 設計中の場合は、通常モードで開く
        Debug.Print "ステータス: 設計中。通常モードで開きます。"
        acadApp.Documents.Open dwgPath, False
    Else
        ' DBに登録がない、または不明なステータスの場合は、安全のために読み取り専用にする
        MsgBox "図面ステータスが不明です。安全のため読み取り専用で開きます。", vbExclamation
        acadApp.Documents.Open dwgPath, True
    End If
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "システムエラー"
End Sub

' ==============================================================================
' 関数名: GetDrawingStatusFromDB
' 引数: filePath (String) - 調査対象の図面パス
' 戻り値: status (String) - 'Approved', 'Draft', または 'Unknown'
' ==============================================================================
Function GetDrawingStatusFromDB(ByVal filePath As String) As String
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim connString As String
    Dim sql As String
    Dim statusResult As String
    
    ' 初期値
    statusResult = "Unknown"
    
    ' --- 接続文字列の設定 (環境に合わせて書き換えてください) ---
    ' SQL Serverへの接続情報は、本来は外部ファイルや暗号化された場所で管理すべきです
    connString = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DB_NAME;Integrated Security=SSPI;"
    
    ' SQLクエリの構築(SQLインジェクション対策として、本来はパラメータ化クエリを推奨)
    ' ここでは分かりやすさのため、単純な文字列結合で記述します
    sql = "SELECT Status FROM DrawingTable WHERE FilePath = '" & Replace(filePath, "'", "''") & "'"
    
    ' オブジェクトの生成
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    ' DB接続開始
    conn.Open connString
    
    ' クエリ実行
    rs.Open sql, conn
    
    ' 結果の判定
    If Not rs.EOF Then
        statusResult = rs.Fields("Status").Value
    End If
    
    ' --- 後始末 (ここが重要!リソースの解放を忘れないこと) ---
    ' 接続を閉じ、メモリを解放するのは、プロフェッショナルとしてのマナーです
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
    
    GetDrawingStatusFromDB = statusResult
End Function

4. プロが教える「陥りやすい罠」と回避策

コードを書けるようになった次に、あなたが向き合うべきは「例外(イレギュラー)」です。

① リソースの「解放漏れ」という悪夢

`ADODB.Connection` や `Recordset` を使った後、`Close` や `Set … = Nothing` を忘れていませんか?
これを行わないと、データベースの接続枠(コネクションプール)を使い果たし、「他のユーザーがDBに接続できなくなる」という、一人のミスが組織全体の業務を止める大事故に繋がります。必ず「開けたら閉める」を徹底しましょう。

② 「ネットワーク断絶」への備え

DB連携は、ネットワークが切れた瞬間にクラッシュします。
上記のコードでは `On Error GoTo ErrorHandler` を入れています。DBに繋がらなかった時、プログラムを強制終了させるのではなく、「安全策(読み取り専用モード)をとって継続する」。この「Fail-safe(フェイルセーフ)」の考え方こそが、業務システムには不可欠です。

③ パスの「表記ゆれ」

`C:\Project\test.dwg` と `C:/Project/test.dwg` は、人間には同じに見えますが、DB照合では別物です。
比較を行う際は、パスの区切り文字を統一する、あるいは大文字小文字を区別しないといった、データの「正規化」を意識してください。

5. 最後に:ここをクリアすれば、あなたはもう「自動化エンジニア」です

お疲れ様でした。
今日学んだことは、単なる「AutoCADの操作」ではありません。
「外部データと連携し、業務ルールをコードに封じ込める」という、高度なシステム設計の第一歩です。

マクロの記録で得た「操作の知識」に、今日学んだ「ロジックと連携の知識」が加われば、あなたの作るツールは「便利な道具」から「信頼されるシステム」へと進化します。

最初はエラーに悩まされることもあるでしょう。でも、そのエラーこそが、システムの堅牢性を高めるための最高の教師です。

一歩ずつ、着実に。
あなたのコードが、世界の設計現場をより安全に、よりスマートに変えていくことを楽しみにしています。

Happy Coding!

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