解决报表特殊布局的若干示例

  有些特殊布局难用报表工具提供的功能直接实现,但如果准备出合适的数据源,就能大大降低报表设计的难度。

  使用免费的集算器可以弥补这一不足。集算器支持集合运算、有序计算、动态脚本执行,还提供了简单易用的JDBC接口,报表工具可将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果,详情参考集算器辅助报表工具的应用过程

  下面举例说明报表常见的特殊布局,以及集算器对应的解法。

  横向分栏

  报表工具大多有纵向分栏的功能,但很少有提供横向分栏的。使用集算器事先准备数据集可以可以弥补这一不足:

  库表emp有3个字段,部分数据如下:

 

  期望的报表布局是记录先横后纵摆放,且横向分为3栏,如下:



 

  用集算器将原来的3字段数据转为9字段,就可以用报表工具实现横向分栏了:

  将数据按序号分成3部分,存在A2\B2\C2,再将B2\C2中的字段依次加入A2:

错行分栏

  将库表emp横向分为两栏,每行的第2栏和下一行的第1栏相同,报表布局如下:

  集算器代码:
 

  A2:错位拼接,将上一条记录和当前记录依次拼接起来,从第3行开始取拼接结果。结果如下:
 

  A3、B3、A4:按照前面的例子横向分两栏。

单字段纵向动态分栏

  按照先纵后横的布局将单字段结果集展现在报表中,行数和列数都是参数。源数据如下:
 

  集算器代码:

 

  A1:取出单字段数据,转换为序列(有序集合)。

  A2:生成与报表布局相同的二维表,初始值为空。参数Row和Col来自报表。
 

  A3:向A2追加数据,最终结果如下:
 

宽表横向打印

  sOrderEmp是数据库中的宽表,一张纸打印不下,报表要求每张纸打印列头和列号,在第1张纸打印前1到N列,第2张纸打印N+1到2N列,以此类推,示意图:
 

  集算器代码如下:
 

  上面是通用代码,可横向打印任意库表argSource,每页argPageCol列,argPageRow行。A2:动态生成列数为argPageCol的空二维表。A3:将A1每隔argPageRow行分一组。A4:将A1中的字段名每argPageCol个分为一组。A5:拼字符串,在A6中可动态执行。A6:循环A3的每组数据,每次向A2插入argPageCol*argPageRow行,依次插入每页的字段名、字段值。A7:将A2返回给报表工具。

  A2计算结果如下:

复制行

  按次序将记录复制3份,并用报表展现。

  集算器代码:
 

  A2: []表示序列(有序集合),[~]表示将A1当前记录作为单成员序列,[~]*3可将当前记录复制3份,函数conj对A1每个记录执行计算,最后进行合并。计算结果如下:

用条件控制分组表的格式

  展现一张分组表,数据来自库表sOrder,分组字段是Seller,明细字段是Client和Amount。特殊要求是:

  1.每组明细中,从第2条直到结束需要显示“+”号,第1条不显示。

  2.如果每组明细多于1条,则在该组最后显示对Amount的汇总求和,明细只有1条时不显示汇总。表样示意如下:

  集算器代码:
 

  解释:查询数据库,按照SellerId分组,并循环访问每组数据。循环中向空序表A2追加当前组的明细,如果序号#大于1,则在Client之前加“+”,如果当前组记录数大于1,则向A2追加subtotal。A2最终结果如下:
 

  A5:将A2通过jdbc传回报表工具。

将子表动态插入主表

  库表dColThread是主表,主键是tID。dColQuestion是子表,外键是tID,如下。

  dColThread
 

  dColQuestion
 

  报表需要根据ApplicationName查询主表并以列表的形式展现数据。主表每条记录对应的status字段值有多个,但不超过5个,需要横向插入主表的Phone、Decline字段之间,依次命名为QuestionNo1、QuestionNo2…QuestionNo5。如果某列数据都为空,则这一列不显示。表样形如:
 

  集算器代码如下:
 

  解释:用SQL取出主子表关联数据,按照tID分组,循环访问每组数据。每次循环向空序表A3插入一条记录,主表字段直接插入,子表字段列变行后再插入,并补足至少5个字段。循环结束后A3如下:
 

横向拼接列表

  table1是Oracle数据库表,table2.xlsx文件,两者结构相同,部分数据如下:
 

  需要将table1、table2分别按name分组并对各组计数对active字段求和,最后在报表中并排展示。理想表样如下:

  集算器代码:
 

  解释:分别从数据库和excel文件取数,将两者进行全连接,将需要的字段拼合到一个数据集中。A5存储合并的结果,如下:
 

交叉表列间计算

  数据库表store存储着多种产品在2014、2015年的销售量,需要用交叉表呈现每种产品每年的销售量,并计算出各产品的年增长率。部分源数据如下:
 

 理想表样如下:
 

  集算器代码:
 

  解释:交叉表的列是动态生成的,进行列间计算时需要二次动态引用,用报表脚本实现难度较大,此时可以用集算器将列间计算的结果事先追加到源数据中,之后只需设计简单的交叉表就能实现需求。
  A1的计算结果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值