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() 类。

  • 类方法导出(Nsp As %String = $zu(5),ByRef GlobalList As %String,FileName As %String,OutputFormat As %Integer = 5,RecordFormat As %String = "V",qspec As %String = "d",翻译为 %String = "") 为 %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 - 包定义
如果您希望导出多个类,则用逗号分隔 then 或将 items("item")="" 作为数组传递或使用通配符。
如果文件名是空的,那么它将导出到当前设备。

文档手册的链接

编辑:添加“-d”作为 qspec 值将抑制导出的终端输出。如果您想以编程方式使用它,它可能会妨碍您。

于 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 回答