反馈已提交

网络繁忙

使用UUID自动生成主键

  • 文档创建者:郁金香
  • 编辑次数:12次
  • 最近更新:星踪 于 2021-08-05
  • 1. 概述

    1.1 问题描述

    填报时没有特定的字段作为主键,希望能自动生成一串随机字符来作为主键,且不能重复。效果如下图 ID 字段:

    Snag_14e13d0a.png

    1.2 解决思路

    FineReport 设计器内置了 UUID 函数,设置填报属性时,主键的值可以使用该函数,产生唯一标识码,实现编号的唯一性。


    2. 示例

    2.1 准备数据

    新建数据集 ds1,SQL 语句为:SELECT * FROM book

    2.2 设计填报表格

    1)将数据集中的字段拖到 A2~E2 单元格中,F2 和 G2 单元格添加 自定义的插入删除按钮,如下图所示:

    Snag_14f1a1b2.png

    2)表格设计好后,先填报预览看下,发现表中原来就是有数据的,且 ID 字段下也有随机字符串。

    现在想要让表中已有的 ID 保持不变,插入新数据时可以生成新的 ID,那么使用 UUID()函数该怎么去实现呢?
    Snag_14fcd2df.png

    2.3 设置填报属性

    给报表添加内置 SQL 提交,具体设置如下,其中 id 这个主键字段的值设置为公式:if(len(A2)=0,UUID(32),A2)

    公式的含义是,如果是插入的新行,那么使用 UUID() 函数自动生成随机字符串,提交时入库。如果是已有的数据行,这些数据行的 id 保持不变即可。

    1622534387529018.png

    2.4 效果预览

    1)保存报表,点击填报预览,新增三行数据,ID 字段空着,其他字段填写下,填完后点击提交。

    Snag_15088560.png

    2)刷新页面,可以发现,空着的 ID 字段通过填报属性 UUID 公式自动生成了字符串,原来已有的 ID 也没变。

    Snag_150e8dc0.png

    注:支持 App 端和 H5 端预览。

    3. 模板下载

    已完成模板参见:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Form\使用UUID自动生成主键.cpt

    点击下载模板:使用UUID自动生成主键.cpt


    4. 注意事项

    4.1 页面与入库id不一致

    单元格使用 UUID 公式时,填报预览界面得出的 id 值与入库的 id 值不一致。如下图所示:

    1608790400944144.png

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

    1608790620414502.png

    解决该问题,只需要取消勾选 UUID() 所在单元格公式设置界面的「填报/分析时,保留公式用于计算」。

    4.2 提交成功后修改数据

    填报成功后,如果没刷新页面直接修改了某条信息,会发现提交后新增了一条数据,而没有正常更新原数据。

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

    解决该问题,需要取消勾选 UUID() 所在单元格公式设置界面的「填报/分析时,保留公式用于计算」。

    4.3 数据集预览时id列不显示

    填报成功后,数据库表中可以看到 id 列已有数据,但在设计器中点击数据集预览时,id 列没有显示,如下图所示:

    1608794609683304.png

    这是由于 FRDemo 中 book 表中的 id 字段类型为 blob 类型,不支持数据集预览。

    想要让 UUID 生成的随机字符可以正常显示。需要先将数据表清空,再将 id 字段类型修改为 text 或者字符串类型,填报成功后预览即可显示。

    但是需要在表清空的情况下修改才生效,因为设计器会在填报第一条数据时判断其字段类型,第一次判断之后,再修改表字段类型不会影响数据集预览显示。

    4.4 多个内置 SQL 中使用 UUID

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

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

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

    附件列表


    主题: 填报应用
    • 有帮助
    • 没帮助
    • 只是浏览

    售前咨询电话

    400-811-8890转1

    在线技术支持

    在线QQ:800049425

    热线电话:400-811-8890转2

    总裁办24H投诉

    热线电话:173-1278-1526

    文 档反 馈

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭