计算公式

计算公式可以实现复杂的数据加工处理,例如拼接或截取文字、计算日期,根据不同的逻辑条件做不同的处理。RB 中有多个功能涉及计算公式的使用,包括 字段更新数据校验 等,它们的编写方式一致,但请注意不同功能对于公式返回值的要求。

计算公式要求你具备一定的编程基础,否则可能无法顺利进行

基础

计算公式底层使用 Aviator 脚本语言实现,因此你可以编写任何符合 Aviator 语法的代码来实现业务需求。在开始使用前我们强烈建议你首先阅读 Aviator 文档,了解基本写法,尤其是 函数库列表 章节,高阶使用还会涉及 if 条件for 循环 等。

基本写法

先看一个简单的例子,以下计算公式取字段订单日期 orderDate,并加 10(天)后返回。

## 这是注释
{orderDate} + 10

再看一个稍微复杂点的例子,以下计算公式取出字段订单日期 orderDate,如果订单日期为空则使用当前日期,然后加 10(天)后返回。

## 在本例中,由于是多行公式,所以需要使用 `;` `return` 完整语法,如是单行脚本则可以忽略
let date = {orderDate};
if (ISNULL(date)) {
  date = CURRENTDATE();
}
return date + 10;

对于有一定编程基础的用户,相信对上述计算公式并不会感到陌生。我们用到了逻辑判断 if 条件,以及 ISNULL CURRENTDATE 函数(详见下文),接下来让我们继续学习。

字段变量

在计算公式中,可以使用字段变量获取字段值,字段变量通过 {} 包裹,在公式执行时系统会将其替换为实际的字段值。例如下面的公式用于计算订单的到期时间。

## 获取订单日期,并调用 DATEADD 函数加 1 年后返回
let date = {orderDate};
return DATEADD(date, 1, 'Y');

字段变量值说明

为保持最大兼容性,系统对字段变量值进行了一些处理。在编写公式前请务必阅读以下说明:

  • 数字(小数、整数)、布尔字段会保持值类型,其他字段变量值均处理为字符串(包括日期等)
  • 若字段变量值为空,对于数字(小数、整数)字段将处理为数字 0,对于非数字字段将处理为空字符串 ''。因此对于字段值的空值判断应为 if {ziduan} == ''if {ziduan} == 0,而非 if {ziduan} == nil。我们推荐你使用 ISNULL 函数判断空值较为方便
  • 多选型字段(标签、多选)会处理为文本值(多值使用 , 分隔,如 AAA, BBB
  • 引用型字段(下拉列表、分类、引用、任意引用)会处理为 ID(20 位 Hash 字符串),如需获取文本值可使用 TEXT 函数进行转换
  • 多引用字段较为特殊
    • 如果目标字段也是多引用,则输出为 ID 字符串(, 分隔),
    • 否则输出为名称字段文本(, 分隔),如果你想保持为 ID 可以通过点连接主键字段如 {duoyinyong.AccountId}

引用字段点连接

对于引用字段可以使用 点连接 以便获取引用记录的数据。在计算公式中,多引用字段也支持点连接(用法与引用字段相同),需要注意的,多引用字段返回的是一个数组,获取之后通常配合 for 循环 使用。

多引用字段点连接仅在 字段更新 触发器中可用

使用函数

在以下函数语法中,$XXX 表示参数(可以是字段变量或是具体值),如果使用 [] 包裹则表示该参数为可选。同时注意函数名区分大小写、字段请使用 {} 包裹、字符(串)使用引号包裹、数字无需包裹。

你可以将函数结果随意更新到一个文本字段,以便观察执行效果

可用函数

函数 说明
TEXT 转换 ID(字段)值为文本
ID 转换文本(字段)值为 ID
ISNULL 判断是否为空值
IFNULL 给定值为空则返回默认值
CURRENTUSER 获取当前登录用户(ID)
CURRENTBIZUNIT 获取当前登录用户的所在部门(ID)
CURRENTDATE 获取当前日期
CHINESEYUAN 转换数字(字段)为人民币大写
HANLPPINY 转换中文为拼音(全拼或首字母)
CONCATID 连接多个 ID(字段)为 ID 数组。用于将多个引用字段连接为一个多引用字段返回
CONCATARRAY 连接多个(字段)为数组。虽然此函数接受任何参数,但更常用于将多个媒体类字段(图片、附件、头像)连接为一个附件字段返回,也可以将多个字段连接后(成为集合)进行更多逻辑处理
SQLQUERY 执行 SQL 查询,返回一个字段值
LOCATIONDISTANCE 计算两个位置(字段)的直线距离(米)
REQUEST 请求给定 URL 以获取结果
TOSTR 转换任何对象为字符串
TODATE 转换常用日期格式字符为日期对象
DATEPICKAT 转换常用日期格式字符为日期对象
REPORT 导出报表
ZIP 将(多个)文件打包为一个压缩文件
PDFMERGE 将(多个)PDF 文件合并为一个 PDF
AIASK 向 AI 提问,AI 返回结果

使用说明

TEXT
  • 作用:转换 ID(字段)值为文本。其中 ID 可以是 引用多引用任意引用(V4.1)、下拉列表分类 字段(值)
  • 语法:TEXT($ID, [$DEFAULT])
    • $ID 表示 ID,可以是 ID 字段,也可以是具体的 ID 值,例如 837-018c2f7fa58e03f8
    • $DEFAULT 当无法找到文本时使用的默认值(可选)
  • 示例:TEXT({id}) TEXT({id}, '没有值')
ID
  • 作用:转换文本(字段)值为 ID。其中文本可以是业务实体的 自动编号名称字段(值),如匹配到多个仅返回第一个
  • 语法:ID($TEXT, $ENTITY)
    • $TEXT 表示文本,可以是文本字段,也可以是具体的文本值,例如 锐昉科技
    • $ENTITY 实体内部标识,表示在哪个实体中查找
  • 示例:ID({no}, 'SalesOrder')
ISNULL
  • 作用:判断是否为空值(适用所有类型的字段)
  • 语法:ISNULL($VALUE)
    • $VALUE 要判断的值,可以是字段,也可以是具体的值
  • 示例:ISNULL({ziduan1}) ISNULL(0)
IFNULL ~~v4.4
  • 作用:给定值为空则返回默认值
  • 语法:IFNULL($VALUE, $DEFAULT)
    • $VALUE 要判断的值,可以是字段,也可以是具体的值
    • $DEFAULT 为空时返回的默认值
  • 示例:IFNULL({ziduan1}, '我是默认')
CURRENTUSER
  • 作用:获取当前登录用户(ID)
  • 语法:CURRENTUSER()
  • 示例:CURRENTUSER()
CURRENTBIZUNIT
  • 作用:获取当前登录用户的所在部门(ID)
  • 语法:CURRENTBIZUNIT()
  • 示例:CURRENTBIZUNIT()
CURRENTDATE
  • 作用:获取当前日期(时间)
  • 语法:CURRENTDATE()
  • 示例:CURRENTDATE()
CHINESEYUAN
  • 作用:转换数字(字段)为人民币大写
  • 语法:CHINESEYUAN($NUMBER)
    • $NUMBER 数字,可以是数字字段,也可以是具体的数字值,例如 9800
  • 示例:CHINESEYUAN({jine}) CHINESEYUAN(123)
HANLPPINY ~~v3.9
  • 作用:转换中文为拼音(全拼或首字母)
  • 语法:HANLPPINY($STR, [$FIRST_CHAR])
    • $STR 中文字符,可以是字段或具体值,例如 锐昉科技
    • $FIRST_CHAR 指定为 true 表示返回首字母,否则返回全拼
  • 示例:HANLPPINY({kehuName}) HANLPPINY('锐昉科技')
CONCATID ~~v3.9
  • 作用:连接多个 ID(字段)为 ID 数组。常用于将多个引用字段连接为一个 多引用 字段返回
  • 语法:CONCATID($ID1, $ID2, [$ID3, $ID4, $ID5])
    • $ID1 ID 字段,可以是引用/多引用字段,也可以是具体的 ID 值,例如 999-0000000000000001
    • $ID2 $ID3 $ID4 $ID5 同上
  • 示例:CONCATID({kehu1}, {kehu2})
CONCATARRAY ~~v3.9
  • 作用:连接多个(字段)为数组。虽然此函数接受任何参数,但更常用于将多个媒体类字段(如图片、附件)连接为一个 附件 字段返回,也可以将多个字段连接后进行更多逻辑处理。
  • 语法:CONCATARRAY($OBJ1, $OBJ2, [$OBJ3, $OBJ4, $OBJ5])
    • $OBJ1 任意字段或具体值
    • $OBJ2 $OBJ3 $OBJ4 $OBJ5 同上
  • 示例:CONCATARRAY({img1}, {file2})
SQLQUERY ~~v3.9
  • 作用:执行 SQL 查询,返回一个字段值。

  • 语法:SQLQUERY($SQL, [$PARAM1, $PARAM2, $PARAM3, $PARAM4, $PARAM5])

    • $SQL SQL 语句。请注意此语句非原生 SQL,可参考 AJQL
    • $PARAM1 $PARAM2 $PARAM3 $PARAM4 PARAM5 查询参数
  • 示例:SQLQUERY("select fieldName from EntityName where fieldName2 = 'value' and fieldName3 = ?", {fieldName4})

  • SQL 语句示例

    • fieldName from EntityName where fieldName2 = 'value' 其中 select 关键词不是必须的
    • fieldName1, fieldName2 from EntityName where fieldName2 = 'value' 注意 fieldName2 不会返回,因为仅支持查询一个字段,如需多个请使用 seqs 查询
    • fieldName1 from EntityName where fieldName2 = 'value' order by fieldName2 desc 通过 order by 指定排序规则
    • seq fieldName1 from EntityName where fieldName2 = 'value' 通过 seq 关键词可以查询多条记录的值,会返回一个一维数组/集合
    • seqs fieldName1, fieldName2 from EntityName where fieldName2 = 'value' 通过 seqs 关键词可以查询多条记录的多个值,会返回一个二维数组/集合

    关于数组/集合的使用方法,请参见 Aviator 数组和集合 以及 循环语句 帮助文档

LOCATIONDISTANCE
  • 作用:计算两个 位置(字段)的直线距离(米)
  • 语法:LOCATIONDISTANCE($LOC1, $LOC2)
    • $LOC1 表示起始坐标,可以是位置字段,也可以是具体的坐标值,例如 123.1234567,321.12345678
    • $LOC2 表示结束坐标,可以是位置字段,也可以是具体的坐标值,例如 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}, '')

此外,RB 还内置了一个字符处理工具集 StringUtils 用于常用文字处理,例如将字母转换为全大写 StringUtils. upperCase($TEXT),关于此工具集所提供的方法请 参见文档

TOSTR ~~v4.2
  • 作用:转换任何对象为文本
  • 语法:TOSTR($OBJECT)
    • $OBJECT 任何对象
  • 示例:TOSTR(CURRENTDATE())
TODATE ~~v4.2
  • 作用:转换常用日期格式字符为日期对象
  • 语法:TODATE($STR)
    • $STR 常用日期格式,如 2020-01-012020/01/012020-01-01 00:00:002020-01-01 00:00:00
  • 示例:TODATE('2025-10-20')
DATEPICKAT
  • 作用:获取日期(时间)中的指定部分,得出新值(数字)
  • 语法: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")
REPORT ~~v4.3
  • 作用:导出报表
  • 语法:REPORT($ID, $REPORTID, [$FORCEPDF, $UPLOADPATH])
    • $ID 记录 ID(同时支持 ID 数组)
    • $REPORTID 报表模版 ID
    • $FORCEPDF 是否输出为 PDF(可选)
    • $UPLOADPATH 是否上传并返回路径(否则返回文件对象),返回的路径可以放入 附件 字段(可选)
  • 示例:REPORT({AccountId}, '032-019c221026970002')
  • 示例:REPORT({AccountId}, '032-019c221026970002', true)

在某报表的 [预览] 按钮上右键点击“复制链接”,链接后方的 ID 即为报表模版 ID,如 https://x.cn/admin/data/report-templates/preview?id=032-018e0cabba8b0001

ZIP ~~v4.3
  • 作用:打包压缩包
  • 语法:ZIP($FILENAME, $FILE1, [$FILE2, $FILE3, $FILE4, $FILE5])
    • $FILENAME 压缩包文件名称
    • $FILE1 $FILE2 $FILE3 $FILE4 $FILE5 要打包的文件,可以是媒体类字段(如图片、附件),或者是如通过 REPORT 导出的文件对象
  • 示例:ZIP('压缩包.zip', {WenJian1}, {WenJian2})
PDFMERGE ~~v4.3
  • 作用:将多个 PDF 文件合并为一个
  • 语法:PDFMERGE($FILENAME, $FILE1, [$FILE2, $FILE3, $FILE4, $FILE5])
    • $FILENAME PDF 文件名称
    • $FILE1 $FILE2 $FILE3 $FILE4 $FILE5 要合并的 PDF 文件,如果给定文件不是 PDF 则忽略
  • 示例:PDFMERGE('合并的.pdf', {Pdf1}, {Pdf2}, {Pdf3})
AIASK ~~v4.4
  • 作用:向 AI 提问,AI 返回结果
  • 语法:AIASK($USERCONTENT, [$FILE, $PROMPT])
    • $USERCONTENT 提问内容
    • $FILE 文件(可选)
    • $PROMPT 提示词(可选)
  • 示例:AIASK('帮我分析一下这个文件', {File1})
其他

系统还内置了一个字符处理工具集 StringUtils 用于常用文字处理,例如将字母转换为全大写 StringUtils. upperCase($TEXT),关于此工具集所提供的方法请 参见文档

? 上述部分函数仅商业版本可用,如若不可用会提示 Function not found: XXX 错误

示例

将两个字段值拼接
{ziduan1} + "和" + {ziduan2}
获取两个日期之间的的小时数
DATEDIFF({date1}, {date2}, "H")
计算订单天数
DATEDIFF({date}, CURRENTDATE())

更多示例参考 REBUILD 高级计算公式实战

常见问题

公式调试技巧

对于复杂公式,有时我们希望可以进行调试,但目前并无直接调试方法。这里提供一个技巧,即通过 throw 关键词抛出一个异常(系统会弹窗提示 throw 的内容),然后通过异常达到调试的效果。

let shuzu = SQLQUERY('seq ProductId from SalesOrderItem where SalesOrderId=?', {dingdan.SalesOrderId});
## 抛出异常,页面会弹出错误提示
throw '这是个数组吗:' + shuzu;

## 循环拼接成字符串
let s = '';
for id in shuzu {
  s = s + TEXT(id) + ' / ';
}
return s;

同时,你可以设定触发器的“附加过滤条件”限定触发器针对指定的记录生效,从而达到通过特定记录(例如一条测试数据)调试的目的。

该文档内容对你是否有帮助?没有
你也可以通过 社区群组 向我们反馈问题
更新时间 2026-05-25
目录