finereport实现数据替换和重复填报提示

问题

在用finereport做企业web报表时遇到了一个问题,数据填报后无法修改,finereport只提供了填报功能而没有提供修改功能,难道填报数据出错每次都从数据库中删除出错数据吗?这显然不符合规矩

实现数据替换

可不可以在填报是实现对原有数据的更改呢?这样业务人员可以在出错后通过二次填报来替换出错数据。

本来想设置触发器来实现数据的替换,然而在软件上我发现了更为简单的方法,在模板填报属性里我们可是设置主键

例如这张表我主键为组织机构、年份、月份,这样填报时当业务人员选择这三个数据相同时,提交会覆盖原有数据,这样便可实现简易的修改功能。

重复填报提示

前面实现了数据的替换,但业务人员下次填报时可能忘记之前的填报数据,或者选择出错而导致正确的数据被覆盖,如何在填报时提示业务人员提交的数据中含有重复填报的数据,让其选择是否覆盖提交?

一、数据库数据获取

要检查是否有重复数据,当然需要获取数据库原有数据,可在finereport新建数据查询来获取数据库中已有的数据。

我们只需要比较确认该数据唯一性的属性就好了,这里我们需要用到多字段拼接,orcel的字段拼接SQL语句为为

select "组织机构"||"年份"||"月份" as AA from 利润指标情况表

我们拼接组织机构、年份、月份这个联合主键

二、获取填报字段

插入公式CONCATENATE(),该公式用于将多个单元格内容拼接在一起

CONCATENATE(A4, B4,C4)

//A4,B4,C4分别对应填报表中组织机构、年份、月份的单元格

三、校验

第三步将数据库中获取的数据与从填报端获取的数据对比,如果相同则表示填报存在重复的数据,使用公式INARRAY()可以实现

公式表示将I4单元格与获取字段aa对比,存在相同则提示0

官方文档提供的公式在数据库为空时会获取空值,这时该公式会报错,建议使用find()函数避免此类错误。

四、JS交互

通过JS代码来实现业务人员选择是否将该数据提交

在模板web属性中添加事件,设置为校验后

JS代码:

if (fr_verifyinfo.success) {

alert("校验成功");

} else {

if (fr_verifyinfo.info == "I4:0") {

FR.Msg.confirm("警告", "数据重复填报,确认要提交吗?", function(result) {

if (result) {

_g().writeReport();

//强制提交

location.reload();

//刷新页面

}

})

return false;

}

}

效果演示

选择确定便会提交数据,取消不做操作

参考文档:finereport官方帮助文档