1. 概述编辑
1.1 问题描述
除了 int 型简单自增主键,用户如何生成个性化主键呢?
例如 UUID32 位的主键,手动填写非常耗费精力。在进行填报时,使用者并不知道数据库中已经有哪些编号,此时如何保证编号唯一,不会覆盖已有数据呢?
1.2 解决思路
FineReport 设计器内置了 UUID() 函数,可通过填报字段的值绑定,继而产生唯一标识码,实现编号的唯一性。
2. 示例编辑
使用 UUID 来生成唯一编号有两种方法,填报属性中使用 UUID 公式和单元格中使用 UUID 公式。
2.1 填报属性中使用 UUID
2.1.1 新建数据集
新建数据集:书籍信息入库
SELECT * FROM book
where id is null
2.1.2 模板设计
1)设计模板主体页面,如下图所示:
2)添加填报控件,各控件属性如下:
2.1.3 添加报表填报属性
点击模板>报表填报属性,新增内置SQL
选择提交类型为插入提交,不显示原有数据
添加字段,并添加单元格。其中 id 字段为主键,值=UUID(32)
如下图所示:
注:该模板中,主键 id 无需出现在填报页面,因此 id 的值直接使用公式显示。
2.2 单元格中使用 UUID
或者可以在单元格中输入公式=UUID(32),在报表填报属性中将 ID 的值绑定为该单元格,如下图所示:
注:此时可以设置该单元格无控件属性,在填报状态下不可手动编辑。
2.3 修改行时不新增数据
上述方法使用了插入提交,新增信息的 ID 值不会重复
但用户如需修改某条信息,填报每提交成功一次 UUID 就会变化,保存多次的情况下,导致新增多条数据。
为了避免这种情况,可以修改填报属性,将 ID 的值设为公式=if(isnull(B11),UUID(32),B11)
注:if(isnull(B11),UUID(32),B11)表示当 B11 单元格中有值时,就修改该条数据;没有值时,就生成唯一的编号新增一条数据。
2.4 多个内置 SQL 中使用 UUID
如果该填报表是多源填报类型,比如员工基础信息存在表 1 中,员工部门信息存在表 2 中,表 1 与表 2 有相同的字段员工 ID,填报时这两张表都要保存员工 ID。
此时必须在单元格中使用 UUID() 生成员工编号,报表填报属性表 1 和表 2 的员工 ID字段绑定同一个单元格。
若使用上述方法 2.1 在报表填报属性中每张报表都使用 UUID() 函数,产生的序列号是不一样的,此时会导致员工 ID 不一致的情况。
2.5 外部文件生成UUID并导入
有时会遇到如下情况:很多期初数据保存在Excel中,但是想存入数据库,且没有UUID一一对应,此时想要在帆软中填报时,一一录入比较麻烦,则可以在Excel中生成UUID后,随着数据一起导入帆软中进行填报
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
样式如图:
无需在A列的每个单元格都输入公式,当在A2单元格中输入公式后,会自动生成一个UUID,此时将鼠标放在A2单元格的右下角,当出现一个黑色的+时,鼠标点击按住并往下拖动,A列则会自动一一生成UUID
注:Excel在使用公式生成UUID后,每一次改动都会使得UUID进行变化,所以在导入数据前,尽量确保数据不需要再修改,否则会发生导入的数据与原本的Excel中的数据UUID不一致的问题,所以导入后想改数据的话,建议直接在填报页面或者数据库修改,也可以删除数据库中已经导入的数据,使用Excel重新导入填报。
3. 效果查看编辑
3.1 PC 端
保存模板,点击填报预览,填报如下信息,点击提交。
查看数据库,可以看到 32 位 id 正确生成,填写的内容也正确入库。如下图所示:
3.2 移动端
该功能支持移动端填报。
3.2.1 HTML5
3.2.2 App
4. 已完成模板编辑
已完成模板,可参考%FR_HOME%\webroot\WEB-INF\reportlets\doc\Form\填报报表之主键生成.cpt
点击下载模板:填报报表之主键生成.cpt