1. 概述
1.1 问题描述
用户在填报报表中录入数据时,希望可以通过两个或多个字段来验证数据的唯一性,确保填入的数据在数据库中不存在。
1.2 解决思路
报表设计时将需要校验的多个字段拼接起来作为一个字段,然后对数据库中的相应字段也做同样拼接处理。填报属性中设置内置提交校验公式,验证这两个拼接起来的字段是否一致,如果一致则代表数据重复。
2. 示例
以下示例用产品名称和单价作为联合主键,来判断输入值是否和数据库中已有数据重复。
2.1 数据准备
新建数据集 ds1,输入 SQL 查询语句:select *,(产品名称||单价) as aa from S产品。
(产品名称||单价)表示将产品名称与单价拼接成一个字段。该语法适用于Sqlite数据库,其他数据库的拼接语法可百度查询。
2.2 设计模板
1)如下图设计表格,A2~G2 单元格添加文本控件。
H2 单元格插入公式:CONCATENATE(B2, C2),表示在填报时将 B2 和 C2 单元格的填入的内容拼接在一起。
2)为了前端填报时可以添加多条记录,需要设置 A2 单元格纵向扩展,如下图所示:
3)前端添加多条记录时,需要新增的行保留 H2 单元格中的公式,所以要将 H2 单元格的插入行策略设置为原值,如下图所示:
4)H2 单元格仅用于判断重复数据,不需要展示,所以设置完成后可以隐藏 H 列。
2.3 填报属性设置
点击「模板>报表填报属性>提交」,添加一个内置SQL,按下图所示设置填报属性
点击「模板>报表填报属性>数据校验」,添加一个内置校验,按下图所示设置校验公式:
校验公式为:INARRAY(H2,if(COUNT((ds1.group(aa)))>1,ds1.group(aa),ARRAY(ds1.group(aa))))=0
不满足校验公式则提示:"当前产品名称单价与数据库中已有的产品名称单价重复"
公式解释:
含义为取出 ds1 中拼接好的aa 字段作为一个数组,之后遍历判断每一行的 H2 是否在数组中存在,存在的话就是重复数据。
公式 | 说明 |
---|---|
ds1.group(aa) | 对 ds1 中的 aa 数据列数据分类汇总,当个数为 1 的时候,返回值为字符串;>1 返回数组 |
ARRAY(ds1.group(aa)) | 将 ds1.group(aa) 汇总的数据转换为数组格式 |
if(COUNT((ds1.group(aa)))>1,ds1.group(aa),ARRAY(ds1.group(aa))) | 如果汇总后数据个数<1,将字符串转换为数组 |
INARRAY(H2,if(COUNT((ds1.group(aa)))>1,ds1.group(aa),ARRAY(ds1.group(aa)))) | 返回 H2 中拼接的联合主键在已有数据数组中的位置,如果不存在返回 0 |
2.4 效果查看
1)PC 端
保存报表,点击填报预览,输入与数据库中重复的产品名称和单价,数据校验时会提示报错信息。
2)移动端
同时支持 App 端和 H5 端,效果如下图所示:
3. 已完成模板
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\VerifyForm\内置提交校验验证数据是否重复.cpt
点击下载模板:内置提交校验验证数据是否重复.cpt