1

当 SET 或 KILL 应用于特定的全局变量时,如何调用 Cache ObjectScript 例程?

4

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