某报表系统中有部分报表需要按照一定规则显示数据,如:显示查询日期范围内的奇数日数据,要求数据库中即使无记录该日期也显示(内容为空)。                             

集算器实现无数据源的规则报表_润乾报表


    本文重点来实现奇数日期序列,数据区不是重点,故置空。

    以上述报表需求为例,本文介绍3种实现方法——报表工具直接实现、SQL辅助实现、集算器辅助实现。

报表工具直接实现

以润乾报表为例,考虑跨年和跨月份的情况

集算器实现无数据源的规则报表_润乾报表_02

集算器实现无数据源的规则报表_润乾报表_03

    使用时要对辅助列A列进行隐藏,以及对第2行进行条件隐藏,所以报表工具实现要依靠大量隐藏行列。

SQL辅助实现

    通过sql可否输出奇数日期呢?也有点麻烦,以oracle为例实现。

select D
from (select to_date(
'2013-11-10', 'yyyy-mm-dd') + C as D
       from (selectrownum Cfrom dual connectbyrownum<=
5))
wheremod(to_number(to_char(D,
'yyyymmdd')), 2) = 1;

这个写法看起来并不长,但要用到多层子查询和oracle的层次查询语法(connect by),该语法只有oracle支持,换一种数据库就不能工作了。而且这种写法并不是很容易想出来,有相当的难度。

集算器辅助实现

    那么可以良好支持集合运算的集算器能否更简单些呢?来看具体实现。

集算器实现无数据源的规则报表_集算器_04

   A1:列出起止日期段中的所有日期

   A2:选出奇数日

   A3:为报表返回结果集

 

这个算法和上述方法一致,但代码简单程度优越许多,同样适用跨年或跨月份的情形。这种分步书写代码(先列出所有日期,再过滤)也降低了实现难度。在脚本编辑器中随时可见的结果也为开发人员编辑调试代码提供了极大的方便。