JasperReport报表开发之转置交叉表

使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如源数据不符合交叉表的要求,需要转置后再呈现。集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明转置交叉表的实现过程。

数据库表booking汇总着各年度商品的预定数据,有四个字段,包括年份和三种预定状态,部分数据如下:

报表要求呈现指定年份及上一年的预定情况,其中行组有三项,即三种预定状态,列组是年份,测度是当年的预定数据。此外要汇总出指定年份各预定状态的增长率。表样如下:

可以看到,这张报表的难点是:源数据无法直接用于交叉表,汇总列要用相对位置来动态计算。如果能将源数据转置,并将汇总列事先计算出来,则会显著降低难度,比如下面这样:

下面用集算器准备报表所需的数据,代码如下:

A1=yearBegin=yearEnd-1

yearEnd是来自报表的参数,表示用户指定的年份,比如2014。A1中的代码用来计算上一年(比如2013),为了方便引用,上一年定义为yearBegin。

A2=myDB1.query(“select * from booking where year between ? and ? order by year desc”,yearBegin,yearEnd)

这句代码用来从数据库查出指定年份及上一年的数据。myDB1是数据源名,指向MYSQL。函数query可执行SQL语句,也可以接受参数。假设yearEnd=2014,则A2的计算如下:

A3=create(row,col,value)

这句代码用来新建序表A3。A3有三个字段:row、col、value,将来可存储整理之后的数据。新建后的A3如下:

需要注意的是,序表类似数据库结果集,也是结构化二维表,但序表是泛型的,同一个字段可以存储不同的数据类型,序表也是有序的,可以按序号访问数据。利用序表的这些特点可以方便地实现本案例。

A4: for ["visits","bookings","successfulbookings"]

这句代码对集合["visits","bookings","successfulbookings"]进行循环访问,在循环中向A3追加数据,最终准备出报表需要的数据。for语句的作用范围是B4-C7,用自然的缩进就可以表示,无需括号或begin/end等标记。在作用范围里可以用A4来引用循环变量,即for语句所在单元格的格名。比如进行第一遍循环时,A4的值等于”visits”。

下面看循环体中的代码。

B4=endValue=eval(“A2(1).”+A4)

这句代码可从A2动态地取出第一条记录的预定状态数据。函数eval可将字符串解析为表达式,比如第一遍循环时,“A2(1).”+A4会被解析为A2(1).visits,计算结果是500。其中“A2(1)”表示第一条记录,“.visits”表示取出该记录的visits字段,即下图红框处:

C4=beginValue=eval(“A2(2).”+A4)

和endValue类似,beginValue从A2中动态地取出第二条记录的预定状态数据。第一遍循环时,endValue等于400。

B5=A3.insert(0,A4,A2(1).year,endValue)

C5=A3.insert(0,A4,A2(2).year,beginValue)

这两句代码向A3追加记录。函数insert可以向序表插入记录,第一个参数可以指定插入的位置,如果这个参数为0,则表示在最后追加记录。

比如第一遍循环时,B5追加的记录是:”visits”、2014、500,C5追加的记录是”visits”、2013,400。追加后A3如下:

B6=endValue/beginValue-1

这句代码计算指定年份的增长率,比如第一遍循环时,B6=500/400-1=0.25。

C6=if(B6>0:”+”,B6<0:”-”)+string(B6,”#%”)

这句代码用来格式化B6,算法是:如果B6大于0,则在百分数前面加“+”号,如果小于0,则加“-”号。比如第一遍循环时,C6=”+25%”。注意:格式化数据适合用报表实现,所以本步骤并非必须。

B7=A3.insert(0,A4,string(yearEnd)+”/”+string(yearBegin),C6)

这句代码向A3追加新记录,比如第一遍循环时,插入的记录是”visits”,”2014/2013”,”+25%”,如下图:

值得注意的是,这次插入的记录都是字符串,和之前的类型不同。

整个循环执行后,报表需要的数据就会全部追加在A3中,如下:

result A3

这句代码将A3返回给报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。

接下来以JasperReport为例设计一张简单的交叉表,模板如下:

报表中需要定义一个参数pyearEnd,用来对应集算器中的参数。预览后可以看到报表结果:

报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为booking.dfx,则在JasperReport的SQL设计器中可以用booking $P{pendYear}来调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-15 06:57:46

JasperReport报表开发之转置交叉表的相关文章

JasperReport报表开发(一)--原理介绍

1. JasperReport介绍 JasperReport 是一个开源的Java报表引擎,它不像其他的报表工具,例如Crystal报表是基于Java的,没有自己的表达式语法.Jasper Reports有提供丰富的内容到屏幕上,到打印机,或转换成PDF,HTML,XLS,RTF,ODT,CSV,TXT和XML文件的能力.Jasper Reports是一个Java类库,需要嵌入到Java应用程序中.Jasper Report的特点如下: 具有灵活的报表布局: 可以用文字或图形显示数据: 开发人员

利用JasperReport+iReport进行Web报表开发

用JasperReport+iReport进行Web报表开发 序言 在非常多实际的项目里,报表都是当中十分重要的组成部分,比如把查询结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维的.能够在执行期从数据库中自己主动读取数据.可自己主动分页.拥有丰富的页面元素(图片,超连接等).支持分组和交叉表.支持打印.最好还能导出到Excel或Word…...(汗L).可是显而易见,报表功能越强大,提供的服务越丰富,其复杂度也就越提高,所以仅靠石器时代的手工方式生成报表是

使用JasperReport+iReport进行Web报表开发

前言 在实际工程中非常,报告是其中很重要的一部分,结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维的.能够在执行期从数据库中自己主动读取数据.可自己主动分页.拥有丰富的页面元素(图片.超连接等).支持分组和交叉表.支持打印.最好还能导出到Excel或Word…...(汗L). 可是显而易见,报表功能越强大,提供的服务越丰富,其复杂度也就越提高,所以仅靠石器时代的手工方式生成报表是不能满足须要的. 所幸,眼下我们所熟知的几款报表工具功能上足够强大,并且都附有非

报表引擎交叉表的报表设计示例

使用Delphi开发了一个报表引擎,以下是一个交叉表的示例: 报表引擎交叉表的报表设计示例

开发版速达扩展功能-增值业务报表之分析交叉表第一篇

开发版速达目前已经推出了比较多的增值报表,之后还会陆续新增比较有用的增值报表,今天我们就来讲讲只有开发版才有的报表: 分析交叉表 1. 首先我们打开增值报表=>销售业务报表=>销售货品类别金额表,进行日期查询得到我们需要的报表样式: 2. 该交叉分析表的样式我们来分析下,点开配置交叉表进入以下界面: 3. 有两大区域:一是表格预览:二是Pivot预览:我们首先来看看Pivot预览: 标注1的:表示列区,展示在表格中就是列头,竖行的列头信息:这里就是年份.季度.月份等: 标注2的:表示行区,展示

DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 在继续本示例之前,要把所有 必需的程序集 添加到项目的 引用 列表中,并且把一个按钮拖放到窗体上. 然后,以下列方式接管此按钮的

DevExpress XtraReports 入门五 创建交叉表报表

原文:DevExpress XtraReports 入门五 创建交叉表报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 一.准备数据绑定 XRPivotGrid 控件 启动 MS Visual Studio (2005.2008 或 2010),并且新建一个或者打开一个现

【Reporting Services 报表开发】— 数据表的使用

一.打开 SQL Server Business Intelligence Development Studio,新建项目->商业智能项目-> 报表服务器项目,命名为CH3 二.在报表文件夹下面,添加->新建项.命名为TableTest,如图1和图2 图 1 图 2 三.添加数据源.添加数据集.这里不知道可以参考 :[Reporting Services 报表开发]- 总结 四.右击主体->插入->表,如图3 图3 把数据集中的字段拖到表中,如图4 图4 预览效果如图5 图5

润乾集算报表非常规统计之固定行列交叉表

实际信息系统中很多数据计算是为前端展示而进行的,其中报表是最常见的一种形式.这些计算的实现过程往往并不简单,使用SQL或存储过程实现起来比较困难,从而影响到前端报表设计.像http://bbs.csdn.net/topics/390883416中提的问题,其目的是为了实现一个固定行列的交叉表,用SQL准备好固定行数的数据源很麻烦.而润乾集算报表则有很灵活的计算能力,可以充分利用问题特点应付各种非常规的计算需求.这里就以链接中业务为背景,给出集算报表实现某种固定列交叉报表的方案. 报表背景 源数据