报表开发中经常要使用一些辅助的隐藏格完成报表的计算,隐藏格功能已然成为报表工具的标配,在一些复杂报表中隐藏格的确为我们带来了诸多便利。然而,报表中引入隐藏格也给报表的开发和维护带来了极大的困难,毕竟大多数需要隐藏格的报表都相对复杂,大量的格间引用和因为隐藏格导致混乱的报表模板对报表开发和维护人员都是不小的挑战。另外,大量隐藏格的应用带来的报表性能问题也经常让用户难以忍受,我们经常看到一些包含隐藏格的报表展现需要几十秒甚至几分钟,显然这不是用户希望看到的。隐藏格的功能似乎成为了鸡肋,有时不得不用,用了又担心这样那样的问题……。

    其实很多需要隐藏行列计算的报表都可以通过集算器来辅助实现,集算器作为独立的计算中间件弥补了报表工具先天计算能力不足的缺陷,通过丰富的类库以及对集合运算的有效支持可以快速完成原来报表需要大量隐藏格辅助的计算,将计算结果输出给报表,报表只需要做简单的数据展现即可,有效避免隐藏行列带来的诸多问题。

    这里来看几个使用集算器改善隐藏行列报表的实例,为了方便说明,我们使用润乾报表直接实现和集算器辅助实现来做比较。

    实例一
     1.1 报表需求
    根据销售管理系统数据统计客户所在地区的订单总额,地区并按订单总额降序排列,要求每个地区中显示销售额在前五名的销售人员及其订单数量和订单金额,其他人员归入“其他”项中。报表样式如下:

用集算器实现隐藏格辅助计算的报表_报表

 

    这里应该注意的是地区分组中如果销售人数少于5个则不显示“其他”项(如上图中的西北地区)。

    1.2 润乾报表直接实现

用集算器实现隐藏格辅助计算的报表_隐藏_02

    C3设置的隐藏行表达式,对于分组成员较多的情况将隐藏大量的报表行,会严重占用内存并影响性能;而D4设置的隐藏行当其所在行隐藏时E4和F4中的表达式仍然执行仍然对性能有影响。
    1.3 集算器实现

    集算器代码

用集算器实现隐藏格辅助计算的报表_润乾报表_03

    A1:建立数据库连接;
    A2:执行sql得到初步汇总订单数据;
    A3:按照地区分组后组内成员按订单金额排序;
    A4-C8:循环A3,取前五名记录,并将超过第五的记录都归入“其他”项,结果写回A3;
    A9:结果按地区总额降序排列后返回给报表。

    报表调用
    数据集设置

用集算器实现隐藏格辅助计算的报表_集算器_04

    采用类存储过程的调用方式,其中“组内排序”为集算器脚本(dfx)名称。

    报表模板及表达式

用集算器实现隐藏格辅助计算的报表_集算器_05

    这里我们注意到集算器采用分步的网格式编码风格代码清晰易读,报表的复杂计算在集算器中完成,报表工具只是做简单的分组和展现,这对于报表模板的维护和报表性能都有不小的改善。

    实例二

     2.1 报表需求
    根据销售记录表计算各销售人员本年销售额和上年销售额,及其增长率,统计客户数与大客户数(订单金额超过10000)。报表样式如下:

用集算器实现隐藏格辅助计算的报表_计算_06

 

    2.2 润乾报表直接实现

用集算器实现隐藏格辅助计算的报表_单元格_07

    这里EF列和第三行最后是需要隐藏的,而E2和F2作为辅助格当客户较多时会出现大量的隐藏行从而影响性能。

    集算器实现则不需要依赖隐藏行。

    2.3 集算器实现
    集算器代码

用集算器实现隐藏格辅助计算的报表_润乾报表_08    A4:针对销售分组,集算器group结果保留了每个分组的成员,可以获取某个分组明细;
    A7-B16:根据指定年份参数循环计算每个销售人员的销售额、增长率等,,并将结果写回A5;
    A18:通过集算器JDBC将A5结果返回报表。

    报表工具调用集算器脚本与报表展现与实例一类似不再赘述,这里值得注意的是虽然集算器代码写了十几行,但由于采用这种分步的编码风格代码结构非常清晰,易读易修改,而且报表端不再需要大量的隐藏行也会提高报表的展现效率。