帆软填报报表实现日期自动生成总结



文章目录

  • 帆软填报报表实现日期自动生成总结
  • 业务需求
  • 思考过程
  • 使用sysdate
  • 使用触发器
  • V1 版本
  • 创建时间设置
  • 更新时间设置
  • 填报报表设置
  • 小bug修复
  • V2版本


业务需求


主管让我使用帆软填报报表在实现任务填报的同时,能够能有几列来记录创建和修改的一些日期,如下图所示。

帆软报表日期控件JavaScript脚本_帆软

*如果看解决方案的话,直接跳到最后实现就行了,不需要看我的解决思路。

思考过程


使用sysdate


刚开始我觉得创建时间和更新时间的自动生成十分容易,只需要使用Oracle数据库的一个特性,在建表的时候给日期一个 sysdate 的默认值就可以实现,如下图所示。

帆软报表日期控件JavaScript脚本_FineReport_02

在数据库使用insert语句正常插入的时候可以正常使用,生成对应的日期,但是使用填报报表填写数据的时候,插入数据字段的时候两个默认值为sysdate的字段都没有自动生成,于是我就只能采用其他的方法。

使用触发器


Oracle自动生成日期的方法有两种,sysdate和触发器,于是我就写了一个触发器来实现日期的自动生成,在数据库层面使用触发器来给日期字段赋值sysdate,代码如下所示。

CREATE OR REPLACE trigger XXXX_TR
BEFORE INSERT on XXXX for each row
begin
     :new.CREATION_DATE := sysdate;
    :new.LAST_UPDATE_DATE := sysdate;
end;

使用触发器后,报表填入数据的时候能够实现数据库数据的正常插入了,那只要刷新一下就可以回显到报表上了,我表示非常开心,然后询问了一下导师如何实现更新日期的操作😁 导师指出了我索引命名的不规范,并请教了一下主管如何正确的命名,结果主管否定了我使用触发器生成日期的方法,可能是由于触发器不好维护的方法,于是我又只能另寻其他方法来解决,日期自动生成的问题。

V1 版本


创建时间设置


创建时间的显示值设置

帆软报表日期控件JavaScript脚本_javascript_03

函数解释: 如果没有创建日期,则完成日期的自动生成,如果已经有日期,则不改变

帆软报表日期控件JavaScript脚本_帆软_04

创建时间单元格设置插入行策略

帆软报表日期控件JavaScript脚本_报表_05

更新时间设置


更新时间的设置和创建时间差不多,先对显示值进行创建

帆软报表日期控件JavaScript脚本_FineReport_06

然后同样设置插入行策略

帆软报表日期控件JavaScript脚本_自动生成_07

填报报表设置


填报报表属性设置数据未修改不更新

帆软报表日期控件JavaScript脚本_帆软_08

帆软报表日期控件JavaScript脚本_帆软_09

添加一个填报成功后的JS脚本,让报表提交后自动刷新

//在 填报成功 后自动刷新
location.reload();

小bug修复


使用以上方法基本可以实现日期自动生成和自动更新,但由于使用的是插入行策略,而帆软报表在数据库没有数据的时候,会给你一个默认的空白白行,这条数据不是你手动点击插入数据进行添加的,所以不能触发插入行策略,解决方法也很简单,只需要手动删除数据删除掉那行,在进行一次手动插入数据,新插入的行也可以自动生成日期了,但这对用户来说不是特别的友好,于是我使用代码的方式进行了修改,如果有更好的解决方式,希望能在下面评论指点指点我。

  • 首先,我用JS判断数据库是否拥有数据,但由于公司服务器端设置了脚本限制,我无法使用脚本执行SQL获取数据,于是我采用了其他的方法。设置一个单元格来获取主键的值,然后通过设置单元格的条件属性进行隐藏来保证页面的美观,最后在通过获取单元格的值来判断是否为空数据库,如果为空就进行赋值。单元格设置如下。
  • 帆软报表日期控件JavaScript脚本_javascript_10

  • 设置公式为 1=1 保证能够实现,然后通过设置行高为 0 来进行单元格的隐藏
  • 帆软报表日期控件JavaScript脚本_FineReport_11

  • 接着就通过 JS 获取单元格的值,判断是否为第一行,然后进行赋值,这里JS没有快速获得日期的函数,于是我就使用了一个帆软的模板函数来设置日期,然后通过JS参数进行调用。
function() {
    //获取单元格的值
    var v1 = _g().getCellValue(0, 0, 2);
    //判断,若为空,代表没有值,使用js对单元格进行赋值
    if (v1 === '') {
        _g().setCellValue("S2", "${date}");
        _g().setCellValue("T2", "${date}");
    }
}

这样就可以实现完整的自动生成和更新日期了

V2版本


上诉方法通过新插入行的方式进行判断,而填报默认第一行的新插入行为空,所以需要写多余的JS去判断是否为第一行,如果是第一行就自动生成日期,这大大增加代码的维护难度,所以尽量少的使用JS变成了我们需要做的事情,于是在经过几个版本的迭代后,我总结了V2版本,实现方法如以下所示。

创建人,更新人,创建时间,更新时间四个字段都添加条件属性,使用公式LEN($$$) = 0判断是否为空,为空就自动给创建人附上新值,创建时间和更新时间都使用公式赋值NOW()创建人和更新人用公司赋值$fine_username

帆软报表日期控件JavaScript脚本_自动生成_12

帆软报表日期控件JavaScript脚本_javascript_13

帆软报表日期控件JavaScript脚本_javascript_14

按照以上的步骤就能实现创建记录的时候,自动生成相关信息了,接下来是让创建信息进行自动修改,打开模板->报表填报属性

帆软报表日期控件JavaScript脚本_自动生成_15

勾选未修改不更新(如果有用到公式最好写在单元格内,不要在报表填报属性内写,否则就不能实现未修改不更新了)

帆软报表日期控件JavaScript脚本_FineReport_16

在两个数据列内维护当前用户和当前时间,一样用now()和$fine_username(不要和数据列在同一行,最好在标题行维护)

帆软报表日期控件JavaScript脚本_报表_17

然后将提交进数据库的时间和更新人字段绑定对应时间和字段所在的单元格即可。

帆软报表日期控件JavaScript脚本_报表_18


NOW()这个时间是由进入当前报表的时间确定的,所以最好在每次提交的时候刷新一下页面,保证每次提交的时间相对准确,提交刷新页面可以使用JS来实现。

帆软报表日期控件JavaScript脚本_报表_19

选择模板Web属性后->填报页面设置于,然后选择为该模板单独设置

帆软报表日期控件JavaScript脚本_javascript_20

事件设置添加一个填报成功的JS函数,JS代码如下所示。

location.reload();