码迷,mamicode.com
首页 > 其他好文 > 详细

不定列(动态列)报表的数据源处理

时间:2015-03-10 17:22:36      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:动态报表   不定列报表   数据源   集算报表   集算引擎   

       动态列报表是动态报表的一种,在报表应用中很常见。这类报表由于无法事先确定列数,因而无法在报表中使用固定列的表达式,而且更加棘手的是报表数据源的准备,因为SQL不支持不定列的结果集,需要动态拼出SQL语句去执行,有时业务逻辑并不很简单,还需要使用存储过程分步完成。而存储过程对集合运算的支持不够,难以使用中间结果(要用临时表),导致完成这类运算并不轻松。

       http://bbs.csdn.net/topics/390937222?page=1#post-398564938中提到的问题,就是一个比较典型的动态列计算问题,这类计算往往是为前台报表服务的,使用SQL和存储过程都很难完成,而一般的报表工具由于不具备强计算能力,对于这类计算更加无法完成。

       使用润乾集算报表来做则比较简单,集算报表不仅继承了润乾报表在呈现层面处理动态列数据源的能力,而且内置了强大的数据源计算引擎,在运算和格式两方面都能很好地支持动态列报表。

       这里以上述链接中的实际业务为例,给出集算报表的实现方案。

报表背景

       源数据如下:

技术分享

       现需要在报表中以机组为单位,横向排列类别和产量,样式如下:

技术分享

       这个报表的难点在于用SQL或存储过程写起来很困难,而一般报表工具则不具备数据源计算能力,根本无法实现。集算报表本身内置了适合结构化计算的脚本,可以方便地写出数据准备的计算(相当于一种更使用更简单的自定义数据集)。上述报表需求使用集算报表可以这样完成:

编写集算脚本

       首先使用集算脚本编辑器,新建集算脚本,编写脚本完成数据计算,为报表输出计算后结果集。

技术分享

       上述脚本含义:

       A1:连接数据源;

       A2:执行sql从产量表中取数;

       A3:按机组分组,在集算器中分组结果保留了分组结果(成员)以方便后续使用和计算,这个分组结果如下:

技术分享

       A4:求分组中最大成员个数,以确定结果集列数;

       A5-A6:创建结果序表,记录为空;

       A7-B8:循环A3中分组结果,将每个分组中的类别和产量写入新结果序表中;

       A9:为报表返回结果集。

编辑报表模板

       使用集算报表编辑器,编辑报表模板,用于数据展现。新建报表并设置集算器数据集,调用上述编辑好的脚本文件。

技术分享

       其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的。

        

       编辑报表表达式,用集算报表的动态数据源机制完成报表制作。

技术分享

       由于是动态列,在报表中要使用ds.field()函数根据列数来动态取得列数据,第一行和A列为辅助行列,设置其隐藏即可。

 

       报表展现结果如下:

技术分享

       可以看到,比起SQL使用集算器脚本可以快速完成这类动态列报表数据源。而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。

       在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源和参数。本例使用脚本数据集可以这样完成:

       1. 在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;

       2. 在弹出的脚本数据集编辑窗口中编写脚本;

技术分享

       这里可以看到,在脚本数据集中直接使用了报表中定义好的数据源emos,比起单独的集算脚本更加简单、直接。

       3.报表模板和表达式与使用集算器数据集方式一致,不再赘述。


不定列(动态列)报表的数据源处理

标签:动态报表   不定列报表   数据源   集算报表   集算引擎   

原文地址:http://blog.csdn.net/u012388497/article/details/44176581

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!