需求
有业务需求,想实现明细表的数据重复提示以及显示是哪些数据重复;
实现
1、明细表数据重复提示
明细表的数据重复提示,致远表单自带有明细表公式,可以直接进行校验以及提示;如下图:
点击表单的校验规则,在弹出窗口中点击公式框,打开公式选择配置界面;
选择右侧的更多公式,然后选择要校验的明细表字段,再点击公式名称【明细表列不重】,依次点击确认即可。
返回到校验规则窗口,在提示框中输入要提示的信息,再次点击确定。
明细表的数据重复提示校验就OK了。
2、重复数据显示
操作实现步骤如下:
2.1、设计表单
表单设计样式如下:
其中重复数据即为显示明细表中重复的数据内容;
2.2、设置自定义函数
使用自定义函数,编写重复数据判断规则,公式代码如下:
def haveRepetArray=param[0];
def findRepetition=[:]; //找到重复的,重复的map值大于1,不重复的值等于1
def repetitionRes=[]; //重复的结果
def noRepetitionRes=[]; //不重复的结果
def arrElemIndex=[]; //得到重复元素的下标
def mapElemIndex=[:]; //通过键值的方式存储重复元素
haveRepetArray.each{a->
if(findRepetition[a] == null){ //如果这个map里没有这个键的时候就给值1
findRepetition[a]=1
} else{
findRepetition[a]=findRepetition[a]+1
}
}
findRepetition.each{m->
if (m.value>1) { //遍历如果这个map键的值大于1说明就是重复的把它放在一个数组里
repetitionRes += m.key
}else{ //如果不是重复的把它放在另一个数组里
noRepetitionRes += m.key
}
}
repetitionRes.each{entry -> //遍历重复的数组
def tempArr=[];
haveRepetArray.eachWithIndex {r,j -> //遍历原始数组
if (entry==r) { //如果重复数组里的值等于原始数组里的值,就把这个元素的索引放到一个新数组里
j++
tempArr += j //只取原始数组的索引
}
}
mapElemIndex[entry]=tempArr //以键值对的方式存储数组
arrElemIndex<<tempArr //添加到一个新数组
}
def endRes=mapElemIndex.toString();
endRes=endRes.substring(1,endRes.length()-1).replace("], ","]\n");
return endRes.equals(":")?"":endRes;
通过应用设计师打开表单,并进入表单编辑状态,选中【重复数据】字段,并点击右侧的计算公式,注意,【重复数据】字段类型为文本域,字段长度建议根据情况设置高一点,毕竟可能是要整合明细表的多行内容。 在打开的计算公式设置窗口中,找到自定义函数,打开并新建;如下图:
如上图步骤设置好自定义函数后,依次点击保存、确定等操作。最后再保存表单编辑状态,关闭表单编辑。
2.3、后台审核
由于系统的安全机制,在定义好自定义函数后,需要使用system账号审核一下,菜单位置在:【安全管理】-【安全审计】-【CAP自定义函数审核】,找到刚刚新建的自定义函数,选中后,点击审核并通过确定即可。
3、效果确认
完成以上操作后,打开刚做的流程表单,然后输入相关内容,进行数据测试。
如果表单设计的有业务关系,这里不影响计算结果,如下图:
总结
1、自定义函数脚本使用groovy语言,与java类似,而且可以直接引用软件环境中的类(包名.类名);
2、基于表单定义的自定义函数,只能用此于表单,在别的表单也要引用时,需要重新定义自定义函数,同时也需要后台重新审核;
3、V8.0版本开始,表单中引入了公式组件,可以通过公式组件定义通用函数,再直接引用。公式组件通过单位管理员(默认为admin1)进行后台定义,同样也是使用groovy脚本语言。
如果各位有兴趣或者其他问题,可以深入交流,共同学习。
【记录于2021年9月27日】