【Demo案例】单源报表整合多源数据库

任务

客户的订单数据在ERP系统中,客户信息在CRM系统中,现在需要制作一张报表,用来展示每个客户每年的销售额以及比上年的增长率

报表的数据将来自于2个不同的数据库,可选的报表工具只支持单个数据源,比如iReport,Crystal,Birt,如下图所示:

用编程的传统方法去实现难度较大, 用集算器开发则轻松简单

步骤

  1. 取数据
    在集算器 IDE中设计一个cellset file,进行跨库的运算。
    报表通过标准的JDBC接口来访问cellset file
    和访问HSQL等内存数据库一样,
    cellset 文件名等价于存储过程名
  2. 实现过程
    集算器可以同时连接多个数据源,如下例,连接的是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的全部能力,并且可以跨库计算。
  3. 跨库计算
    如下例:
    A5完成了对Oracle的计算:每年每个客户的订单金额和比上年的增长率;
    A7:取出了MSSQL中的客户的ID,Name,Country

    A8:将A5和A7按照ID关联起来,


    这一步是跨库关联运算,等同于SQL中的left Join语句。当然,SQL只能同库join,而集算器跨库也可以。 右侧是join的结果,点击蓝色字体可以看到内部成员,比如第一行

    和SQL不同的是,集算器可以将”join”和”select”分成2步,比如A9:在join的结果上再”select”

    这种分步特别适合复杂的数据库计算,比如A5:每年每个客户的订单金额和比上年的增长率。用SQL必须将复杂的计算一次写出,需要较高的技术能力,分成若干个简单的表达式就容易多了。

  4. 分步计算
    分步计算是集算器的基本能力,如下图所示:

    A1:原始的订单数据
    A2:引用A1,将它按Client分组。查看其中的第3组,如下图所示:

    如何将每组中的数据按年汇总? 请看A3: 将每个分组按年再分组,并汇总每个小组的销售额。~代表当前成员。 右侧是执行结果:


    查看第3组,结果如预期。

    A4:增加一列,计算比上年的增长率。用业务语言描述就是: (当年/上年)-1
    执行,查看结果的第3个成员


    注意:sAmount: 当前成员,当年
    sAmount[-1]: 上一个成员,上年

    A5: 将各组的成员合并。 至此,Oracle中的数据处理完毕


    可以看到,分步可以将复杂的计算目标,分解成简单的计算步骤。 SQL不直接支持分步,难以用它进行复杂的数据库计算

    在进行报表的数据准备或数据整理时,常会遇到复杂的数据库计算,此时可以用集算器来解决。除了跨库和分步,集算器还具有网格风格、有序集合、彻底集合化、对象引用等特性。 这些特性使集算器成为更有能力的商业计算开发工具。