1

ユーザーの操作なしで「^%GOF」を使用できるかどうか知りたいのですが。私はCaché2008を使用しています。^%GOは遅くなるため、オプションではありません。一時ファイルからの入力を使用して質問に自動的に回答していますが、失敗する可能性があります(まれに発生します)。

このユーティリティのルーチンが%SYSで見つかりませんでした。それはどこにありますか?

ありがとう、

回答:「%SYS.GlobalQuery:NameSpaceList」を使用して、グローバル(システムグローバルを除く)のリストを取得します。

Set Rset = ##class(%ResultSet).%New("%SYS.GlobalQuery:NameSpaceList")
d Rset.Execute(namespace, "*", 0)
s globals=""

while (Rset.Next()){
 s globalName=Rset.Data("Name")_".gbl"
 if (globals=""){
  s globals = globalName
 }else{
  s globals = globals_","_globalName
}

d ##class(%Library.Global).Export(namespace, globals, "/tmp/export.gof", 7)

唯一の欠点は、グローバルエントリに許可されている最大値を超えるグローバルの連結を持つ名前空間がある場合、プログラムがクラッシュすることです。次に、グローバルリストを分割する必要があります。

4

4 に答える 4

3

出力形式7の%Library.Global()クラスを確認することをお勧めします。

  • classmethod Export(Nsp As%String = $ zu(5)、ByRef GlobalList As%String、FileName As%String、OutputFormat As%Integer = 5、RecordFormat As%String = "V"、qspec As%String = "d"、 Translation As%String = "")as%Status

    OutputFormatとRecordFormatを使用して、グローバルGlobalListのリストを名前空間NspからFileNameにエクスポートします。OutputFormatは、次の値を取ることができます。1-DTM形式3-VAXDSM形式4-DSM11形式5-ISM/キャッシュ形式6-MSM形式7-キャッシュブロック形式(%GOF)

    RecordFormatは、以下の値を取ることができます。V-可変長レコードS-ストリームデータ

    これは、クラスのドキュメントにあります:http ://docs.intersystems.com/cache20082/csp/documatic/%25CSP.Documatic.cls

    私はそれを使ったことがありません、しかしそれはトリックをするように見えます。

于 2012-04-13T14:55:08.577 に答える
2

グローバルをファイルにエクスポート

d $system.OBJ.Export("myGlobal.GBL","c:\global.xml")

ファイルからグローバルにインポート

d $system.OBJ.Load("c:\global.xml")
アイテムをXMLファイルとしてエクスポートする

アイテムの拡張子によって、アイテムのタイプが決まります。アイテムは次のいずれかになります。

  • CLS-クラス
  • CSP-サーバーページのキャッシュ
  • CSR-キャッシュルールファイル
  • MAC-マクロルーチン
  • INT-なしマクロルーチン
  • BAS-基本的なルーチン
  • INC-ファイルを含める
  • GBL-グローバル
  • PRJ-スタジオプロジェクト
  • OBJ-オブジェクトコード
  • PKG-パッケージ定義
複数のクラスをエクスポートする場合は、コンマで区切るか、items( "item")= ""を配列として渡すか、ワイルドカードを使用します。
ファイル名が空の場合、現在のデバイスにエクスポートされます。

docbookへのリンク

編集:qspec値として「-d」を追加すると、エクスポートの最終出力が抑制されます。これをプログラムで使用したい場合は、邪魔になる可能性があります。

于 2012-04-13T21:30:03.703 に答える
1

そして完全を期すために:

SAMPLES>s IO="c:\temp\test.gof"

SAMPLES>s IOT="RMS"

SAMPLES>s IOPAR="WNS"

SAMPLES>s globals("Sample.PersonD")=""

SAMPLES>d entry^%GOF(.globals)

SAMPLES>

->結果としてc:\ temp\test.gofにエクスポートがあります。配列には最大65435個のグローバルを定義できます(この例ではグローバルと呼ばれます)

しかし、これはより「現代的な」方法であるため、DAiMorの回答を使用することをお勧めします。

于 2012-04-14T08:47:04.403 に答える
0

最大文字列エラーを回避するには、カンマ区切りの文字列の代わりに添え字を使用する必要があります。

Set Rset = ##class(%ResultSet).%New("%SYS.GlobalQuery:NameSpaceList")
d Rset.Execute(namespace, "*", 0)

while (Rset.Next()) {
 s globals(Rset.Data("Name"))="" // No need for _".gbl" in recent Cache
}

d ##class(%Library.Global).Export(namespace, .globals, "/tmp/export.gof", 7) // Note dot before globals
于 2012-04-22T11:12:33.570 に答える