【Demo案例】单源报表整合多源数据库
任务
客户的订单数据在ERP系统中,客户信息在CRM系统中,现在需要制作一张报表,用来展示每个客户每年的销售额以及比上年的增长率
报表的数据将来自于2个不同的数据库,可选的报表工具只支持单个数据源,比如iReport,Crystal,Birt,如下图所示:
用编程的传统方法去实现难度较大, 用集算器开发则轻松简单
步骤
- 取数据
在集算器 IDE中设计一个cellset file,进行跨库的运算。
报表通过标准的JDBC接口来访问cellset file
和访问HSQL等内存数据库一样,
cellset 文件名等价于存储过程名
- 实现过程
集算器可以同时连接多个数据源,如下例,连接的是ERP所在的Oracle数据库和MSSQL数据库集算器中可以执行多个SQL,比如A1和A7,数据源的名字用来区分不同的数据库A1和A7的数据经过一系列运算,在A9合并为单个数据集,右侧是A9中具体的数据。A11表示向JDBC输出A9(可以输出多个结果集)因此在报表工具中,仅需要建立1个JDBC数据源,如下图使用的是集算器专用的JDBC Driver和URL接着新建报表,比如选这里的Coffee模板在Wizard中输入SQL。注意:“p4”是cellset file的文件名,这里当作存储过程名来用执行结果如下:之后的制表过程与普通报表没有任何区别,不再详述。 最后我们看一眼最终的报表结果:可以看到,集算器能够实现多源数据的整合。 这是因为集算器提供了SQL的全部能力,并且可以跨库计算。
- 跨库计算
如下例:
A5完成了对Oracle的计算:每年每个客户的订单金额和比上年的增长率;
A7:取出了MSSQL中的客户的ID,Name,CountryA8:将A5和A7按照ID关联起来,
这一步是跨库关联运算,等同于SQL中的left Join语句。当然,SQL只能同库join,而集算器跨库也可以。 右侧是join的结果,点击蓝色字体可以看到内部成员,比如第一行和SQL不同的是,集算器可以将”join”和”select”分成2步,比如A9:在join的结果上再”select”这种分步特别适合复杂的数据库计算,比如A5:每年每个客户的订单金额和比上年的增长率。用SQL必须将复杂的计算一次写出,需要较高的技术能力,分成若干个简单的表达式就容易多了。
- 分步计算
分步计算是集算器的基本能力,如下图所示:A1:原始的订单数据
A2:引用A1,将它按Client分组。查看其中的第3组,如下图所示:如何将每组中的数据按年汇总? 请看A3: 将每个分组按年再分组,并汇总每个小组的销售额。~代表当前成员。 右侧是执行结果:
查看第3组,结果如预期。A4:增加一列,计算比上年的增长率。用业务语言描述就是: (当年/上年)-1
执行,查看结果的第3个成员
注意:sAmount: 当前成员,当年
sAmount[-1]: 上一个成员,上年A5: 将各组的成员合并。 至此,Oracle中的数据处理完毕
可以看到,分步可以将复杂的计算目标,分解成简单的计算步骤。 SQL不直接支持分步,难以用它进行复杂的数据库计算在进行报表的数据准备或数据整理时,常会遇到复杂的数据库计算,此时可以用集算器来解决。除了跨库和分步,集算器还具有网格风格、有序集合、彻底集合化、对象引用等特性。 这些特性使集算器成为更有能力的商业计算开发工具。