当 SET 或 KILL 应用于特定的全局变量时,如何调用 Cache ObjectScript 例程?
问问题
423 次
2 回答
3
我不确定你的意思,但我想你不知道如何在 SET 和 KILL 命令中使用全局变量。好吧,有很多变体可以做到这一点,如果你还不知道的话,你必须阅读文档。
代码例如:
set ^MyGlobal="testval"
kill ^MyGlobal
更新:
好吧,正如您所说的更改全局变量的“触发器”,您可以使用宏定义。
#; macro defenitions for set and kill
#define set(%var,%val) set %var=%val,%triggerSC=$$setTrigger($name(%var),%val)
#define kill(%var) kill %var s %triggerSC=$$killTrigger($name(%var))
kill
kill ^logGlobal
#; trigger fo direct global variable
$$$set(^global, "test")
#; trigger for global variable by name
set gn=$name(^global("ind"))
$$$set(@gn, "test")
$$$set(@gn@("123"), "test")
#; trigger for local variable
$$$set(testLocal, "test")
zwrite ^global
#; trigger for kill
$$$kill(^global)
$$$kill(testLocal)
zwrite ^logGlobal
quit
setTrigger(varName, value) public {
set ^logGlobal($increment(^logGlobal))=$listbuild("SET",varName, $get(value))
quit $$$OK
}
killTrigger(varName) public {
set ^logGlobal($increment(^logGlobal))=$listbuild("kill",varName)
quit $$$OK
}
您可以将宏定义和方法 setTrigger 和 killTriggers 放到您的任何 .inc 文件中,并在您的代码中使用它。
和此代码的结果
^global="test"
^global("ind")="test"
^global("ind",123)="test"
^logGlobal=6
^logGlobal(1)=$lb("SET","^global","test")
^logGlobal(2)=$lb("SET","^global(""ind"")","test")
^logGlobal(3)=$lb("SET","^global(""ind"",123)","test")
^logGlobal(4)=$lb("SET","testLocal","test")
^logGlobal(5)=$lb("kill","^global")
^logGlobal(6)=$lb("kill","testLocal")
UPDATE2: 阅读日志文件的示例。
#dim jrn As %SYS.Journal.File = ##class(%SYS.Journal.System).GetCurrentFile()
#dim rec As %SYS.Journal.Record = jrn.FirstRecord
while $isobject(rec) {
set addr=rec.Address
if rec.%IsA("%SYS.Journal.SetKillRecord") {
set glo=rec.GlobalNode
set db=rec.DatabaseName
set type=rec.TypeName
if type="SET" {
write "set ",glo,"=",rec.NewValue,!
} elseif type="KILL" {
write "kill ",glo,!
}
}
set rec=rec.Next
}
q
于 2014-06-30T15:18:11.457 回答
1
如果您在谈论设置或杀死全局时的“触发”样式代码执行,那是不可能的。您应该使用对象、SQL 或您自己的框架来处理此类情况。
于 2014-07-01T02:42:42.927 回答