首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对特定的全局变量进行SET/KILL操作时,如何调用COS?

对特定的全局变量进行SET/KILL操作时,如何调用COS?
EN

Stack Overflow用户
提问于 2014-06-30 22:29:45
回答 2查看 415关注 0票数 1

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

EN

回答 2

Stack Overflow用户

发布于 2014-06-30 23:18:11

我不确定你的意思,但我想你不知道如何在SET和KILL命令中使用全局变量。嗯,有很多变体可以做到这一点,如果你还不了解documentation,你必须阅读它。

代码示例:

代码语言:javascript
复制
set ^MyGlobal="testval" 
kill ^MyGlobal

更新:

正如你所说的“触发器”用来改变你的全局变量,你可以使用macro definitions

代码语言:javascript
复制
#; 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文件中,并在代码中使用它们。

并返回此代码的结果

代码语言:javascript
复制
^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:读取日志文件的示例。

代码语言:javascript
复制
#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
票数 3
EN

Stack Overflow用户

发布于 2014-07-01 10:42:43

如果你谈论的是“触发器”风格的代码执行,当某些东西设置或杀死全局对象时,这是不可能的。您应该使用对象、SQL或您自己的框架来处理此类情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24492498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档