交互分析过程中报表多层钻取的情况很常见,如从一级汇总数据钻取到二级汇总数据,从二级汇总数据钻取到三级汇总数据….,钻取时可以从表格到表格,也可以从统计图到统计图。开发这类报表时如果每个层级都需要制作不同的报表,在层数较多时,无论对于开发还是维护都是很麻烦的事,如果能制作一个通用的模板完成所有层级报表的展现则事半功倍。
润乾集算报表通过内置的集算引擎可以快速完成多层钻取通用报表模板的开发。下面通过一个示例说明使用过程。
多层钻取往往在一个维度上逐级细化,如这里我们以订单表中5个地区层级为例(可以扩展到N层),每个层级对应订单表中的一个字段,分别是:大洲、国家、地区、省、市。要求:统计某年份下不同层级的订单金额,若未指定层级则默认统计各大洲情况。以下为实现过程:
首先使用集算脚本编辑器,新建集算脚本,设置脚本参数年份和统计层级。
其中,level参数为报表传递过来的层级参数,其值是以逗号分隔的字符串,计算时是以其为过滤条件,统计下一层级数据,举例来说:当level为空,代表汇总大洲数据;当level为”亚洲”,则汇总亚洲下的各国家数据;level为”亚洲,中国”,则汇总亚洲中国的各地区数据,依次类推。
编写脚本,通过集算脚本的强计算能力,拼接动态分组汇总的SQL,完成上述计算,为报表返回目标结果集:
脚本含义解释如下:
A1:连接数据源;
A2:将逗号分隔的层级参数level转为序列,如:
B2:序列长度;
A3:列举将所有层级相关字段,其顺序与level值一致;
A4:拼接level值对应的SQL中过滤条件,如:
A5:分组字段,如果level为空,则按大洲分组,否则按下一级地区分组
A6:拼接完整SQL,包括处理A4生成结果中的逗号,如:
A7:执行SQL完成汇总计算,得到如下结果:
B7:关闭数据库连接;
A8:为报表返回结果集。
编辑报表模板
结果集已经通过集算脚本计算出来了,接下来使用集算报表编辑器,编辑报表模板,完成通用模板开发,首先设置报表参数:
其中,flag为动态参数,用于标识当前钻取的层级,便于钻取到最末层时停止钻取,其值表达式为:count(split(level,","))
设置集算器数据集,调用上述编辑好的脚本文件。
其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的。
数据报表和图形报表在报表模板设置上有所不同,分别如下:
编写报表表达式:
由于报表中维度字段动态变化,所以在A2中使用了#1代表数据集ds1中的第一个字段。
在设计器右侧的属性面板中设置A3超链接:
图形超链接表达式为:
if(@flag>=4,"/reportJsp/showReport.jsp? rpx=/tongji3.rpx&year="+@year+"&level="+@level,"/reportJsp/showReport.jsp?rpx=/tongji3.rpx&year="+@year+"&level="+if(@level==null,@level,@level+",")+A3)
其中判断了当钻取到最底层不再钻取。
发布报表,访问:http://192.168.1.103:6666/demo/reportJsp/showReport.jsp?rpx=tongji3.rpx,在页面上可以看到如下图展现效果:
点击亚洲,查看亚洲各国汇总情况,如下图:
点击中国,查看中国各地区汇总情况,如下图:
点击华北,查看华北各省汇总情况,如下图:
点击河北,查看河北各市汇总情况,如下图:
编写报表表达式,并设置统计图:
由于报表中维度字段动态变化,所以在A2中使用了#1代表数据集ds1中的第一个字段。
A4统计图属性如下:
切换到“显示外观”选项卡下,设置图形超链接:
图形超链接表达式为:
=if(@flag>=4,"#","{APPMAP}/reportJsp/showReport.jsp?rpx=/tongji2.rpx&year="+@year+"&level="+if(@level==null,@level,@level+",")+"@category")
发布报表,访问:http://192.168.1.103:6666/demo/reportJsp/showReport.jsp?rpx=tongji2.rpx,在页面上可以看到如下图展现效果:
点击亚洲,查看亚洲各国汇总情况,如下图:
点击中国,查看中国各地区汇总情况,如下图:
点击华北,查看华北各省汇总情况,如下图:
点击河北,查看河北各市汇总情况,如下图:
可以看到,在集算脚本的帮助下可以快速完成这类多层钻取图表的开发。而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。
在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源和参数。本例使用脚本数据集可以这样完成:
1. 在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;
2. 在弹出的脚本数据集编辑窗口中编写脚本;
这里可以看到,在脚本数据集中直接使用了报表中定义好的数据源mysql和参数year和level,比起单独的集算脚本更加简单、直接。
3.报表模板和表达式与使用集算器数据集方式一致,不再赘述。