历史版本7 :使用UUID自动生成主键 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 问题描述

除了 int 型简单自增主键,用户如何生成个性化主键呢?

例如 UUID32 位的主键,手动填写非常耗费精力。在进行填报时,使用者并不知道数据库中已经有哪些编号,此时如何保证编号唯一,不会覆盖已有数据呢?

1.2 解决思路

FineReport 设计器内置了 UUID() 函数,可通过填报字段的值绑定,继而产生唯一标识码,实现编号的唯一性。

2. 示例编辑

使用 UUID 来生成唯一编号有两种方法,填报属性中使用 UUID 公式和单元格中使用 UUID 公式。

2.1 填报属性中使用 UUID

2.1.1 准备数据

新建普通报表,新建数据库查询,修改名字为「书籍信息入库」,SQL 查询语句为:SELECT * FROM book where id is null

1608712806860374.png

2.1.2 设计表格

1)设计表格样式,将字段拖入对应的单元格,如下图所示:

2)添加填报控件,各控件属性如下:


2.1.3 设置报表填报属性

点击「模板>报表填报属性」,新增内置 SQL 提交,选择提交类型为「插入提交」,不显示原有数据。

智能添加字段,并添加单元格。其中 id 字段为主键,值为公式:UUID(32)。如下图所示:

注:该示例中,主键 id 无需出现在填报页面,因此 id 的值直接使用公式显示。

2.2 单元格中使用 UUID

或者可以在单元格中插入公式 UUID(32),如在 B11 单元格插入公式,在报表填报属性中将 id 的值绑定为该单元格,如下图所示:

1608713519348665.png

注:B11 单元格无需添加控件,使其在填报状态下不可手动编辑。

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 值不一致。如下图所示:

Snag_efe44ec.png

4.1.2 原因分析

这是由于公式编辑界面默认勾选了「填报/分析时,保留公式用于计算」,则填报提交时公式会二次计算,从而导致入库时又重新生成了 id 。

Snag_f01a194.png

4.1.3 解决方案

取消勾选「填报/分析时,保留公式用于计算」即可。

注:仅对单元格使用 UUID 有效。

4.2 提交成功后修改数据

4.2.1 问题描述

填报成功后未刷新页面时修改某条信息,发现其不是直接修改已入库的数据,而是新增一条数据。

4.2.2 原因分析

填报成功后未刷新页面时修改某条信息,虽然页面上 id 值并没有改变,但因公式勾选了「填报/分析时,保留公式用于计算」,每提交成功一次 UUID 就会变化,导致新增多条数据。

4.3.3 解决方案

1)取消勾选「填报/分析时,保留公式用于计算」。

2)将报表填报属性由「插入提交」改为「智能提交」。因为「插入提交」不允许主键 id 有重复值提交,会出现报错,如下图:

1608791683946224.png

注:仅对单元格使用 UUID 有效。

4.3 多个内置 SQL 中使用 UUID

4.3.1 问题描述

如果该填报表是多源填报类型,比如员工基础信息存在表 1 中,员工部门信息存在表 2 中,表 1 与表 2 有相同的字段「员工 ID」,填报时这两张表都要保存「员工 ID」。

4.3.2 解决方案

此时必须在单元格中使用 UUID() 生成员工编号,报表填报属性设置两个「内置 SQL 提交」,分别绑定表 1 和表 2 ,表 1 和表 2 的「员工 ID」字段绑定同一个单元格。

若使用在报表填报属性中每张报表都使用 UUID() 函数,产生的序列号是不一样的,此时会导致员工 ID 不一致的情况。

4.4 外部文件生成UUID并导入

4.4.1 问题描述

当有很多数据保存在 Excel 中,想存入数据库,且没有 UUID 一一对应,此时想要在 FineReport 中填报,一一录入比较麻烦。

4.4.2 解决方案

可以在 Excel 中生成 UUID 后,随着数据一起导入到 FineReport 中进行填报。

Excel 中生成 UUID 公式如下:

=CONCATENATE(IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48)
,CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,
CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),
IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),
CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),"-",IF(RANDBETWEEN(1,2)=1,
CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),
IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),
CHAR(RANDBETWEEN(0,5)+97)),"-",IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,
CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),
IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),"-",IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),
CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,
CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),
"-",IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),
CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,
CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),
IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),
CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,
CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),
IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),CHAR(RANDBETWEEN(0,5)+97)),IF(RANDBETWEEN(1,2)=1,CHAR(RANDBETWEEN(0,9)+48),
CHAR(RANDBETWEEN(0,5)+97)))

注:此UUID的公式生成格式为:600d65bc-948a-1260-2217-fd8dfeebb1cd,若想要生成其他格式的UUID,可参考Excel中自动生成UUID

样式如图:

image.png

无需在 A 列的每个单元格都输入公式,当在 A2 单元格中输入公式后,会自动生成一个 UUID,此时将鼠标放在 A2 单元格的右下角,当出现一个黑色的 + 时,鼠标点击按住并往下拖动,A 列则会自动一一生成 UUID

注:Excel在使用公式生成UUID后,每一次改动都会使得UUID进行变化,所以在导入数据前,尽量确保数据不需要再修改,否则会发生导入的数据与原本的Excel中的数据UUID不一致的问题,所以导入后想改数据的话,建议直接在填报页面或者数据库修改,也可以删除数据库中已经导入的数据,使用Excel重新导入填报。