二开案例.表达式.单据保存前校验文本字段的值必须是数字
【应用场景】
单据保存前校验文本字段的值必须是数字
【案例演示】
采购订单,明细信息单据体新增一个文本字段,单据保存前,校验该文本字段的值必须是数字(含小数)。
【实现步骤】
<1>BOSIDE扩展采购订单,新增文本字段1用于存储物料的重量,文本字段2用于存储物料的体积。
<2>保存操作新增校验规则,设置完毕后,保存元数据。
单据合法性校验:文本字段1必须是数字:
计算公式:
F_Jac_Text1='0' OR (F_Jac_Text1<>null AND F_Jac_Text1<> '' AND F_Jac_Text1<>' ' AND F_Jac_Text1.count('.')=0 AND F_Jac_Text1.isdigit()=False) OR (F_Jac_Text1<>null AND F_Jac_Text1<> '' AND F_Jac_Text1<>' ' AND F_Jac_Text1.count('.')=1 AND (F_Jac_Text1.split('.')[0].isdigit()=False OR F_Jac_Text1.split('.')[1].isdigit()=False)) OR (F_Jac_Text1<>null AND F_Jac_Text1<> '' AND F_Jac_Text1<>' ' AND F_Jac_Text1.count('.')>1)
单据合法性校验:文本字段2必须是体积:
计算公式:
(F_Jac_Text1<>null AND F_Jac_Text1<>'' AND F_Jac_Text1<>' ' AND F_Jac_Text1.count('*')<>2) OR (F_Jac_Text1<>null AND F_Jac_Text1<>'' AND F_Jac_Text1<>' ' AND F_Jac_Text1.count('*')=2 AND ((F_Jac_Text1.split('*')[0]='0' OR (F_Jac_Text1.split('*')[0]<>null AND F_Jac_Text1.split('*')[0]<> '' AND F_Jac_Text1.split('*')[0]<>' ' AND F_Jac_Text1.split('*')[0].count('.')=0 AND F_Jac_Text1.split('*')[0].isdigit()=False) OR (F_Jac_Text1.split('*')[0]<>null AND F_Jac_Text1.split('*')[0]<> '' AND F_Jac_Text1.split('*')[0]<>' ' AND F_Jac_Text1.split('*')[0].count('.')=1 AND (F_Jac_Text1.split('*')[0].split('.')[0].isdigit()=False OR F_Jac_Text1.split('*')[0].split('.')[1].isdigit()=False)) OR (F_Jac_Text1.split('*')[0]<>null AND F_Jac_Text1.split('*')[0]<> '' AND F_Jac_Text1.split('*')[0]<>' ' AND F_Jac_Text1.split('*')[0].count('.')>1)) OR (F_Jac_Text1.split('*')[1]='0' OR (F_Jac_Text1.split('*')[1]<>null AND F_Jac_Text1.split('*')[1]<> '' AND F_Jac_Text1.split('*')[1]<>' ' AND F_Jac_Text1.split('*')[1].count('.')=0 AND F_Jac_Text1.split('*')[1].isdigit()=False) OR (F_Jac_Text1.split('*')[1]<>null AND F_Jac_Text1.split('*')[1]<> '' AND F_Jac_Text1.split('*')[1]<>' ' AND F_Jac_Text1.split('*')[1].count('.')=1 AND (F_Jac_Text1.split('*')[1].split('.')[0].isdigit()=False OR F_Jac_Text1.split('*')[1].split('.')[1].isdigit()=False)) OR (F_Jac_Text1.split('*')[1]<>null AND F_Jac_Text1.split('*')[1]<> '' AND F_Jac_Text1.split('*')[1]<>' ' AND F_Jac_Text1.split('*')[1].count('.')>1)) OR (F_Jac_Text1.split('*')[2]='0' OR (F_Jac_Text1.split('*')[2]<>null AND F_Jac_Text1.split('*')[2]<> '' AND F_Jac_Text1.split('*')[2]<>' ' AND F_Jac_Text1.split('*')[2].count('.')=0 AND F_Jac_Text1.split('*')[2].isdigit()=False) OR (F_Jac_Text1.split('*')[2]<>null AND F_Jac_Text1.split('*')[2]<> '' AND F_Jac_Text1.split('*')[2]<>' ' AND F_Jac_Text1.split('*')[2].count('.')=1 AND (F_Jac_Text1.split('*')[2].split('.')[0].isdigit()=False OR F_Jac_Text1.split('*')[2].split('.')[1].isdigit()=False)) OR (F_Jac_Text1.split('*')[2]<>null AND F_Jac_Text1.split('*')[2]<> '' AND F_Jac_Text1.split('*')[2]<>' ' AND F_Jac_Text1.split('*')[2].count('.')>1))))
---------------------------------------------------------------------------------------------------------
【功能验证】
登录业务站点,打开采购订单编辑界面,文本1和文本2录入非法数据,点击保存菜单,此时保存操作因校验器拦截而被终止。
---------------------------------------------------------------------------------------------------------
【扩充知识】
<1>count():用于统计字符串里某个字符出现的次数。
<2>split():通过指定分隔符对字符串进行切片。
<3>isdigit():检测字符串是否只由数字组成。
本案例中,仅判断下文本是否是数字或小数,表达式就已经复杂冗余的没法看了,建议采用自定义表达式函数实现,C#下判断文本是否是数字要简练多了。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表达式.单据保存前校验文本字段的值必须是数字
本文2024-09-23 04:19:34发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164587.html