※以下の方法は、Caché5.0.xバージョンにのみ適用されます。(Caché5.1以降はTopic154を参照)
Caché5.0.xでは、以下の様な方法でグローバルのインポート/エクスポート処理をプログラムの中に組み込むことができます。
(表記上、コマンド/行の途中で改行が含まれている可能性があります)
1. グローバルエクスポート方法
一般的に、“WNS”オプションは制御文字などのバイナリデータを含まないグローバルをエクスポートまたはインポートする場合に使用し、それ以外のフォーマット(ブロックモード, “WNV”)をバイナリデータの保存に使用します。
処理は、出力グローバルの指定の部分(1.1)とエクスポート処理の部分(1.2)の2つで構成されます。
1.1 出力グローバルの指定
1.1.1 基本形(個別にグローバル名を指定する)
Kill ^%utility($j)
Set ^%utility($j,1)="^Global1”
Set ^%utility($j,2)="^Global2”
1.1.2 全てのグローバルをエクスポートする場合
(新しいデータベースにモード7 (%GOF 形式)で出力する場合を除いて推奨されません)
Kill ^%utility($j) Set glocount=$$Fetch^%GD("*",1,0) ; 不要なグローバルのエントリを削除 If $I=2 Kill ^%utility("SPOOL") ; $IO 特殊変数が2の場合^SPOOLをエクスポートしない Set GLO="" Set GC=0 For G=1:1 Set GLO=$O(^%utility($J,GLO)) Quit:GLO="" If $d(@GLO) Set GC=GC+1,glist(GC)=GLO Kill ^%utility($j) Merge ^%utility($j)=glist
1.1.3 制御文字やルーチンソース、オブジェクトが格納されているグローバルを除くほぼ全てのグローバルをエクスポートする場合(新しいデータベースに全体をコピーするのでない限り、推奨されません)
Kill ^%utility($j)
; 制御文字コードをデータに持つ%qCache 、 rOBJ を除外する
; ルーチンとオブジェクトの定義ソースグローバルを除外
Set glocount=$$Fetch^%GD("*;'%qCache*;'rOBJ;'ROUTINE;'r*;'odd*",1,0)
; 不要なグローバルのエントリを削除
If $I=2 Kill ^%utility("SPOOL") ; $IO 特殊変数が2の場合^SPOOLを出力しない
Set GLO="" s GC=0
For G=1:1 Set GLO=$O(^%utility($J,GLO)) Quit:GLO="" If $d(@GLO) Set GC=GC+1,glist(GC)=GLO
Kill ^%utility($j)
Merge ^%utility($j)=glist
1.1.4 ^A から ^EZZZZZZ... までのすべてのグローバルをエクスポート(既存のデータベースに対して特定のグローバルをエクスポートする場合に推奨される方法)
Kill ^%utility($j)
Set glocount=$$Fetch^%GD("A*;B*;C*;D*;E*",1,0)
; 不要なグローバルのエントリを削除
If $I=2 Kill ^%utility("SPOOL") ; $IO 特殊変数が2の場合^SPOOLを出力しない
Set GLO="" Set GC=0
For G=1:1 Set GLO=$O(^%utility($J,GLO)) Quit:GLO="" If $d(@GLO) Set GC=GC+1,glist(GC)=GLO
Kill ^%utility($j)
Merge ^%utility($j)=glist
1.2 エクスポート処理
1.2.1 ブロック形式のエクスポート(%GOF 相当)
Set flag=$$main^%Wgs("FILE.GOF:(""WNU"")",7,"Header Comment",0,0)
1.2.2 レコード形式のエクスポート、Caché ストリーム形式ファイルフォーマット(%GO 相当)
Set RM=80
Set flag=$$main^%Wgs("FILE.GSA:(""WNS"")",5,"Header Comment",0,0)
1.2.3 レコード形式のエクスポート、Caché 可変長レコード形式ファイルフォーマット(%GO 相当)
Set RM=80
Set flag=$$main^%Wgs("FILE.GSA:(""WNV"")",5,"Header Comment",0,0)
2. グローバルインポート方法
2.1 ブロック形式のグローバルインポート(%GIF 相当)全グローバル
Set file="FILE.GOF"
Kill ^%utility($j)
Set IO=0
Set header=$$header^%Wgr(file_":(""RU"")",7,0)
For i=2:1 Set glo=$p($p(header,$c(1),i),$c(19)) q:glo="" Set ^%utility($j,glo)=""
Set flag=$$main^%Wgr(file_":(""RU"")",7,"*",0,0,0)
Kill ^%utility($j)
2.2 ブロック形式のグローバルインポート(%GIF 相当)選択グローバル
Kill ^%utility($J)
Set ^%utility($J,"Global1")="" ; ノード部にグローバル名( ^ は不要)を設定します
Set ^%utility($J,"Global2")=""
Set IO=0
Set header=$$header^%Wgr("FILE.GOF:(""RU"")",7,0) ; (A)
Set flag=$$main^%Wgr("FILE.GOF:(""RU"")",7,"*",0,0,0)
(ここで FILE.GOF がファイル名です。ファイル名は絶対パスで指定してください)
Kill ^%utility($J)
選択グローバルをインポートするには、以下の内容で "*"となっている部分をインポートするグローバルのリスト($c(13,10)デリミタ)に置き換えてください。
例:
"^A*"_$c(13,10)_"^Dictionary"を指定すると、A から Dictionary までのすべてのグローバルがインポートされます。
これにさらに制限をかけることができます。
リストア対象グローバルは、^%utility($j グローバルでも指定する必要があります。
また、(A)の部分で取得したheaderにグローバルリストが格納されているので、そこから選択を行うことも可能です。
2.3 レコード形式ファイルのグローバルインポート、Cachéストリームファイル形式(%GI 相当)全グローバル
Set IO=0
Set flag=$$main^%Wgr("FILE.GSA:(""RS"")",5,"*",0,0,0)
補足: エラーが発生する場合は、 ("RS") パラメータを省略してください。
2.4 レコード形式ファイルのグローバルインポート、Caché 可変長ファイル形式(%GI 相当)全グローバル
Set IO=0
Set flag=$$main^%Wgr("FILE.GSA:(""RV"")”,5,"*",0,0,0)