使用Caché中的%GOF无声地导出全局变量

时间:2012-04-13 07:05:15

标签: intersystems-cache

我想知道是否可以在没有用户互动的情况下使用“^%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 个答案:

答案 0 :(得分:3)

我建议您查看输出格式为7的%Library.Global()类。

  • classmethod导出(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 / Cache格式 6 - MSM格式 7 - 缓存块格式(%GOF)

    RecordFormat可以采用以下值: V - 可变长度记录 S - 流数据

    您可以在课程文档中找到它:http://docs.intersystems.com/cache20082/csp/documatic/%25CSP.Documatic.cls

    我从来没有使用它,但看起来它会起作用。

答案 1 :(得分: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 - Globals
  • PRJ - Studio Projects
  • OBJ - 对象代码
  • PKG - 包装定义
如果您希望导出多个类,则用逗号或分隔 将项目(“item”)=“”作为数组传递或使用外卡 如果filename为空,则它将导出到当前设备。

链接到docbook

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

答案 2 :(得分: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个全局变量(在此示例中命名为globals)

但我建议你选择DAiMor的答案,因为这是更“现代”的方式。

答案 3 :(得分: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