更新此列时更新其他列的值
Update value of other column on update of this column
我有疑问,如何在 Intersystems Cache 中执行触发器之类的操作。
情况:
例如我有 table X 属性(列)
值A,值B
我想在 valueA 被 UPDATE 更改时更新 valueB。我已经定义了全局变量 ^VALUEBGENER 并使用它递增 $SEQ 函数,
我的想法是:
Class User.X Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = X]
{
Property VALUEA As %Library.String(MAXLEN = 8) [ Required,SqlColumnumber = 1];
Property VALUEB As %Library.Integer(MAXVAL = 2147483647, MINVAL = -2147483648) [ Required,SqlColumnNumber = 1,SqlComputed,SqlColumnumber = 2, SqlComputeCode = {SET {valueB}=$SEQ(^VALUEBGENER)}, SqlComputeOnChange = %%UPDATE];
}
但是当我更改 valuea 时它不起作用但是当我更改 valueb 时它起作用所以,知道吗?
P.S。对不起英语不好
可以通过添加触发器来完成,而SqlCompute
Class User.X Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = X]
{
Property VALUEA As %Library.String(MAXLEN = 8) [ Required, SqlComputed,SqlColumnumber = 1];
Property VALUEB As %Library.Integer(MAXVAL = 2147483647, MINVAL = -2147483648) [ Required,InitialExpression=0,SqlColumnNumber = 2, SqlComputeCode = {SET {*}=$SEQ(^VALUEB)}, SqlComputeOnChange = %%UPDATE ];
Trigger[Event=Update]{
NEW valuebx
new rowid
set rowid={ID}
SET valuebx= 0
// {fieldname*C} evaluates to 1 if the field has been changed and 0
if({VALUEA*C}=1){
// we trigger sql computeCode and inc of global variable by update
//and it doesnt matter what is here in :valuebx
&sql(update x set valueb=:valuebx WHERE ROWID=:rowid)
}
}
}
我有疑问,如何在 Intersystems Cache 中执行触发器之类的操作。 情况: 例如我有 table X 属性(列) 值A,值B 我想在 valueA 被 UPDATE 更改时更新 valueB。我已经定义了全局变量 ^VALUEBGENER 并使用它递增 $SEQ 函数, 我的想法是:
Class User.X Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = X]
{
Property VALUEA As %Library.String(MAXLEN = 8) [ Required,SqlColumnumber = 1];
Property VALUEB As %Library.Integer(MAXVAL = 2147483647, MINVAL = -2147483648) [ Required,SqlColumnNumber = 1,SqlComputed,SqlColumnumber = 2, SqlComputeCode = {SET {valueB}=$SEQ(^VALUEBGENER)}, SqlComputeOnChange = %%UPDATE];
}
但是当我更改 valuea 时它不起作用但是当我更改 valueb 时它起作用所以,知道吗? P.S。对不起英语不好
可以通过添加触发器来完成,而SqlCompute
Class User.X Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = X]
{
Property VALUEA As %Library.String(MAXLEN = 8) [ Required, SqlComputed,SqlColumnumber = 1];
Property VALUEB As %Library.Integer(MAXVAL = 2147483647, MINVAL = -2147483648) [ Required,InitialExpression=0,SqlColumnNumber = 2, SqlComputeCode = {SET {*}=$SEQ(^VALUEB)}, SqlComputeOnChange = %%UPDATE ];
Trigger[Event=Update]{
NEW valuebx
new rowid
set rowid={ID}
SET valuebx= 0
// {fieldname*C} evaluates to 1 if the field has been changed and 0
if({VALUEA*C}=1){
// we trigger sql computeCode and inc of global variable by update
//and it doesnt matter what is here in :valuebx
&sql(update x set valueb=:valuebx WHERE ROWID=:rowid)
}
}
}