http://blog.runqian.com.cn/?p=1476
润乾集算报表提供了多种由报表工具实现(使用SQL拼宽表的方式不属于报表工具的功能,不在讨论范围内)多源分片报表的方式,在保留了原来润乾报表4的单元格关联过滤方式基础上,还额外再提供了脚本宽表方式和对齐定位方式。
单元格关联过滤是指多个数据集对齐通过单元格编写关联表达式完成,这种方式的缺点是效率较低,由于从数据集格要根据每个主数据集格值到数据集中过滤得到,复杂度是平方级,当数据量稍大时性能很低。润乾报表4.x版只提供了这种方式。
宽表方式和对齐定位方式可以很好解决上面提到的问题,在使用时稍有不同。为了比较三种方式的不同,下面分别来看一下实现。
目标报表:
上述报表中,学生基础成绩(绿色)和实习成绩(蓝色)分别来源不同的数据库,现需要将两部分组合显示成如上效果。
单元格关联
集算报表提供了数据集函数,可以在单元格中与其他单元格进行关联。
连接数据源
在报表设计器中分别配置连接两个数据库的数据源:
其中,成绩表来源于demo;而实习成绩表来源于scdb。由于多库,这时不能使用SQL来拼宽表了。
设置数据集
其中ds1为:select 学生ID,姓名,数学,语文,英语 from 成绩表 。
ds2为:select 学生ID,姓名,学校实习,街道实习,敬老院实习 from 实习成绩表 。
编辑报表表达式
A3从ds1中取数,并列表显示;F3表达式为:=ds2.select(学校实习,学生ID==A3),通过学生ID与A3格关联,每个学生都去ds2中过滤一次并找到相应数据。
报表预览可以实现两片分别扩展的效果。这种做法虽然可以实现,但由于对齐关系是单元格之间用表达式各自定义的,这样在实现运算时只能采用遍历方式对齐,复杂度是平方级的,当数据量较大时性能较低。
宽表方式
区别于使用SQL拼接宽表的方式,在集算报表中通过脚本数据集拼接宽表可以解决SQL实现时过于复杂或跨库时无法完成的问题。仍然使用上面例子,来看一下宽表实现。
设置数据集
使用脚本数据集,完成两个数据源关联对齐。
其中,A1和A3分别连接了两个数据源,通过A2和A4从表中分别取数并排序;A5通过排序后的结果拼接成目标宽表。
编辑报表表达式
宽表拼接完成,在报表中就可以像使用单元报表一样完成数据展现。
预览报表即可得到如上效果。这种方式的好处在于使用脚本数据集完成宽表拼接比较简单,脚本允许多步编写大大降低了拼接难度;另外,天然支持跨库运算,这使用原来在SQL中无法实现的宽表拼接得以轻松完成。
对齐定位方式
除了上面使用脚本数据集的做法,在集算报表中还可以将多个数据集按指定规则对齐后通过定位符完成多源分片报表的开发。仍然以上面的跨库多源分片报表为例。
设置数据集
这里设置两个数据集分别从两个库中取数,并排序(对齐):
其中ds1为:select 学生ID,姓名,数学,语文,英语 from 成绩表 order by 学生ID 。
ds2为:select 学生ID,姓名,学校实习,街道实习,敬老院实习 from 实习成绩表 order by 学生ID 。
设置报表表达式
在F3中使用“=ds2[&A3].学校实习”来根据ds1记录的顺序到ds2的相应位置中取数并显示,而后的G3和H3均跟随F3完成相应字段的取数。
在集算报表中:[]写法用于定位取记录的字段,ds[i].F表示当前上下文的ds数据集的第i条记录的F字段,注意ds[i]本身无定义,不能返回记录本身,ds是当前主格限制后的集。
使用这种方式,我们只需要将多个数据集按指定方式对齐,而不需要关联,在报表中通过定位取出相应记录显示即可,可以看到这种方式的实现更加简单方便。
定位方式不改变数据集,在数据集已对齐时更为直观方便。相对来讲,宽表方式适用面更广,不仅适合于数据集已对齐的情况,也可以用脚本将未对齐的数据集对齐,但不如定位方式直观。程序员可以根据实际情况选择使用。