字段更新一般应用在 1 > 1
关系中,例如根据订单总金额、已付金额计算出未付金额。同时也支持 1 > N
关系(此关系下的目标实体会显示 (N)
标识),例如多个订单会引用同一个客户,可以通过此触发器在客户更新时同步更新其下所有订单的(字段)值。
字段更新支持(从源实体字段)字段赋值,或使用固定值、计算公式等更新方式,且对所有字段(类型)均提供支持。
更新哪个实体(记录)。源实体与目标实体通过 引用字段 关联,只有存在关联关系的实体才能被选择。
根据业务需要设置“更新方式”、“源字段”(或“计算公式”),系统会将结果自动填写到“目标字段”中。设置完成后点击 [添加],一个触发器可添加多个更新规则。
将“目标字段”设置无只读模式,用户不能填写。
如果目标实体启用了 审批流程,目标记录可能处于审批只读状态,如不启用此选项可能无法完成更新且不会提示错误。
默认情况下源字段为空时(或源记录被删除时)系统会忽略执行更新,这将导致先前更新的值无法还原到空,启用此选项可避免此问题出现,您可根据需要启用此选项。
计算公式可以实现复杂的字段值计算,甚至支持各种逻辑判断来计算字段值,但同时其也有一定的使用门槛。
公式编辑器仅支持数字、日期类型字段,如果是其他类型的字段,会自动切换到“高级计算公式”编辑器。请注意计算公式所返回的结果需要与“目标字段”类型匹配,例如目标字段为数字,否则可能导致触发器执行失败。
系统提供了多个针对日期处理的函数,使用函数时请注意保证其语法正确性。
DATEDIFF($DATE1, $DATE2, [H|D|M|Y])
$DATE1
与 $DATE2
表示日期,可以是日期字段,也可以是具体的日期值,如 2021-01-01
[H|D|M|Y|I]
表示差值单位(可选,默认为 D
)。H
表示小时,D
表示天,M
表示月,Y
表示年,I
表示分钟DATEDIFF({riqi1}, {riqi2})
DATEDIFF({riqi1}, {riqi2}, "M")
DATEADD($DATE, $NUMBER, [H|D|M|Y])
$DATE
表示日期,可以是日期字段,也可以是具体的日期值,如 2021-01-01
$NUMBER
表示数字,可以是数字字段,也可以是具体的数字值,如 30
[H|D|M|Y|I]
表示数字单位(可选,默认为 D
)。H
表示小时,D
表示天,M
表示月,Y
表示年,I
表示分钟DATEADD({riqi1}, {shuzi2}, "D")
DATEADD({riqi1}, 5, "D")
DATESUB($DATE, $NUMBER, [H|D|M|Y])
$DATE
表示日期,可以是日期字段,也可以是具体的日期值,如 2021-01-01
$NUMBER
表示数字,可以是数字字段,也可以是具体的数字值,如 30
[H|D|M|Y|I]
表示数字单位(可选,默认为 D
)。H
表示小时,D
表示天,M
表示月,Y
表示年,I
表示分钟DATESUB({riqi1}, {shuzi2}, "D")
DATESUB({riqi1}, 5, "M")
DATEPICKAT($DATE, [Y|Q|M|D|H|I])
$DATE
表示日期,可以是日期字段,也可以是具体的日期值,如 2021-01-01
[Y|Q|M|D|H|I]
表示获取单位(可选,默认为 D
)。Y
表示年,Q
表示季度,M
表示月,D
表示日,H
表示小时,M
表示分钟,I
表示分钟DATEPICKAT({riqi1})
DATEPICKAT({riqi1}, "Q")
高级计算公式要求您具备一定的编程基础,否则可能无法顺利进行
计算公式底层使用 Aviator 实现,因此您可以编写任何符合 Aviator Script 语法的代码来实现业务需求(上节中介绍的内置函数也可在高级计算公式中使用)。在开始使用高级计算公式前我们强烈建议您阅读 Aviator 文档,尤其是 函数库列表 章节。
同公式编辑器一样,高级计算公式中的字段变量也需要通过 {}
包裹,在公式执行时系统会自动替换实际的字段值。
TEXT($ID, [$DEFAULT])
TEXT({id})
TEXT({id}, '没有值')
ID($TEXT, $ENTITY)
ID({no}, 'SalesOrder')
CURRENTUSER()
CURRENTUSER()
CURRENTBIZUNIT()
CURRENTBIZUNIT()
CURRENTDATE()
CURRENTDATE()
CHINESEYUAN($NUMBER)
CHINESEYUAN({jine})
CHINESEYUAN(123)
LOCATIONDISTANCE($LOC1, $LOC2)
LOCATIONDISTANCE({qiyundi}, {mudidi})
LOCATIONDISTANCE({qiyundi}, {mudidi}) / 1000
REQUEST($URL, [$DEFAULT])
REQUEST('http://xx/api/x?id=' + {id}, '')
ISNULL($VALUE)
ISNULL({ziduan1})
ISNULL(0)
此外 RB 还内置了一个字符处理工具集 StringUtils
用于常用文字处理,例如将字母转换为全大写 StringUtils. upperCase($TEXT)
,关于此工具集所提供的方法请 参见文档。
请注意函数名区分大小写。字段请使用
{}
包裹,字符(串)使用引号包裹,数字无需包裹
上述部分函数仅商业版可用
为保持最大兼容性,系统对字段变量值进行了一些处理。如您在表达式中使用了逻辑判断,请务必阅读以下说明:
0
,对于非数字字段将处理为空字符串 ''
。因此对于字段值的空值判断应为 if {ziduan} == ''
或 if {ziduan} == 0
,而非 if {ziduan} == nil
。推荐使用 ISNULL 函数判断空值ID
(20 位字符串),如需获取文本可使用 TEXT 函数。公式计算出的值需要符合字段在数据库中定义的存储类型,系统不会对值类型进行转换,需您自行处理。在编写高级表达式前,您应清楚并理解各类型字段值的含义。
ID
注意下列示例中使用
{}
包裹的均为字段内部标识
{ziduan1} + "和" + {ziduan2}
{juli} / 1000
注意上述运算公式中若
{juli}
为整数字段,其结果也为整数,如需小数请至少保证运算中的一个数字为小数,例如{juli} / 1000.0
或{juli} * 1.0 / 1000
等
DATEDIFF({date1}, {date2}, "H")
DATEDIFF({date}, CURRENTDATE())
系统会自动判定触发器执行内容是否会对目标实体记录产生影响,如执行内容结果与目标实体一致,系统可能会跳过执行。因此,当我们修改了无需参与执行内容计算的字段时,触发器并不会产生实际执行,以此提高执行效率。同时注意,如果跳过执行其可能存在的 级联执行 也不会被执行。
遵循一个基本原则,要更新的数据从哪里(哪个实体)中来,就选择哪个实体作为源实体。