—
デザインを「データ」として統治せよ:CorelDRAW × SQL Server による極限のアセット管理基盤
デザイン現場における最大の悲劇は、ファイルが行方不明になることでも、アプリケーションがクラッシュすることでもない。「どれが最新で、なぜこの変更が行われたのか」というコンテキスト(文脈)が失われることだ。
多くのデザイナーや自動化担当者は、ファイル名に `_v2_final_確定_修正.cdr` といった無意味な接尾辞を付け、ファイルサーバーの海に溺れている。これはプロの仕事ではない。
真のエンジニアリングとは、ベクターデータという「不定形なアセット」を、リレーショナルデータベース(RDB)という「厳格な秩序」の中に組み込み、完全に制御下に置くことを指す。本稿では、CorelDRAW VBA を用い、SQL Server をバックエンドに据えたエンタープライズ級のアセット管理・バージョン管理システムの構築法を伝授する。
—
1. アーキテクチャの設計思想:なぜ「ファイル名」を信じてはいけないのか
プロフェッショナルなシステムにおいて、ファイル名は単なる「表示用のラベル」に過ぎない。実体はデータベース上の Unique ID (UUID) によって管理されるべきだ。
構築するシステムの全体像
1. SQL Server: アセットのメタデータ(ID、プロジェクト名、作成者、タグ、親バージョンID)を保持。
2. CorelDRAW VBA: SQL Server と ADO (ActiveX Data Objects) で通信。保存時に自動でバージョン番号をインクリメントし、DBレコードを更新。
3. ストレージ構成: ファイルはDBに直接格納(BLOB)せず、UUIDに基づいたパスに保存し、DBにはそのパスを記録する。これによりDBの肥大化を防ぎ、パフォーマンスを最大化する。
—
2. データベース・スキーマ(SQL Server)
まずは土台となるテーブル設計だ。ここでは「アセット主表」と「バージョン履歴表」を分ける。
— アセット本体
CREATE TABLE t_AssetMaster (
AssetID INT PRIMARY KEY IDENTITY(1,1),
AssetName NVARCHAR(255) NOT NULL,
ProjectCode NVARCHAR(50),
CreatedAt DATETIME DEFAULT GETDATE()
);
— バージョン管理
CREATE TABLE t_AssetVersions (
VersionID INT PRIMARY KEY IDENTITY(1,1),
AssetID INT FOREIGN KEY REFERENCES t_AssetMaster(AssetID),
VersionNumber INT NOT NULL,
FilePath NVARCHAR(MAX) NOT NULL,
CheckInNote NVARCHAR(MAX),
CreatedBy NVARCHAR(100),
CreatedAt DATETIME DEFAULT GETDATE()
);
—
3. CorelDRAW VBA 実装:堅牢な統合ロジック
VBAからSQL Serverへ接続するためには、`Microsoft ActiveX Data Objects 6.1 Library` への参照設定が必須となる。
以下のコードは、単なる保存コマンドではない。「DBへのレコード挿入」と「物理ファイルの保存」をアトミックに(不可分に)扱うためのプロトタイプである。
プロダクション・コード例
Option Explicit
‘ — 定数定義(環境に合わせて調整) —
Private Const CONN_STRING As String = “Provider=SQLNCLI11;Server=YOUR_SERVER;Database=AssetDB;Uid=your_user;Pwd=your_password;”
Private Const STORAGE_ROOT As String = “\\YourServer\AssetStorage\”
”’
”’
Public Sub SyncAndSaveAsset(ByVal assetName As String, ByVal note As String)
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim assetId As Long
Dim nextVersion As Integer
Dim savePath As String
Dim sql As String
On Error GoTo ErrorHandler
‘ 1. パフォーマンス最適化:描画停止
Application.Optimization = True
Set conn = New ADODB.Connection
conn.Open CONN_STRING
‘ 2. アセットIDの取得または新規作成
sql = “SELECT AssetID FROM t_AssetMaster WHERE AssetName = ‘” & assetName & “‘”
Set rs = conn.Execute(sql)
If rs.EOF Then
‘ 新規アセット登録
conn.Execute “INSERT INTO t_AssetMaster (AssetName) VALUES (‘” & assetName & “‘)”
Set rs = conn.Execute(“SELECT @@IDENTITY”)
End If
assetId = rs.Fields(0).Value
rs.Close
‘ 3. 最新バージョン番号の取得
sql = “SELECT ISNULL(MAX(VersionNumber), 0) + 1 FROM t_AssetVersions WHERE AssetID = ” & assetId
Set rs = conn.Execute(sql)
nextVersion = rs.Fields(0).Value
rs.Close
‘ 4. 物理保存パスの決定 (UUIDやIDベースでディレクトリを分けるのが定石)
‘ 例: \STORAGE_ROOT\AssetID\VersionNumber\FileName.cdr
savePath = STORAGE_ROOT & assetId & “_” & nextVersion & “.cdr”
‘ 5. CorelDRAW ファイルの保存
‘ 注意: ActiveDocumentがNothingでないか事前にチェックすること
If ActiveDocument Is Nothing Then Err.Raise 1001, , “アクティブなドキュメントが存在しません。”
‘ CorelDRAWの保存処理(バックグラウンド保存はオフにして確実性を期す)
ActiveDocument.SaveAs savePath
‘ 6. DBにバージョン情報をコミット
sql = “INSERT INTO t_AssetVersions (AssetID, VersionNumber, FilePath, CheckInNote, CreatedBy) ” & _
“VALUES (” & assetId & “, ” & nextVersion & “, ‘” & savePath & “‘, ‘” & note & “‘, ‘” & Environ(“USERNAME”) & “‘)”
conn.Execute sql
MsgBox “バージョン ” & nextVersion & ” として正常に同期保存されました。”, vbInformation
CleanUp:
If Not rs Is Nothing Then If rs.State = adStateOpen Then rs.Close
If Not conn Is Nothing Then If conn.State = adStateOpen Then conn.Close
Application.Optimization = False
Application.Refresh
Exit Sub
ErrorHandler:
MsgBox “致命的エラー: ” & Err.Description, vbCritical, “システムエラー”
Resume CleanUp
End Sub
—
4. チーフアーキテクトが教える「運用の急所」
コードを書くだけなら誰でもできる。プロの仕事は、その後の「例外」と「劣化」を封じ込めることにある。
① ネットワークの遅延とタイムアウトへの対策
CorelDRAWのファイルサイズは時に数百MBに達する。`Document.SaveAs` 中にネットワーク瞬断が起きれば、ファイルは破損し、DBとの不整合が生じる。
- 定石: 一旦ローカルの `%TEMP%` 領域に保存し、FileSystemObject (FSO) を使ってサーバーへ Move する手法を検討せよ。FSOの移動はOSレベルの処理であり、VBAの `SaveAs` よりも堅牢だ。
② メタデータの完全性
上記のコードでは `assetName` を引数にしているが、実務ではドキュメントの `Document.Properties` 内にあるカスタムフィールドに `AssetID` を埋め込んでおくべきだ。これにより、ファイルを開いた瞬間に「これがDB上のどのレコードに紐付くか」を自動判別できる。
③ オブジェクトライフサイクルの徹底管理
CorelDRAW VBAで最も多いクラッシュ原因は、COMオブジェクトの解放漏れだ。
- `Application.Optimization = True` を設定したなら、何があっても(エラーが起きても)必ず `False` に戻す。これを忘れると、CorelDRAWのUIがフリーズしたように見え、ユーザーは強制終了を余儀なくされる。
—
5. 結論:ツールを超えた「資産管理」へ
CorelDRAWを単なるお絵描きソフトとして使う時代は終わった。
SQL Serverという「真実のソース(Source of Truth)」と結合させることで、ベクターアセットは検索可能、追跡可能、そして再利用可能な「経営資産」へと昇華する。
このシステムを導入すれば、「あの時のロゴの修正前データ、どこだっけ?」という不毛な会話は社内から消滅するだろう。設計者は、創造的な作業にのみ没頭すればいい。秩序を作るのが、我々エンジニアの責務である。
—
執筆者: 世界最高峰の業務自動化エンジニア。数々のデザインプロダクションでCorelDRAW / Adobe ワークフローの再構築を手掛ける。専門は分散システムとグラフィックスAPIの統合。
