润乾报表需求实现+性能优化案例之一
随着润乾报表应用的日益普及,在IT项目中报表比重的日益增加,用户提出的性能要求和业务需求也越来越多。近期在做一个客户的报表DEMO,碰到了一个性能+业务需求的简单案例,在这里记录下来和各位同仁分享一下。
经过SQL整理,报表用到的结果集结构如下:
客户的表样设计后展现效果如下:
该报表中有两个参数:初始时间和结束时间,在查询界面上,根据初始和结束时间,报表需要查询出该段时间内每天4个班次、早班和晚班的产量,并将其汇总。
客户的具体需求如下:
1、出于报表样式统一的需要,如果查询时间区间内没有某个班次的数据,也必须将该班次列出。
2、在报表下方除了早晚班的合计,还需要增加当日四个班次早晚班的总合计。
3、查询超过两个月范围时,数据展现较慢,需要提升报表的展现效率。
4、按照每日为系列,每日产量汇总做统计图,查看时需根据用户选择的时间区间,动态获得区间内有产出的日期,用户可对该区间内日期的数据进行筛选显示。
用户自行设计的模板打开原始结果如下:
我们来看第一个需求:查询时间区间内没有某个班次的数据,也必须将该班次列出。
很明显,如果查询时间区间内数据集没有某班次的数据,则使用ds1.Group(WORKGROUP,false)这种方法是无法获得班次数据的,因为数据集中就没有该班次的数据,因此只能通过list函数将4个固定班次进行枚举。即A3单元格表达式修改为:list(“一班”,”二班”,”三班”,”四班”)
再来看B3单元格,用户的原始写法为:
if(ds1.select(CONFIRMVALUE)!=null,ds1.select(CONFIRMVALUE)+”吨”,null)
该写法存在两个问题:第一个问题是效率,每次生成一个B3单元格,都需要做两次数据集的select操作,且做非空判断时,NVL函数较IF函数更有效率,第二个问题是该单元格未将值和显示值区分开,为以后的合计统计带来了不必要的麻烦,在C3、B4单元格做汇总统计时,因为B3单元格做了字符串拼接处理为字符串,因此只能再调用数据集的SUM方法查一次数据获得汇总值,降低了效率。同时考虑到未来可能会将该值入库保存,如果是这种写法,则数据库中该字段的数据类型只能是VARCHAR类型,不符合数值类型字段的数据库设计逻辑。加上A3单元格从数据集改为了枚举,数据集层面的关联已经不存在了,必须修改为和A3单元格关联。
所以修改B3单元格公式为: nvl(ds1.select(CONFIRMVALUE,,WORKGROUP==A4),null),同时设置B3单元格显示值为if(value()!=null,value()+”吨”,”—-”)
根据B3单元格的公式调整,调整C4单元格和B5单元格的表达式为: sum(B4{}),调整C5单元格的表达式为:sum(B5{})
通过上述设置,不但解决了用户的需求1,同时在B4,C4,B5,C5四个格子中,分别减少了一次和数据库的交互操作,有效提升了该报表的展现效率。将显示值和数据的区分处理,不仅为以后改为填报表留下足够的扩展空间,同时也使得展现结果较为友好。
再来看需求2:在报表下方增加当日四个班次早晚班的总合计。
只需要在报表下方增加一行,在B6单元格设置表达式为sum(B5{}),同时修改该单元上主格为B2即可。如下图:
再来看需求4:按照每日为系列,每日产量汇总做统计图,查看时需根据用户选择的时间区间,动态获得区间内有产出的日期,用户可对该区间内日期的数据进行筛选显示。
先将需求一分为二:首先是按照每日为系列,每日产量汇总做统计图。在报表下方增加一行,在B7单元格设置统计图,分类轴为B2,系列值为B6,上主格为`0, (未设置为B1单元格,因第一行只为调试需要,后面会删除)如下图:
在展现后发现,如果由报表自动进行统计初始和结束值的划分时,图形上趋势变化并不明显:
和客户沟通后得知,客户的日产量在1000-1050吨之间浮动,因此调整统计图的统计初始值和结束值分别为1000和1050后效果如下:
需求4的第二部分:查看时需根据用户选择的时间区间,动态获得区间内有产出的日期,用户可对该区间内日期的数据进行筛选显示。
首先需要增加一个新的参数,用来记录参数区间内的日期,其类型为日期组:
设置参数模板,用来传递这三个参数,模板如下:
在该模板的F1单元格中,设置填报属性中的编辑风格,在WEB特性中设置F1的关联单元格为B1和D1,并将关联表达式设置如下:recordtime >= B1.toString() && recordtime <= D1.toString(),最后还要设置下拉数据集控件为“允许多选”和“增强控件”。
回到主模板,修改B1单元格,将其表达式设置为:ds1.Group(RECORDTIME,false,RECORDTIME in (@arg3))
从主模板进入,其效果如下:
根据前两个条件,选出日期动态生成,点击查询后,结果如下:
根据客户反馈,经过上面的步骤,该报表在需求上满足了用户的要求,同时在性能上也快了很多。我再此抛砖引玉,希望同仁们提出宝贵意见。
注:
1、附件中ycJGLold.raq为客户原始模板,ycJGL.raq为修改后主模板,ycJGL_arg.raq为参数模板。
2、日期的动态级联查询,必须使用润乾最新的V4.5.3版本,并更新2011年5月13日的REPORT4.JAR包后才能正常显示。
3、因ROS不支持外网访问黏贴图片,本文中用到的图片无法在文章中显示,可查看上传附件中的WORD文档。