功能简介
标题填报功能可以将页面数据写入到数据库,包括数据的增加、删除和修改操作。同时也支持对填写数据的自定义校验,excel导入数据,根据填写值智能联动等功能。
标准流程
填报报表制作流程:
- 报表设计
- 添加填报控件
- 设置填报属性
- 设置填报页面
- 填报预览
填报模板设计规范
1.尽量不做成类excel模板,此类模板在后期维护和预览性能方面会有比较大的隐患。
类Excel模板是指假设第一列每行都是一个分类名,第二列添加限制条件根据第一列内容筛选,这样在后续的修改中面临一个一个修改的情况,工程量巨大。而且丧失了扩展属性。
2.扩展行较多的情况下,不使用sql函数,不开启直接显示控件。原因是sql函数会多次执行影响计算速度,直接显示控件会增加页面渲染压力。
3.星填报JS不容易获取单元格,不支持的JS过多。但是渲染速度快。在行数不多的情况下建议使用普通填报。
行式填报
(1)如果只想向数据库提交自定义的数据,则无需将数据列拖入 A2~I2 ,可直接在空白单元格上添加填报控件。
(2)如果想要将数据集中的数据提交入库,而没有修改和新增数据的需求,可以将数据列拖入单元格,无需添加填报控件。
提交有 2 种方式:内置SQL和自定义提交,2 种提交方式的区别如下:
(1) 内置SQL提交
将填报页面数据跟数据库表的字段绑定,在点击提交后按照设置将数据入库。其底层逻辑为使用 JDBC 方式执行常规的增删改 SQL 语句
需要将填报数据的单元格与数据库表字段进行绑定,确保填报的数据可以录入到对应的数据库表字段下。
注:多个内置SQL的执行顺序为从上到下,串行执行。多个内置SQL属于同一个事务,如果其中一个执行失败,所有内置SQL都会回滚。
(2) 自定义提交
自定义提交:点击提交时,获取到填报页面的数据进行自定义的处理,比如上传到某个接口。需要通过编写java实现。
内置校验:用户可通过自定义的校验公式来对页面数据进行校验,也可以自定义校验出错时的提示语。
自定义校验:一些特殊的业务逻辑用公式校验实现起来比较复杂,希望可以交付给用户自定义的程序来判断,然后将结果返回给
FineReport进行提示。需要通过编写java实现。
提交类型:1.智能提交
1.智能提交将插入、更新、删除操作三合一。
2.更新和删除必须设置主键,类似于where的作用,去找到数据,如果没有主键只能实现插入功能。
3.如果用插入行插入了空白行,但对空白行没有进行编辑,那么这些记录的值都会被识别为 null。对于这种记录,在提交时会被过滤,不会入库。
4.数据入库后的顺序和页面展示顺序不保证一致。
2.删除提交
(1)删除提交留下的才是删除的数据,而不是删掉的行。
(2)删除提交只需要添加主键字段即可,其他非主键字段添加与否对结果没有影响
(3)删除提交只能用来删除数据。如果只有删除数据的需求,可以选择删除提交。
3.插入提交
(1)插入提交只能用来插入数据。如果只有插入数据的需求,可以选择插入提交。
(2)不会对数据重复性做判断,意味着可能会入库重复数据。如果数据库本身限制了不能有重复数据,则提交时会有相关报错。
4.更新提交
(1)更新提交没有主键和全是主键均不会执行,因为更新提交是找到数据库中和主键字段相同的值进行更新,全是主键就没有意义了。
(2)删除行删掉的数据仍然会进行更新。
提交条件
提交条件可以对提交入库的数据进行过滤,满足这个条件的数据可以入库,不满足的不予入库。
提交条件只会在提交的时候过滤掉不符合条件的数据,并不会终止提交过程,这一点和数据校验是不一样的。
数据校验
数据不符合要求会中止提交过程并提示,且会中止所有数据提交。(和提交条件的区别)
分为内置校验和控件校验两种方式;
控件校验:对控件进行属性设置
内置校验:有遍历过程,例如A2>!,遍历所有A2单元格里的数据。
插入删除行
分为工具栏和按钮
想插入的行必须是可扩展的。
工具栏插入必须选择第一列,否则就会出现如图这样以第一列为大类的插入。
注意:
(1)删除行按钮中不能设置提交事件,会有逻辑冲突问题。如果要设置,必须使用普通按钮。
(2)删除行按钮的删除只是将数据从页面上删除,不会和数据库有交互。如果希望删除行的同时将该数据从数据库中一并删除(JS实现删除时二次确认)
1)插入删除行会对页面上所有的公式进行重计算,页面会有一个刷新效果。所以如果页面本身加载速度较慢,比如开启了直接显示控件或者用了sql函数等,那插入删除行的速度也会变慢。
2)插入删除行会触发页面的加载结束后事件。
3)插入的行中单元格的值会受到插入行策略的影响
插入行策略
原值,空值,默认值
原值的意思是,插入数据会继承上一行的公式,例如=now()单元格设置成原值,则点击插入,则下一行也会显示当前时间。
但是当点击插入时,所有数据的时间都变成了当前最新时间,这是因为之前的页面会重新计算所有的公式。
错误解决方法:首先将重新计算的勾选给取消,但是发现所有时间都不是最新的了。
正确解决方法:设置默认值,以公式的方式加入now函数
根据控件值自动匹配数据
1.使用 value()函数 实现。支持扩展场景,性能较好。(要求jar包日期在2021-08-01及之后,否则插入行无法联动)
2.使用 ds1.select()函数 实现。支持扩展场景,性能较好。
3.使用 SQL()函数 实现。支持扩展场景,但大数据量下性能较差
例子:
B3:value(“ds1”,“产品名称”,“产品ID”,A3)
B3:ds1.select(产品名称,产品ID=A3)
B3:sql(“FRDemo”,“select 产品名称 from 产品 where 产品id=”+A3,1,1)
注意:人工输入数据会将select公式覆盖,所以后续公式就不会再生效。
填报控件数据字典联动:
跨sheet联动:
Excel导入
一.Excel导入逻辑:
(1)根据位置匹配
会将Excel中数据1:1导入模板(在Excel和预览完全一致时触发)
例子:一般是自由填报报表
(2)根据标题匹配
对标题进行比较,当标题一致时导入该列数据(当有2列以上才会触发)
(3)根据单元格位置匹配
当标题匹配失败或者设置了只能单元格匹配时才能触发。该匹配按照Excel列顺序进行导入,当该匹配失效时才会进行位置匹配。
二.普通导入:
一种覆盖式导入(默认标题匹配)
三.双向扩展格导入:
在有横向扩展时,需要开启双向扩展格导入。
四.Excel自定义导入:
(1)当前sheet:可以针对每个sheet设置不同的导入配置。需要注意的是,该设置并不是可以自由选择某个sheet进行导入的意思。在多sheet导入场景下,Excel和模板的sheet数以及sheet位置必须一致才可以全部导入。
(2)编辑导入sheet:选择需要导入的sheet,未勾选的sheet不会被导入。
(3)标题行:设置 Excel 中标题行是哪几行,标题行不会被导入,该选项为必填项,如果 Excel 无标题则都填 0。
注:如果标题行都填了0,则会走普通 Excel 导入的逻辑,(标题匹配)
否则会统一按照单元格位置匹配逻辑来进行导入。(单元格匹配)
(4)数据行:非必填。如果不填,默认导入除标题行外的所有数据;如果只填起始行,则导入该行及其后所有数据;如果只填结束行,则导入该行及其之前的数据。
注:如果数据行不填,则会走普通 Excel 导入的逻辑,
否则会统一按照单元格位置匹配逻辑来进行导入。
(5)数据列:勾选的列导入,不勾选列的不导入。当模板单元格存在公式时,如果导入了数据则会把公式覆盖,导致后续无法联动计算。但如果使用自定义导入,不导入该列数据,则可以保留公式用于计算。
五.Excel多次导入包括了三种形式:清空导入,覆盖导入,增量导入。
注:若文本控件所在单元格中插入了数据列,需要将数据设置改为列表
导入区域单元格应该设置成可扩展,而其他单元格不需要
清空导入:适用于导入前需要清空原有页面数据的场景。
该清空是清空页面原有数据,而不会影响到数据库。
覆盖导入:适用于希望导入数据能覆盖同位置数据,而不影响其他数据的场景。
增量导入:适用于希望在原有数据下方进行导入数据的场景。
六.Excel导入显示值转换
通过Excel导入逻辑配置插件+数据字典实现;
可以通过自定义样式将格式显示成自己想要的格式,但是填入数据库的实际值格式没有变化,这种问题我们可以通过在属性格式中设置格式转换公式完成。