1. 概述编辑
1.1 问题描述
填报时没有特定的字段作为主键,希望能自动生成一串随机数来作为主键,且不能重复。
1.2 解决思路
FineReport 设计器内置了 UUID() 函数,可通过填报字段的值绑定,继而产生唯一标识码,实现编号的唯一性。
2. 示例编辑
使用 UUID()来生成唯一编号有两种方法,填报属性中使用 UUID() 公式和单元格中使用 UUID() 公式。
2.1 方法一:填报属性中使用
2.1.1 准备数据
新建普通报表,新建数据库查询,修改名字为「书籍信息入库」,SQL 查询语句为:SELECT * FROM book where id is null
2.1.2 设计表格
1)设计表格样式,将字段拖入对应的单元格,如下图所示:
2)添加填报控件,各控件属性如下:
2.1.3 设置报表填报属性
点击「模板>报表填报属性」,新增内置 SQL 提交,选择提交类型为「插入提交」,不显示原有数据。
智能添加字段,并添加单元格。其中 id 字段为主键,值为公式:UUID(32)。如下图所示:
注:该示例中,主键 id 由于直接在填报属性中用UUID()自动生成了,所以其无需出现在填报页面上。
2.2 方法二:单元格中使用
或者可以在单元格中插入公式 UUID(32),如在 B11 单元格插入公式,在报表填报属性中将 id 的值绑定为该单元格,如下图所示:
2.3 效果预览
以 2.1 节示例效果为例:
1)PC端
保存模板,点击「填报预览」,填报如下信息,点击提交。查看数据库,可以看到 32 位 id 正确生成,填写的内容也正确入库。i效果如下图所示:
2)移动端
App 端和 H5 端均支持,效果如下图所示:
3. 模板下载编辑
已完成模板可参考%FR_HOME%\webroot\WEB-INF\reportlets\doc\Form\填报报表之主键生成.cpt
点击下载模板:填报报表之主键生成.cpt
4. 注意事项编辑
4.1 页面与入库id不一致
4.1.1 问题描述
单元格使用 UUID 公式时,填报预览界面得出的 id 值与入库的 id 值不一致。如下图所示:
4.1.2 原因分析
这是由于公式编辑界面默认勾选了「填报/分析时,保留公式用于计算」,则填报提交时公式会二次计算,从而导致入库时又重新生成了 id 。
4.1.3 解决方案
取消勾选 UUID() 所在单元格公式设置界面的「填报/分析时,保留公式用于计算」。
注:仅方法二会有该问题。
4.2 提交成功后修改数据
4.2.1 问题描述
填报成功后,如果没刷新页面直接修改了某条信息,会发现提交后新增了一条数据,而没有正常更新原数据。
4.2.2 原因分析
填报成功后未刷新页面时修改某条信息,虽然页面上 id 值并没有改变,但因公式勾选了「填报/分析时,保留公式用于计算」,每提交成功一次 UUID() 就会变化,导致新增多条数据。
4.2.3 解决方案
取消勾选 UUID() 所在单元格公式设置界面的「填报/分析时,保留公式用于计算」。
注:仅方法二会有该问题。
4.3 数据集预览时id列不显示
4.3.1 问题描述
填报成功后,数据库表中可以看到 id 列已有数据,但在设计器中点击数据集预览时,id 列没有显示,如下图所示:
4.3.2 原因分析
FRDemo 中 book 表中的 id 字段类型为 blob 类型,不支持数据集预览。
4.3.3 解决方案
将数据表清空,再将 id 字段类型修改为 text 或者字符串类型,填报成功后预览即可显示。但是需要在表清空的情况下修改才生效,因为设计器会在填报第一条数据时判断其字段类型,第一次判断之后,再修改表字段类型不会影响数据集预览显示。
4.4 多个内置 SQL 中使用 UUID
4.4.1 问题描述
如果该填报表是多源填报类型,比如员工基础信息存在表 1 中,员工部门信息存在表 2 中,表 1 与表 2 有相同的字段「员工 ID」,填报时这两张表都要保存「员工 ID」。
4.4.2 解决方案
此时必须在单元格中使用 UUID() 生成员工编号,报表填报属性设置两个「内置 SQL 提交」,分别绑定表 1 和表 2 ,表 1 和表 2 的「员工 ID」字段绑定同一个单元格。
若使用在报表填报属性中每张报表都使用 UUID() 函数,产生的序列号是不一样的,此时会导致员工 ID 不一致的情况。