当SET / KILL应用于特定的全局变量时,如何调用COS?

时间:2014-06-30 14:29:45

标签: intersystems-cache mumps

如何在将SET或KILL应用于特定全局变量时调用Cache ObjectScript例程吗?

2 个答案:

答案 0 :(得分:3)

我不确定你的意思,但我想你不知道如何在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

答案 1 :(得分:1)

如果你在谈论&#34;触发&#34;当某些东西设置或杀死全局时,样式代码执行,这是不可能的。您应该使用Objects,SQL或您自己的框架来处理这种情况。