字段更新是 RB 较为常用且最强大的触发器之一,其应用场景可简单描述为通过 A
字段值更新 B
字段值、或通过 A
B
C
... 字段值更新 D
字段值。例如,可根据订单总金额、已付金额计算未付金额;再例如,多个订单会引用同一个客户,可以通过此触发器在客户更新时同步更新其下所有订单的(字段)值。
字段更新支持(从源实体字段)字段赋值,或使用固定值、计算公式等丰富的更新方式。
更新哪个实体(记录)。源实体与目标实体通过 引用字段 关联,只有存在关联关系的实体才能被选择。
带有
(N)
标识的表示会影响到多条记录。例如订单中“购买客户”字段引用客户(即1客户:N订单
),因此在以客户为源实体时会更新多条订单(若有)。
如果源实体与目标实体之间没有关联关系,可以“通过字段匹配”。例如实体 A 中有物料编号、供应商编号,实体 B 中也有物料编号、供应商编号,即使实体 A、B 之间没有引用字段关联,B 也可以作为目标实体使用。
其关联逻辑为:A 实体(记录)触发时,会通过自身的物料编号、供应商编号到 B 实体中查找一样的记录进行更新处理(如找到多条则会更新多条)。
根据业务需要设置“更新方式”、“源字段”(或 计算公式),系统会将结果自动填写到“目标字段”中。设置完成后点击 [添加],一个触发器可添加多个更新规则。
将“目标字段”设置无只读模式(即用户不能填写)。
如果目标实体启用了 审批流程,目标记录可能处于审批只读状态,如不启用此选项可能无法完成更新且不会提示错误。
默认情况下源字段为空时(或源记录被删除时)系统会忽略执行更新,这将导致先前更新的值无法还原到空,启用此选项可避免此问题出现,您可根据需要启用此选项。
禁用 级联执行。如您无法确定是否需要禁用,请不要禁用。
计算公式可以实现复杂的字段值计算,甚至支持各种逻辑判断来计算字段值。
公式编辑器仅支持数字、日期类型字段,如果是其他类型的字段,会自动切换到“高级计算公式”编辑器。请注意计算公式所返回的结果需要与“目标字段”类型匹配,例如目标字段为数字则计算结果也应为数字,否则可能导致触发器执行失败。
系统提供了多个针对日期处理的函数,使用函数时请注意保证其语法正确性。
DATEDIFF($DATE1, $DATE2, [H|D|M|Y|I])
$DATE1
与 $DATE2
表示日期,可以是日期字段,也可以是具体的日期值,如 2021-01-01
[H|D|M|Y|I]
表示差值单位(可选,默认为 D
)。H
表示小时,D
表示天,M
表示月,Y
表示年,I
表示分钟DATEDIFF({riqi1}, {riqi2})
DATEDIFF({riqi1}, {riqi2}, "M")
自 V3.6 支持简易写法,如
$DATE1 - $DATE2
得出差值(天数)。或直接通过大于、小于比较两个日期得到布尔值用于if
判断,如$DATE1 > $DATE2
$DATE1 < $DATE2
DATEADD($DATE, $NUMBER, [H|D|M|Y|I])
$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")
自 V3.6 支持简易写法,如
$DATE + $NUMBER
得出新日期(加天数)
DATESUB($DATE, $NUMBER, [H|D|M|Y|I])
$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")
自 V3.6 支持简易写法,如
$DATE - $NUMBER
得出新日期(减天数)
DATEPICKAT($DATE, [Y|Q|M|D|H|I|W])
$DATE
表示日期,可以是日期字段,也可以是具体的日期值,如 2021-01-01
2023-01-01 10:01:02
[Y|Q|M|D|H|I]
表示获取单位(可选,默认为 D
)。Y
表示年,Q
表示季度,M
表示月,D
表示日,H
表示小时,I
表示分钟,W
表示周几(V3.6)DATEPICKAT({riqi1})
DATEPICKAT({riqi1}, "Q")
高级计算公式要求您具备一定的编程基础,否则可能无法顺利进行
计算公式底层使用 Aviator 实现,因此您可以编写任何符合 Aviator Script 语法的代码来实现业务需求(上节中介绍的日期函数也可在高级计算公式中使用)。在开始使用高级计算公式前我们强烈建议您阅读 Aviator 文档,尤其是 函数库列表 章节,高阶使用还会涉及 if 条件、for 循环 等。
同公式编辑器一样,高级计算公式中的字段变量也需要通过 {}
包裹,在公式执行时系统会自动替换实际的字段值。
TEXT($ID, [$DEFAULT])
$ID
表示 ID,可以是 ID 字段,也可以是具体的 ID 值,例如 837-018c2f7fa58e03f8
$DEFAULT
当无法找到文本时使用的默认值(可选)TEXT({id})
TEXT({id}, '没有值')
ID($TEXT, $ENTITY)
$TEXT
表示文本,可以是文本字段,也可以是具体的文本值,例如 锐昉科技
$ENTITY
实体内部标识,表示在哪个实体中查找ID({no}, 'SalesOrder')
CURRENTUSER()
CURRENTUSER()
CURRENTBIZUNIT()
CURRENTBIZUNIT()
CURRENTDATE()
CURRENTDATE()
CHINESEYUAN($NUMBER)
$NUMBER
数字,可以是数字字段,也可以是具体的数字值,例如 9800
CHINESEYUAN({jine})
CHINESEYUAN(123)
LOCATIONDISTANCE($LOC1, $LOC2)
$LOC1
表示起始坐标,可以是位置字段,也可以是具体的坐标值,例如 123.1234567,321.12345678
$LOC1
表示结束坐标,可以是位置字段,也可以是具体的坐标值,例如 123.1234567,321.12345678
LOCATIONDISTANCE({qiyundi}, {mudidi})
LOCATIONDISTANCE({qiyundi}, {mudidi}) / 1000
REQUEST($URL, [$DEFAULT])
$URL
有效的请求地址,系统将从该地址获取结果$DEFAULT
当无法获取结果时使用的默认值(可选)REQUEST('http://xx/api/x?id=' + {id}, '')
ISNULL($VALUE)
$VALUE
要判断的值,可以是字段,也可以是具体的值ISNULL({ziduan1})
ISNULL(0)
此外 RB 还内置了一个字符处理工具集 StringUtils
用于常用文字处理,例如将字母转换为全大写 StringUtils. upperCase($TEXT)
,关于此工具集所提供的方法请 参见文档。
上述部分函数仅商业版可用;请注意函数名区分大小写;字段请使用
{}
包裹,字符(串)使用引号包裹,数字无需包裹
为保持最大兼容性,系统对字段变量值进行了一些处理。在编写公式前请务必阅读以下说明:
0
,对于非数字字段将处理为空字符串 ''
。因此对于字段值的空值判断应为 if {ziduan} == ''
或 if {ziduan} == 0
,而非 if {ziduan} == nil
。我们推荐您使用 ISNULL 函数判断空值较为方便ID
(20 位 Hash 字符串),如需获取文本可使用 TEXT 函数进行转换。,
分隔,如 AAA, BBB
)ID
字符串(,
分隔),否则输出为文本(,
分隔)公式计算出的值需要符合字段在数据库中定义的存储类型,系统不会对值类型进行转换,需您自行处理。在编写高级表达式前,您应清楚并理解各类型字段值的含义。
ID
(20 位 Hash 字符串)ID
数组JSON
数组(如 ['rb/aaa','rb/bbb']
)! 请确保返回值正确,否则可能导致系统出现错误,请谨慎进行
对于分类、下拉列表、多选字段,您可以通过 OpenAPI 获取其对应返回值(ID 或数字)
注意下列示例中使用
{}
包裹的均为字段内部标识
{ziduan1} + "和" + {ziduan2}
DATEDIFF({date1}, {date2}, "H")
DATEDIFF({date}, CURRENTDATE())
源实体:数据从哪里来;目标实体:到哪里去。
不支持,触发器仅在保存时由后台进行计算。若您需要实时计算,可以考虑使用表单计算公式(或配合使用),目前 小数、日期、日期时间 均支持表单计算公式。