字段更新

字段更新一般应用在 1 > 1 关系中,例如根据订单总金额、已付金额计算出未付金额。同时也支持 1 > N 关系(此关系下的目标实体会显示 (N) 标识),例如多个订单会引用同一个客户,可以通过此触发器在客户更新时同步更新其下所有订单的(字段)值。

字段更新支持(从源实体字段)字段赋值,或使用固定值、计算公式等更新方式,且对所有字段(类型)均提供支持。

配置触发器

1. 目标实体

更新哪个实体(记录)。源实体与目标实体通过 引用字段 关联,只有存在关联关系的实体才能被选择。

2. 更新规则

根据业务需要设置“更新方式”、“源字段”(或“计算公式”),系统会将结果自动填写到“目标字段”中。设置完成后点击 [添加],一个触发器可添加多个更新规则。

3. 自动设置目标字段为只读

将“目标字段”设置无只读模式,用户不能填写。

4. 允许强制更新

如果目标实体启用了 审批流程,目标记录可能处于审批只读状态,如不启用此选项可能无法完成更新且不会提示错误。

5. 源字段为空时置空目标字段 ~~v3.3

默认情况下源字段为空时(或源记录被删除时)系统会忽略执行更新,这将导致先前更新的值无法还原到空,启用此选项可避免此问题出现,您可根据需要启用此选项。

计算公式

计算公式可以实现复杂的字段值计算,甚至支持各种逻辑判断来计算字段值,但同时其也有一定的使用门槛。

公式编辑器

  1. 在“更新方式”中选择“计算公式”
  2. 点击“计算公式”打开公式编辑器
  3. 点击可切换为 高级计算公式 模式
  4. 详见下文 使用日期函数

公式编辑器仅支持数字、日期类型字段,如果是其他类型的字段,会自动切换到“高级计算公式”编辑器。请注意计算公式所返回的结果需要与“目标字段”类型匹配,例如目标字段为数字,否则可能导致触发器执行失败。

使用日期函数

系统提供了多个针对日期处理的函数,使用函数时请注意保证其语法正确性。

DATEDIFF
  • 作用:比较两个日期(时间),得出差值(数字类型)
  • 语法: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")

自 V3.6 支持简易写法,如 $DATE1 - $DATE2 得出差值(天数)

DATEADD
  • 作用:将日期(时间)加,得出新日期
  • 语法: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")

自 V3.6 支持简易写法,如 $DATE + $NUMBER 得出(加天数)新日期

DATESUB
  • 作用:将日期(时间)减,得出新值日期
  • 语法: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")

自 V3.6 支持简易写法,如 $DATE - $NUMBER 得出(减天数)新日期

DATEPICKAT ~~v3.5
  • 作用:获取日期(时间)中的指定部分,得出新值(数字)
  • 语法:DATEPICKAT($DATE, [Y|Q|M|D|H|I])
    • $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(字段)值为文本。其中 ID 可以是 引用多引用(V3.6)、下拉列表分类 字段(值)
  • 语法:TEXT($ID, [$DEFAULT])
    • $ID 表示 ID,可以是 ID 字段,也可以是具体的 ID 值,例如 837-018c2f7fa58e03f8
    • $DEFAULT 当无法找到文本时使用的默认值(可选)
  • 示例:TEXT({id}) TEXT({id}, '没有值')
ID
  • 作用:转换文本(字段)值为 ID。其中文本可以是业务实体的 自动编号名称字段(值),如匹配到多个仅返回第一个
  • 语法:ID($TEXT, $ENTITY)
    • $TEXT 表示文本,可以是文本字段,也可以是具体的文本值,例如 锐昉科技
    • $ENTITY 实体内部标识,表示在哪个实体中查找
  • 示例:ID({no}, 'SalesOrder')
CURRENTUSER
  • 作用:获取当前登录用户(ID)
  • 语法:CURRENTUSER()
  • 示例:CURRENTUSER()
CURRENTBIZUNIT
  • 作用:获取当前登录用户的所在部门(ID)
  • 语法:CURRENTBIZUNIT()
  • 示例:CURRENTBIZUNIT()
CURRENTDATE
  • 作用:获取当前日期时间
  • 语法:CURRENTDATE()
  • 示例:CURRENTDATE()
CHINESEYUAN
  • 作用:转换数字(字段)为中文大写形式
  • 语法:CHINESEYUAN($NUMBER)
    • $NUMBER 数字,可以是数字字段,也可以是具体的数字值,例如 9800
  • 示例:CHINESEYUAN({jine}) CHINESEYUAN(123)
LOCATIONDISTANCE
  • 作用:计算两个 位置(字段)的直线距离(米)
  • 语法:LOCATIONDISTANCE($LOC1, $LOC2)
    • $LOC1 表示起始坐标,可以是位置字段,也可以是具体的坐标值,例如 123.1234567,321.12345678
    • $LOC1 表示结束坐标,可以是位置字段,也可以是具体的坐标值,例如 123.1234567,321.12345678
  • 示例:LOCATIONDISTANCE({qiyundi}, {mudidi}) LOCATIONDISTANCE({qiyundi}, {mudidi}) / 1000
REQUEST
  • 作用:请求给定 URL 以获取结果
  • 语法:REQUEST($URL, [$DEFAULT])
    • $URL 有效的请求地址,系统将从该地址获取结果
    • $DEFAULT 当无法获取结果时使用的默认值(可选)
  • 示例:REQUEST('http://xx/api/x?id=' + {id}, '')
ISNULL ~~v3.5
  • 作用:判断是否为空值(适用所有类型的字段)
  • 语法: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(20 位 Hash 字符串)
  • 对于多选、状态类型的字段,数据库存储的是整数数字

示例

注意下列示例中使用 {} 包裹的均为字段内部标识

将两个字段值拼接(注意字段 ziduan1 和 ziduan2 均为文本类型,非文本请先转换)
{ziduan1} + "和" + {ziduan2}
米转换成公里(注意下列 juli 字段为数字类型,非数字请先转换)
{juli} / 1000

注意上述运算公式中若 {juli} 为整数字段,其结果也为整数,如需小数请至少保证运算中的一个数字为小数,例如 {juli} / 1000.0{juli} * 1.0 / 1000

获取两个日期之间的的小时数
DATEDIFF({date1}, {date2}, "H")
计算订单天数
DATEDIFF({date}, CURRENTDATE())

常见问题

如何选择合适的源实体?

遵循一个基本原则,要更新的数据从哪里(哪个实体)中来,就选择哪个实体作为源实体。

该文档内容对您是否有帮助?没有
如有任何疑问,请与我们的 社区QQ 群 联系
更新时间 4/22/2024, 4:28:56 PM
目录