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

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

像中提到的问题,就是一个比较典型的动态列计算问题,这类计算往往是为前台报表服务的,使用SQL和存储过程都很难完成,而一般的报表工具由于不具备强计算能力,对于这类计算更加无法完成。

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

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

报表背景

源数据如下:

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

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

编写集算脚本

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

上述脚本含义:

A1:连接数据源;

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

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

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

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

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

A9:为报表返回结果集。

编辑报表模板

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

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

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

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

报表展现结果如下:

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

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

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

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

“人无完人金无足赤”,只要是人就不会是完美的,

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

相关文章:

你感兴趣的文章:

标签云: