一、验证规则使用场景
在新建、编辑对象的数据时,保存数据前需要校验一下页面所填信息是否合法或者符合业务要求。例如:在保存客户信息时,校验【手机号】字段是否符合要求,如果不符合要求可在验证规则中配置是否要阻断保存。
二、操作指南
2.1 功能入口
预设对象/自定义对象管理->验证规则
2.2 验证规则的基础配置
- 使用场景
- 选中新建:通过新建按钮进入新建编辑页会阻断
- 选中编辑:通过详情页编辑按钮进入新建编辑页会阻断
- 如果验证规则的结果是true ,则执行阻断动作
- 设置阻断后,提示以上内容且不允许保存
- 设置不阻断后,提示以上内容并支持选择是否继续保存
2.3 复杂配置
- 高级模式:若想配置主对象下的字段和查找关联对象下的配置需启用高级模式,但是若在公式中配置关联对象或主对象的统计字段或计算字段可能会存在延迟!即验证规则在配置完之后需要等待一些时间才难生效
2.4 公式中字段为空值时
对于计算公式中非数值、金额、百分比类型的字段,“公式中字段为空值时”这个选项的设置不生效,直接以空值参与计算
空值参与数学运算或者逻辑判断的话,程序会报错,最终计算结果就是空值,需要用判空函数单独处理非数值、金额、百分比类型的空值字段
- 支持插入字段类型:金额、日期、日期时间、邮箱、地址、多行文本、小数、数字、百分数、手机、单选、单行文本、布尔值、网址、定位组件、签到组件、收款组件、计算字段、统计字段、查找关联对象的计算字段&统计字段
- 支持函数:
返回值类型 | 运算符/函数 | 参数 | 功能 | 备注及实例 | |
---|---|---|---|---|---|
通用 | () | 标注运算符优先级 | |||
与输入参数有关 | IF(logical_test, value_if_true, value_if_false) | 参数个数:3,参数类型:第一个为布尔类型,第二个和第三个必须为同一种类型 | 判断条件是否为true,如果为true,则返回return_true_value,否则返回return_false_value其中,return_true_value和return_false_value必须为同一类型,返回值类型也为该类型 | 例如:34 = IF(true, 34, 52) | |
CASE(expression, value1, result1, value2, result2,...,else_result) | 参数个数:不定,参数类型:result(n)和else_result必须为同一种类型 | 根据满足不同的条件,返回满足条件的值。其中expression的值与value(n)进行比较,value(x)与expression的值一致,则返回对应的result(n),如果都不一致,则返回else_result,其中,result(n)和else_result必须为同一种类型,返回值类型也为该类型 | 例如:33 = CASE(3, 2, 2, 3, 33, 1.3) | ||
NULLVALUE(expression, substitute_expression) | 参数个数:2个,参数类型:第一个为布尔类型,第二个参数可以为各种类型 | 判断条件是否为空,如果是,则返回return_value,如果否,返回Null其中,返回值类型也为第二个参数的类型 | 例如:1 = NULLVALUE(Null, 1)Null = NULLVALUE(5, 1) | ||
数值 | +,-,*,/ | 参数个数:2个,参数类型:数值,百分比,金额 | 进行数值的加减乘除运算 | 例如:6 = (3+2)*6/5 | |
- | 参数个数:2个,参数类型:均为日期,以天为单位 | 运算日期的差值,以天为单位 | 例如:a的值为1982-04-13 b的值为1982-03-2024 = a - b | ||
- | 参数个数:2个,参数类型:均为日期时间,以小时为单位 | 运算日期时间的差值,以小时为单位 | 例如:a的值为1982-04-13 17:00:00b的值为1982-04-12 15:00:0026 = a - b | ||
- | 参数个数:2个,参数类型:均为时间,以小时为单位 | 运算时间的差值,以小时为单位 | 例如:a的值为17:00:00b的值为15:00:002 = a - b | ||
VALUE(string) | 参数个数:1个,参数类型:文本类型 | 将文本形式的数字转化成数字,支持负数和小数,如果转化不成功,返回空 | 例如:-1982.0413 = VALUE('-1982.0413')Null = VALUE('aaa') | ||
MIN(number1,number2) | 参数个数:2个,参数类型:均为数值类型 | 返回两个参数中最小的一个 | 例如:4 = MIN(4,13) | ||
MAX(number1,number2) | 参数个数:2个,参数类型:均为数值类型 | 返回两个参数中最大的一个 | 例如:13 = MAX(4,13) | ||
MULTIPLE(number1,number2) | 参数个数:2个,参数类型:均为数值类型 | 返回数字1乘以数字2的结果 | 例如:52 = MULTIPLE(4,13) | ||
MOD(number1,number2) | 参数个数:2个,参数类型:均为数值类型 | 返回数字1被数字2除后的整数部分 | 例如:3 = MOD(13,4) | ||
ADDS(number1,number2) | 参数个数:2个,参数类型:均为数值类型 | 返回数字1加上数字2的结果 | 例如:17 = ADDS(13,4) | ||
SUBTRACTS(number1,number2) | 参数个数:2个,参数类型:均为数值类型 | 返回数字1减去数字2的结果 | 例如:9 = SUBTRACTS(13,4) | ||
YEAR(date) | 参数个数:1个,参数类型:日期,或日期时间类型 | 用于获取参数中的年的数值 | 例如:a = 1982-04-131982 = YEAR(a) | ||
MONTH(date) | 参数个数:1个,参数类型:日期,或日期时间类型 | 用于获取参数中的月的数值 | 例如:a = 1982-04-134 = MONTH(a) | ||
DAY(date) | 参数个数:1个,参数类型:日期,或日期时间类型 | 用于获取参数中的日的数值 | 例如:a = 1982-04-1313 = DAY(a) | ||
LEN(text) | 参数个数:1个,参数类型:文本型 | 返回字符串的长度 | 6=LEN('xiaoke') | ||
百分比 | +,-,*,/ | 参数个数:2个,参数类型:数值,百分比,金额 | 进行数值的加减乘除运算,以百分比形式返回 | ||
日期时间类型的中间值 | YEARS(number) | 参数个数:1个,参数类型:数值型 | 用于指定日期/日期时间计算中所运算的年的数值 | 得到年份,用来和日期时间,日期进行计算例如:2019-09-09=TODAY()+YEARS(1),其中,TODAY()返回 2018-09-09 | |
MONTHS(number) | 参数个数:1个,参数类型:数值型 | 用于指定日期/日期时间计算中所运算的月的数值 | 得到月份,用来和日期时间,日期进行计算例如:MONTHS(2) | ||
DAYS(number) | 参数个数:1个,参数类型:数值型 | 用于指定日期/日期时间计算中所运算的日的数值 | 得到日期,用来和日期时间,日期进行计算例如:DAYS(4) | ||
HOURS(number) | 参数个数:1个,参数类型:数值型 | 用于指定日期时间/时间计算中所运算的小时的数值 | 得到小时,用来和日期时间,时间进行计算例如:HOURS(4) | ||
MINUTES(number) | 参数个数:1个,参数类型:数值型 | 用于指定日期时间/时间计算中所运算的分钟的数值 | 得到分钟,用来和日期时间,时间进行计算例如:MINUTES(4) | ||
日期 | +,- | 参数个数:2个,参数类型:第一个为日期类型,第二个为由YEARS、MONTHS、DAYS计算出的时间 | 进行日期运算,得出新的日期值 | 例如:Creatdate+DAYS(4),得到创建时间+4天后的日期 | |
DATE(year,month,day) | 参数个数:3个,参数类型:数值 | 通过数值,创建一个日期类型值 | 例如:1982-4-13=DATE(1982,4,13) | ||
DATEVALUE(string) | 参数个数:1个,参数类型:字符串 | 通过字符串,创建一个日期类型值 | 例如:1982-4-13=DATEVALUE('1982-04-13') | ||
TODAY() | 无参数 | 返回当前的日期 | |||
DATETIMETODATE(datetime) | 参数个数:1个,参数类型:日期时间类型公式 | 返回日期时间字段中的日期 | 例如:1982-4-13=DATEVALUE('1982-04-13 17:00:00') | ||
日期时间 | +,- | 参数个数:2个,参数类型:第一个为日期时间类型,第二个为由YEARS、MONTHS、DAYS,HOURS,MINUTES计算出的时间 | 进行日期时间运算,得出新的日期时间值 | 例如:DeadlineTime-DAYS(1),得到截止时间前一天的时间 | |
DATETIMEVALUE(string) | 参数个数:1个,参数类型:字符串 | 通过字符串,创建一个日期时间类型值 | 例如:2001-08-24 15:45:25 = DATETIMEVALUE('2001-08-24 15:45:25') | ||
NOW() | 无参数 | 返回当前的日期时间 | |||
时间 | +,- | 参数个数:2个,参数类型:第一个为日期时间类型,第二个为由HOURS,MINUTES计算出的时间 | 进行时间运算,得出新的日期时间值 | 例如:submitDailyReport-HOURS(1),得到提交工作日报的前一小时的时间注意,时间类型的值如果经过计算后的结果只在00:00到23:59之间 | |
DATETIMETOTIME(datetime) | 参数个数:1个,参数类型:日期时间类型公式 | 返回日期时间字段中的时间 | 例如:17:02:40=DATEVALUE('1982-04-13 17:02:40') | ||
文本 | & | 参数个数:2个,参数类型:均为文本类型 | 字符串组合 | 例如:“张三”&“李四” 的值为 张三李四 | |
'' | 参数个数:1个,参数类型:字符串 | 插入单行文本常量 | 例如:'单行文本' | ||
'''''' | 参数个数:1个,参数类型:字符串 | 插入多行文本常量 | 例如:'''多行文本''' | ||
NUMBERSTRING(number) | 参数个数:1个,参数类型:数值,金额 | 将数字转化成中文大写数字展示 | 例如:壹拾玖万捌仟贰佰零肆点壹叁 =NUMBERSTRING(198204.13) | ||
NUMBERSTRINGRMB(number) | 参数个数:1个,参数类型:数值,金额 | 将数字转化成中文大写金额展示,最多支持到叫角,分 | 例如:壹拾玖万捌仟贰佰零肆元壹角叁分 =NUMBERSTRINGRMB(198204.13) | ||
布尔 | <,>, >=,<=,≠ | 参数个数:2个,参数类型:均为数值型,百分比,金额 | 数值类型进行比较,返回true或false | 例如:true = 1 < 2;false = 2 < 1 | |
AND(boolean1,boolean2,boolean3,...) | 参数个数:多个,参数类型:布尔型 | 逻辑与,若多个条件运算结果都为true,则结果为true | 例如:true = AND( 2>1 ,5>3) | ||
OR(boolean1,boolean2,...) | 参数个数:多个,参数类型:布尔型 | 逻辑或,若其中一个条件运算结果都为true,则结果为true | 例如:true = OR( 2>1 ,5<3) | ||
NOT(boolean) | 参数个数:1个,参数类型:布尔型 | 若条件为true,则结果为false,反之,结果为true | 例如:false = NOT(2>1) | ||
ISNULL(expression) | 参数个数:1个,参数类型:不限 | 判断表达式结果是否为空,如果为空,返回true,反之为false | 例如:false = ISNULL(5) | ||
ISNUMBER(string) | 参数个数:1个,参数类型:字符串 | 判断expression字符串是否可以转为数字 | 例如:true = ISNUMBER('5') | ||
STARTWITH(string1, string2) | 参数个数:2个,参数类型:字符串 | 返回字符串是否以查询字符串开始的结果 | 例如:true = STARTWITH( 'abcdef' , 'ab' ) | ||
ENDWITH(string1, string2) | 参数个数:2个,参数类型:字符串 | 返回字符串是否以查询字符串结束的结果 | 例如:true = ENDWITH( 'aecdab' , 'ab' ) | ||
EQUALS(string1, string2) | 参数个数:2个,参数类型:字符串 | 返回字符串是否等于查询字符串的结果(跟大小写相关) | 例如:true = EQUALS( 'aecdab' , 'aecdab' ) | ||
CONTAINS(string1, string2) | 参数个数:2个,参数类型:字符串 | 返回查询字符串在字符串中的匹配结果(true,false) | 例如:false = CONTAINS( 'abcdef' , 'kl' ) |
2.5 注意事项
- 验证规则支持定义多个验证规则,系统会按照创建时间逐条校验
- 支持停用或启用验证规则,停用后验证规则不生效
三、验证规则常见问题即排查方法
3.1 验证规则中使用统计字段不生效
3.1.1 场景描述
1.新建不阻拦,编辑的时候阻拦了
2.新建的时候明明统计字段有统计值,也满足验证规则条件,但是没有触发
3.1.2 问题原因
验证规则中直接或间接使用了查找关联对象中的统计字段,且该统计字段统计的为以下三种情况:当前对象字段、当前对象主对象字段、当前对象的查找关联对象字段。编辑时使用的是数据库中的上一次保存的统计值进行验证,而非页面实时看到的这一次的统计字段值,所以验证规则执行时会有偏差。新建时数据库里还没有存入统计字段的值,所以验证规则不生效。
- 可带入问题原因对场景再次理解
订单明细中设置验证规则:可售数量<0时进行 阻断
此时存在的数据为:
产品对象:矿泉水-总库存20,已售出0
此时新建订单,并添加订单明细数据:订单明细产品-矿泉水,明细数量30;此时显示的可售数量(计算)为-10;按照验证规则(可售数量<0)应该阻断,但是却可以保存成功。
3.1.3 解决思路
在新建保存和编辑保存按钮内使用统计字段配置阻断保存的前验证函数即可
3.2 对象中使用本对象的负责人主属部门做验证规则不生效
3.2.1 场景描述
1.使用的是本对象下的负责人主属部门
2.使用的是关联对象负责人的负责人所在部门
3.联合使用本对象下的负责人主属部门和关联对象负责人的负责人所在部门
3.2.2 问题原因
在新建数据提交的时候,“负责人主属部门”字段和“负责人所在部门”字段是没有值的,负责人主属部门是在数据提交后(验证规则执行后)才会存储到数据库里面。
3.2.3 解决思路
在新建保存和编辑保存按钮中配置前验证函数,通过负责人ID带到人员字段下的部门信息。操作较为复杂,请联系实施配置。
3.3 查看数据时不满足验证规则,那创建数据时是怎么保存上的?
3.3.1 场景描述
报名表对象中设置验证规则【学员公司邮箱或学员个人邮箱为空时不可保存】,但是查看数据时发现有数据邮箱为空依旧存在。
3.3.2 问题原因
原因1:新建数据时有值,但是后续使用函数将数据直接删除,所以未走校验
原因2:先创建的数据,后创建的验证规则
3.3.3 解决思路
方法1:查看修改记录,看是否有函数修改过数据
方法2:对比验证规则和该条数据的创建时间
3.4 验证规则中使用计算/统计字段校验,当值未填写时不生效
3.4.1场景描述
订单对象中设置验证规则【订单总金额(原币)<=0不可保存】
但是新建数据时未填写订单总金额(原币)却能不能保存成功
3.4.2 问题原因
此时用户认为空值时为0,不满足验证规则所以应该保存成功,但是值为空时是不参与验证规则计算的。
3.4.3 解决方法
在验证规则中设置【公式中字段为空值时-默认为零】
3.5 验证规则的字段公式为空值时的默认为零,配置没生效
3.5.1 场景描述
【装置借用/退货款】对象的验证规则中设置了归还日期-申请日期>180,设置了公式中字段为空时默认为零,验证规则不符合,应该不阻断,但是提交时阻断了。
3.5.2 问题原因
对于计算公式中非数值、金额、百分比类型的字段,“公式中字段为空值时”这个选项的设置不生效,直接以空值参与计算。空值参与数学运算或者逻辑判断的话,程序会报错,最终计算结果就是空值,需要用判空函数单独处理非数值、金额、百分比类型的空值字段。
3.5.3 解决方法
使用判空函数ISNULL单独处理非数值、金额、百分比类型的空值字段即可。