当SET或KILL应用于特定的全局变量时,如何调用缓存ObjectScript例程?
发布于 2014-06-30 23:18:11
我不确定你的意思,但我想你不知道如何在SET和KILL命令中使用全局变量。嗯,有很多变体可以做到这一点,如果你还不了解documentation,你必须阅读它。
代码示例:
set ^MyGlobal="testval"
kill ^MyGlobal更新:
正如你所说的“触发器”用来改变你的全局变量,你可以使用macro definitions。
#; 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-07-01 10:42:43
如果你谈论的是“触发器”风格的代码执行,当某些东西设置或杀死全局对象时,这是不可能的。您应该使用对象、SQL或您自己的框架来处理此类情况。
https://stackoverflow.com/questions/24492498
复制相似问题