动态列报表是动态报表的一种,在报表应用中很常见。这类报表由于无法事先确定列数,因而无法在报表中使用固定列的表达式,而且更加棘手的是报表数据源的准备,因为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.报表模板和表达式与使用集算器数据集方式一致,不再赘述。