公式

1、公式规则

1.1  简介

在设计对象时,有些场景下字段的取值需要通过公式来实现自动计算,例如根据单价和数量自动计算出金额、根据订单金额比例计算运费等,通过公式就可以实现类似这样的业务场景。

1.2  设置入口

目前支持编辑公式的字段类型为:文本、数值、金额、百分比、日期、时间、日期时间、自动编号、计算字段。
除了“计算字段”,这些字段的默认值均支持公式编辑,点“公式编辑”,在其下方会出现“计算公式”编辑区域,如下图:
“计算字段”直接显示“计算公式”编辑区域,如下图:

1.3  公式组成

公式通常由字段、函数和运算符组成,以如下公式为例:
ROUND(单价*数量,2)
  • 字段:公式计算的数据来源,在插入字段中点击选择,如示例公式中的「单价」、「数量」;
  • 函数:可以直接输入函数名称,或在函数列表中选择使用,如示例公式中的「ROUND」;
  • 运算符:“+、-、*、/”等数据运算符号,直接在公式编辑区手动输入,如示例公式中的「*」;

1.3.1 字段

字段支持从插入字段中选择,或直接录入或复制。
字段包括对应的表名及字段名,字段以蓝底白字进行标识,如下图:

1.3.2 函数

函数支持从插入函数中选择函数或直接录入。函数包括时间函数、逻辑函数、计算函数和文本函数。一个公式中可以嵌套多个函数。
注意:公式必须全部使用大写字母,否则无法识别

1.3.3 运算符

运算符支持从插入运算符中选择,也支持直接录入。
除了支持基本的运算操作符+、-、*、/,还支持比较操作符>、≥、==、<、≤、!=及() 

1.4  字段类型匹配

公式运用时要注意参数数据类型和返回值数据类型,一定要对应,否则无法获得正确的结果。
例如公式的返回值是一个字符串,则不能把这个公式写在日期字段或者数字字段中。
  • 表单字段与其返回值的数据类型的对应关系如下表所示:
控件返回数据类型
文本字符串
数值数值
金额数值
百分比数值
日期日期
时间时间
日期时间日期时间
自动编号字符串
计算字段数值
常见错误:
带引号的表示字符串,不带引号的表示日期类型/数值类型的字段
例如:'2022-08-08' 为字符串。如果需要跟日期类型的字段做比较,则需要将字符串转换为日期 DATEVALUE('2022-08-08')。

1.5  常见问题

1、为什么“公式编辑”按钮置灰?
只有订购了“aPaaS专业版”产品,公式编辑的权限才会开放,否则“公式编辑”按钮置灰。
2、语法校验提示“公式语法错误”可能存在原因:
字符串两边要用单引号(必须是半角)。例如:'请输入身份证!'
公式中存在多余的空格。例如:CASE( '星期六', '星期六', '休息日', '星期日', '休息日',   '工作日')

2、时间函数

函数名称使用示例
DATE  将年月日三个数值拼成一个日期值DATE(2013,5,21) 返回: 2013-05-21
DATESUBDATE  指定日期几天后的日期DATESUBDATE(2018-08-08,10) 返回: 2018-08-18
DATEDIF   指定两个日期间的天数、月数或年数DATEDIF(2011-2-28,2014-3-20,’Y’) 返回:3
DATETONUMBER  时间戳DATETONUMBER(2018-08-08) 返回:1218124800000
NOW 当前时间NOW()返回:2018-08-08 15:18:18
TODAY  当前日期TODAY()返回:2018-08-08
DAY 某个日期或日期时间的日期值DAY(2018-08-07) 返回:7
HOUR  时间/日期时间中的小时值HOUR(15:18:20) 返回:15
MINUTE  时间/日期时间中的分钟值MINUTE(15:18:20) 返回:18
SECOND  时间/日期时间中的秒数值SECOND(15:18:20) 返回:20
MONTH  日期/日期时间中的月份值MONTH(2018-08-07) 返回:8
YEAR 日期/日期时间中的年份值YEAR(2018-08-07) 返回:2018
WEEK 日期参数所代表一年中的第几周WEEK(2005-09-10) 返回:5
WEEKDAY  日期参数所在的星期数,0-6分别代表星期一-星期日WEEKDAY(2005-09-10) 返回:6
MONTHDELTA  指定日期几个月后的日期MONTHDELTA(2018-08-08,3) 返回: 2018-11-08
YEARDELTA  指定日期几年后的日期YEARDELTA(2018-08-08,3) 返回: 2021-08-08
DAYSOFYEAR  某年包含的天数DAYSOFYEAR(2008) 返回: 365
DATEVALUE 将日期字符串转换成日期DATEVALUE('2013-05-21') 返回: 2013-05-21
DATETIMEVALUE 将日期时间字符串转换成日期时间DATETIMEVALUE('2013-05-21 13:14:25') 返回: 2013-05-21 13:14:25
DATETIMETOTIME 将日期时间转换成时间DATETIMETOTIME(DATETIMEVALUE('2013-05-21 13:14:25')) 返回: 13:14:25
DATETIMETODATE  将日期时间转换成日期DATETIMETODATE(NOW()) 返回: 2013-05-21
DATEFORMAT 将日期时间转换成字符串DATEFORMAT(2018-08-07 15:18:02,’yyyyMMddHHmmss’) 返回:20180807151802

2.1 DATE

使用格式: DATE(year,month,day)
说明: 通过三个数值类型参数,返回一个指定日期
示例: DATE(2013,5,21) 返回: 2013-05-21

2.2 DATESUBDATE

使用格式: DATESUBDATE(date,deltadays)
说明: 返回date后deltadays天的日期,deltadays可为正数、负数、零
示例: DATESUBDATE(2018-08-08,10)  返回: 2018-08-18
DATESUBDATE(2018-08-08,-10)  返回: 2018-07-29

2.3 DATEDIF

使用格式: DATEDIF(start_date,end_date,unit)
说明: 返回指定两个日期间的天数、月数或年数。start_date:代表所指定时间段的初始日期,end_date:代表所指定时间段的终止日期。unit:函数返回信息的类型。 若unit=’Y/y’,则返回年差数; 若unit=’M/m’,则返回月差数;若unit=’D/d’,则返回日差数; 若unit=’MD/md’,则忽略年和月,返回日差数; 若unit=’YM/ym’,则忽略年和日,返回月差数;若unit=’YD/yd’,则忽略年,返回日差数。
示例:  DATEDIF(2011-2-28,2014-3-20,’Y’)  返回:3;
DATEDIF(2001-2-28,2004-3-20,’M’)  返回: 36;
DATEDIF(2020-1-1,2021-3-4,’YM’)  返回:2

2.4 DATETONUMBER

使用格式:DATETONUMBER(date)
说明:返回自1970年1月1日00:00:00 GMT 经过的毫秒数,即时间戳。
示例:DATETONUMBER(2018-08-08) 返回:1218124800000

2.5 NOW

使用格式:NOW()
说明:获取当前时间。
示例:如果系统当前时间是2018年8月8日15点18分18秒,NOW()返回:2018-08-08 15:18:18

2.6 TODAY

使用格式:TODAY()
说明:获取当前日期。
示例:如果系统当前时间是2018年8月8日,TODAY()返回:2018-08-08

2.7 DAY

使用格式:DAY(date)
说明:获取日期/日期时间中的日期值。
示例:DAY(2018-08-07)  返回:7;
DAY(2018-08-07 15:18:20)  返回:7

2.8 HOUR

使用格式:HOUR(date)
说明:获取时间/日期时间中的小时值。
示例:HOUR(15:18:20)  返回:15;
HOUR(2018-08-07 15:18:20)  返回:15

2.9 MINUTE

使用格式:MINUTE(date)
说明:获取时间/日期时间中的分钟值。
示例:MINUTE(15:18:20)  返回:18;
MINUTE(2018-08-07 15:18:20)  返回:18

2.10 SECOND

使用格式:MINUTE(date)
说明:获取时间/日期时间中的秒数值。
示例:SECOND(15:18:20)  返回:20;
SECOND(2018-08-07 15:18:20)  返回:20

2.11 MONTH

使用格式:MONTH(date)
说明:获取日期/日期时间中的月份值。
示例:MONTH(2018-08-07)  返回:8;
MONTH(2018-08-07 15:18:20)  返回:8

2.12 YEAR

使用格式:YEAR(date)
说明:获取日期/日期时间中的年份值。
示例:YEAR(2018-08-07)  返回:2018;
YEAR(2018-08-07 15:18:20)  返回:2018

2.13 WEEK

使用格式:WEEK(date)
说明:返回日期参数所代表一年中的第几周。
示例:WEEK(2005-09-10)  返回:5;

2.14 WEEKDAY

使用格式:WEEKDAY(date)
说明:返回日期参数所在的星期数,0-6分别代表星期一-星期日。
示例:WEEKDAY(2005-09-10)  返回:6;

2.15 MONTHDELTA

使用格式: MONTHDELTA(date,deltamonths)
说明: 返回date后deltamonths个月的日期,deltamonths可为正数、负数、零
示例: MONTHDELTA(2018-08-08,3)  返回: 2018-11-08
MONTHDELTA(2018-08-08,-3)  返回: 2018-05-08

2.16 YEARDELTA

使用格式: YEARDELTA(date,deltayears)
说明: 返回date后deltayears年的日期,deltayears可为正数、负数、零
示例: YEARDELTA(2018-08-08,3)  返回: 2021-08-08
YEARDELTA(2018-08-08,-3)  返回: 2015-08-08

2.17 DAYSOFYEAR

使用格式: DAYSOFYEAR(year)
说明: 返回某年包含的天数
示例: DAYSOFYEAR(2008)  返回: 365
DAYSOFYEAR(2018-08-08)  返回: 365

2.18 DATEVALUE

使用格式: DATEVALUE(string)
说明: 通过一个字符串类型的参数,创建一个日期类型的值
示例: DATEVALUE('2013-05-21') 返回: 2013-05-21

2.19 DATETIMEVALUE

使用格式: DATETIMEVALUE(string)
说明: 通过一个字符串类型参数,返回日期时间字段中的日期时间
示例: DATETIMEVALUE('2013-05-21 13:14:25') 返回: 2013-05-21 13:14:25

2.20 DATETIMETOTIME

使用格式: DATETIMETOTIME(date_time)
说明: 通过一个日期时间类型参数,返回日期时间字段中的时间
示例: DATETIMETOTIME(DATETIMEVALUE('2013-05-21 13:14:25')) 返回: 13:14:25

2.21 DATETIMETODATE

使用格式: DATETIMETODATE(date_time)
说明: 通过一个日期时间类型参数,返回日期时间字段中的日期
示例: DATETIMETODATE(DATETIMEVALUE('2013-05-21 13:14:25')) 返回: 2013-05-21

2.22 DATEFORMAT

使用格式:DATEFORMAT(date,format)
说明:将日期时间转变为字段串,format参数为字符串格式,支持yyyy/yy表示年份,MM表示月份,dd表示日,D表示当年的第几天,E表示星期几,HH表示小时(24进制),hh表示小时(12进制),mm表示分钟数,ss表示秒数
示例:DATEFORMAT(2018-08-07 15:18:02,’yyyyMMddHHmmss’) 返回:20180807151802
DATEFORMAT(2018-08-07 15:18:02,’yyyy年MM月dd日‘)  返回:2018年08月07日

3、逻辑函数

函数名称使用示例
AND  逻辑与。所有条件都满足时,返回TRUEAND(5>2,8>3,9>5) 返回: true
OR  逻辑或。只要其中一个条件满足,即返回TRUEOR(5<2,8<3,9>5) 返回: true
IF  条件判断。根据条件返回不同的值IF(30<67, 30, 67) 返回: 30
NOT  非运算。对判断结果进行反向NOT(9<4) 返回: true
ISNULL 判断是否为空ISNULL(6) 返回: false
CASE  根据满足不同的条件,返回满足条件的值CASE(星期, '星期六', '休息日', '星期日' ,'休息日', '工作日') 
CASE WHEN 根据多个分支条件CASE WHEN 成绩<60 THEN '不及格' WHEN 成绩≥60 AND 成绩<80 THEN '及格' WHEN 成绩≥80 AND 成绩<90 THEN '良好' ELSE '优秀' END

3.1 AND

使用格式: AND(boolean1,boolean2,boolean3,...)
说明: 逻辑与,当所有参数的值为真时,返回true;当任意参数的值为假时,返回false。
示例: AND(5>2,8>3,9>5) 返回: true
AND(1+7=8,5+7=17) 返回:false

3.2 OR

使用格式: OR(boolean1,boolean2,boolean3,...)
说明: 逻辑或,当任意参数的值为真时,返回true;当所有参数的值为假时,返回false。
示例: OR(5<2,8<3,9>5) 返回: true
 OR(5<2,8<3,9<5)  返回:false

3.3 IF

使用格式: IF(boolean, value_if_true, value_if_false)
说明: 判断条件是否为true,如果为true,则返回value_if_true,否则返回value_if_false;其中,value_if_true和value_if_false必须为同一数据类型。
示例: IF(30<67, 30, 67) 返回: 30

3.4 NOT

使用格式: NOT(boolean)
说明: 若条件为false,则结果为true,反之,结果为false
示例: NOT(9<4) 返回: true

3.5 ISNULL

使用格式: ISNULL(expression)
说明: 判断表达式结果是否为空,如果为空,返回true,反之为false
示例: ISNULL(6) 返回: false

3.6 CASE

使用格式: CASE(expression, value1, result1, value2, result2,...,else_result)
说明: 根据满足不同的条件,返回满足条件的值。其中expression的值与value(n)进行比较,value(x)与expression的值一致,则返回对应的result(n),如果都不一致,则返回else_result;其中,result(n)和else_result必须为同一种类型,返回值类型也为该类型
示例: CASE(星期, '星期六', '休息日', '星期日' ,'休息日', '工作日') 

3.7 CASE WHEN

使用格式:CASE WHEN expression1 THEN value1 [WHEN expression2 THEN value2 …] [ELSE value3] END
说明:如果expression1为TRUE,则返回value1;如果expression2为TRUE,则返回value2;否则返回value3
示例:CASE
WHEN 成绩<60 THEN '不及格'
WHEN 成绩≥60 AND 成绩<80 THEN '及格'
WHEN 成绩≥80 AND 成绩<90 THEN '良好'
ELSE '优秀'
END

4、计算函数

函数名称使用示例
MIN 最小值MIN(20,76,44,13,65) 返回: 13
MAX 最大值MAX(20,76,44,13,65) 返回: 76
AVG 平均值AVG(20,76,44,13,65) 返回: 43.6
MOD 余数MOD(6,4) 返回: 2
ROUND 四舍五入ROUND(2.149,2) 返回: 2.15;
FLOOR 向下舍入FLOOR(2.149,2) 返回: 2.14;
CEILING 向上舍入CEILING(2.142,2) 返回: 2.15;

4.1 MIN

使用格式:MIN(number1,number2,...)
说明: 返回参数列表中最小值。
示例: MIN(20,76,44,13,65) 返回: 13

4.2 MAX

使用格式:MAX(number1,number2,...)
说明: 返回参数列表中最大值。
示例: MAX(20,76,44,13,65) 返回: 76

4.3 AVG

使用格式:AVG(number1,number2,...)
说明: 返回参数列表的平均值。
示例: AVG(20,76,44,13,65) 返回: 43.6

4.4 MOD

使用格式:MOD(number1,number2)
说明: 返回两数相除的余数。
示例: MOD(6,4) 返回: 2

4.5 ROUND

使用格式:ROUND(number,num_digits)
说明: 返回某个数字按指定位数四舍五入后的数字。number为需要进行四舍五入的数字,num_digits为指定的位数,按此位数进行舍入。如果num_digits大于0,则舍入到指定的小数位,如果num_digits等于0,则舍入到整数,如果num_digits小于0,则在小数点左侧进行舍入。
示例: ROUND(2.149,2) 返回: 2.15
ROUND(2.149,0) 返回: 2
ROUND(21.49,-1) 返回: 20

4.6 FLOOR

使用格式:FLOOR(number,num_digits)
说明: 返回某个数字按指定位数向下舍入后的数字。number为需要进行向下舍入的数字,num_digits为指定的位数,按此位数进行舍入。如果num_digits大于0,则舍入到指定的小数位,如果num_digits等于0,则舍入到整数,如果num_digits小于0,则在小数点左侧进行舍入。
示例: FLOOR(2.149,2) 返回: 2.14
FLOOR(2.149,0) 返回: 2
FLOOR(21.49,-1) 返回: 20

4.7 CEILING

使用格式:CEILING(number,num_digits)
说明: 返回某个数字按指定位数向上舍入后的数字。number为需要进行向上舍入的数字,num_digits为指定的位数,按此位数进行舍入。如果num_digits大于0,则舍入到指定的小数位,如果num_digits等于0,则舍入到整数,如果num_digits小于0,则在小数点左侧进行舍入。
示例: CEILING(2.142,2) 返回: 2.15
CEILING(2.149,0) 返回: 3
CEILING(216.49,-2) 返回: 220

5、文本函数

函数名称使用示例
STARTWITH  判断字符串A以字符串B开始STARTWITH('apple','ap') 返回: true
ENDWITH  判断字符串A以字符串B结尾STARTWITH('apple','ap') 返回: true
EQUALS  判断字符串是否相等EQUALS('apple','apple') 返回: true
LEN  取字符串的长度LEN('apple') 返回: 5
CONTAINS  判断字符串A包含BCONTAINS('apple','pp') 返回: true
CONCATENATE   文本合并CONCATENATE('apple ','price') 返回:'apple price'
VALUE  文本转化成数字VALUE('-23.04') 返回: -23.04
NUMBERSTRING  返回中文大写NUMBERSTRING(201314.521) 返回: 贰拾万零壹仟叁佰壹拾肆点伍贰壹
NNUMBERSTRINGRMB  返回金额大写NNUMBERSTRINGRMB(201314.521) 返回: 贰拾万零壹仟叁佰壹拾肆元伍角贰分
TRIM  删除字符串前后空格TRIM(' apple ') 返回: apple
MID  取中间文本MID('qincesoftware',6,8) 返回: software

5.1 STARTWITH

使用格式:STARTWITH(string1, string2)
说明: 判断字符串参数1是否以字符串参数2开始。
示例: STARTWITH('apple','ap') 返回: true

5.2 ENDWITH

使用格式:ENDWITH(string1, string2)
说明: 判断字符串参数1是否以字符串参数2结束。
示例: ENDWITH('apple','le') 返回: true

5.3 EQUALS

使用格式:EQUALS(string1, string2)
说明: 判断两个字符串参数是否相等(区分大小写)。
示例: EQUALS('apple','apple') 返回: true

5.4 LEN

使用格式:LEN(string)
说明: 判断字符串的长度。
示例: LEN('apple') 返回: 5

5.5 CONTAINS

使用格式:CONTAINS(string1, string2)
说明: 判断字符串参数1中是否包含字符串参数2。
示例: CONTAINS('apple','pp') 返回: true

5.6 CONCATENATE

使用格式:CONCATENATE(string1, string2,...)
说明: 将多个字符串合并成一个字符串。
示例: CONCATENATE('apple ','price') 返回:'apple price'

5.7 VALUE

使用格式: VALUE(string)
说明: 将文本形式的数字转化成数字格式,支持负数和小数,如果转化不成功,返回空
示例: VALUE('-23.04') 返回: -23.04

5.8 NUMBERSTRING

使用格式: NUMBERSTRING(number)
说明: 将数字转化成中文大写数字展示
示例: NUMBERSTRING(201314.521) 返回: 贰拾万零壹仟叁佰壹拾肆点伍贰壹

5.9 NUMBERSTRINGRMB

使用格式: NUMBERSTRINGRMB(number)
说明: 将数字转化成中文大写金额展示,最多支持到分
示例: NNUMBERSTRINGRMB(201314.521) 返回: 贰拾万零壹仟叁佰壹拾肆元伍角贰分

5.10 TRIM

使用格式: TRIM(string)
说明: 删除字符串前后的空白字符
示例: TRIM(' apple ') 返回: apple

5.11 MID

使用格式: MID(string,start_num,num_chars)
说明: 返回字符串中从指定位置开始的一定数目的字符。start_num为需要提取的字符串的起始位置,第一个字符的位置为1,以此类推。num_chars为返回的字符串长度。start_num和num_chars需为正整数。若start_num大于字符串长度,则返回空;若start_num小于字符串长度,但start_num加num_chars大于字符串长度,则返回从start_num指定至字符串末尾的所有字符。
示例: MID('qincesoftware',6,8) 返回: software
MID('qincesoftware',1,5) 返回: qince
MID('qincesoftware',6,30) 返回: software
MID('qincesoftware',30,8) 返回: 空

6、参考示例

6.1 文本与日期格式相互转换

6.1.1 将日期转换为文本格式

使用DATEFORMAT函数
示例:DATEFORMAT(2018-08-07 15:18:02,’yyyyMMddHHmmss’) 返回:20180807151802
DATEFORMAT(2018-08-07 15:18:02,’yyyy年MM月dd日‘)  返回:2018年08月07日
2024-02-06
0