广州市力拓 上海往来:高级报表设计教程之一

来源:百度文库 编辑:中财网 时间:2024/07/04 21:07:52

 

概述:在使用报表软件过程中,往往会需要设计一些复杂的高级报表,本文以报表软件FineReport为例,向大家介绍,如何制作各类型多源报表、主子报表、以及如何进行动态隔间计算。

 

  

目录

多源报表…………………………………………………………………………   3

简单多源报表…………………………………………………………………  3

复杂多源报表…………………………………………………………………  5

动态与静态结合报表…………………………………………………………  8

 

主子表……………………………………………………………………………… 12

表单式主子表…………………………………………………………………… 12

嵌入式主子表…………………………………………………………………… 16

动态隔间计算……………………………………………………………………   26

层次坐标原理…………………………………………………………………… 26

序号与编号……………………………………………………………………… 31

排名……………………………………………………………………………… 33

占比……………………………………………………………………………… 36

同期比与环比…………………………………………………………………… 38 

 

多源报表

简单多源报表

1. 问题描述

多数据源,指的就是在同一张报表当中,显示的数据来自于多个不同的表或不同的库。传统的做法,是通过拼SQL将多源整合为单源。FineReport的数学模型,天然支持多数据源的报表。 

先来看一张简单的多数据源报表,数据分别来自于两个不同的数据表。在这张报表当中,左侧仍然是我们前面用到过的销售量报表,而右侧则是新增的费用支出表。这两个表来自于不同的数据源。效果如下: 

2. 示例

2.1 打开报表

打开报表交叉报表-横向扩展章节的报表%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\Primary\cross_Report\cross.cpt

2.2 新增数据源

保留原有的数据集ds1,再新增一个数据集ds2,其SQL语句为:SELECT * FROM SALES_COST

从数据源预览,我们可看到这两个表有一个相同的字段“销售员”。在传统的报表处理方式当中,我们关联这两张表的方式是在写SQL时,在SQL里类似这样定义:SELECT * FROM SALES_BASIC,SALES_COST WHERE SALES_BASIC.销售员=SALES_COST.销售员

而这里使用的处理方法,是只要从数据库中读出需要的数据列即可。 

2.3 绑定数据列

报表中原有数据集ds1保持不变,拖拽ds2的数据绑定到单元格中,设置如下: 

单元格

数据集

列名

设置

E4

ds2

销售成本

不扩展,汇总|求和

预览,可看到效果如下: 

从效果图中可看到,销售成本字段的所有数据,被汇总到一个格子当中,且由于它没有扩展属性,它默认的左父格是C4单元格,但是这两个列又来自不同的数据列。因此不存在直接的附属关系,所以它就会跟随C4被复制出每个格子都相同的内容。而我们需要的,则是销售成本对应每个人来进行放置。 

要得到我们期望的效果,需要做如下设置:双击销售成本字段所在的E4单元格,在过滤页面当中,定义条件类型为单元格,添加条件: 销售员 等于 'C4'(取单元格内的值作为关联条件);或定义条件类型为数据列,添加条件:销售员 等于 ds1.销售员(类似于拼SQL让ds2.销售员=ds1.销售员这个关联成立)。两种设置方式的原理虽然不同,但达到的效果是一致的。

需注意:必须要自定义E4单元格的左父格为C4。因为本身两个数据列并不来自于同一个数据表,所以不能直接存在附属关系

最终的报表设计图,如下图所示: 

2.4 保存与预览

保存模板。预览报表,即可看到如上的效果。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\simple.cpt

复杂多源报表

1. 概述

上一章节中,我们介绍了简单的多数据源报表,而实际应用时,交叉表当中的行列与汇总计算数据,均来自不同数据库也是很常见的。如下报表:

在这张报表中,项目总数,财政拨款,自有资金及其它资金都是来自于不同的数据集。 

2. 示例

2.1 准备数据集

数据库的数据表是项目ID与项目名称有一张单独的表来保存,另有项目数量,财政补贴资金,单位自筹资金,其它资金等四张列表。每张表均通过ID字段与项目名称表建立关系,以下是四张内置的数据集:

项目名称(项目名称,ID)--project

项目总数(ID,项目总数)--zs

财政拨款(ID,金额)--cz

单位自筹(ID,金额)--dz

其它资金(ID,金额)--qt

2.2 表样设计

新建报表,设计表头如下: 

2.3 绑定数据列

将数据列依次拖拽到单元格中,设置如下: 

单元格

数据集

列名

设置

B4

project

项目名称

数据分组并从上到下纵向扩展,其它默认

C4

zs

数量

数据汇总求和,不扩展,过滤条件为“数据列”:ID等于project.ID,其它默认

E4

cz

金额

数据汇总求和,不扩展,过滤条件为“数据列”:ID等于project.ID,其它默认

F4

dz

金额

数据汇总求和,不扩展,过滤条件为“数据列”:ID等于project.ID,其它默认

G4

qt

金额

数据汇总求和,不扩展,过滤条件为“数据列”:ID等于project.ID,其它默认

2.4 编号和公式

将A5,B5合并为新的A5,写入说明性文字“合计”。在需要添加编号和计算汇总的格子中写入公式: 

单元格

公式

其它设置

A4

=&B4

在右键扩展属性中,定义其左左父格为B4

D4

=sum(E4:G4)

null

C5

=sum(C4)

null

D5

=sum(D4)

null

E5

=sum(E4)

null

F5

=sum(F4)

null

G5

=sum(G4)

null

2.5 保存并预览报表

最终的设计图,如下: 

保存模板。设计器中点击分页预览,即可如上的效果图。 

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\plan.cpt

说明:这个报表当中的数据,来自于5个不同的数据集。通过报表当中的数据列关联方式,将不同数据集的数据关联显示到一张表中。从而避免了在传统的报表处理方式中,通过复杂的SQL语句,将5个数据集拼成单源的情况,大大降低报表制作的难度及对报表设计人员SQL水平的要求。

动态与静态结合报表

1. 问题描述

分片是报表被分成多个区域,每个区域重复规则不同,而又可能相互运算。分片与多源是紧密相关的,往往分片后不同片需要使用不同的数据源。如下报表就是一个动态与静态结合分片的。查看如下: 

2. 示例

2.1 准备数据

连接数据库FRDemo,新建四个数据集,数据集名分别为CUSTOMER,EMPLOYEE,PRODUCT和ORD

CUSTOMER的SQL语句: SELECT CUSTOMERID,COUNTRY FROM CUSTOMER

EMPLOYEE的SQL语句: SELECT EMPID,TITLE FROM EMPLOYEE

PRODUCT的SQL语句: SELECT PRODUCTID,PRODUCTTYPE FROM PRODUCT

ORD的SQL语句: SELECT ORDERS.ORDERID,CUSTOMERID,EMPID,PRODUCTID,QUANTITY,(QUANTITY*PRICE) AS AMOUNT FROM ORDERS,ORDERSDETAIL WHERE ORDERS.ORDERID=ORDERSDETAIL.ORDERID

2.2 动态区域绑定数据列

按照下列要求将数据集的字段拖入对应单元格内,并作相应的设置。 

单元格

数据集

数据列

属性

B4

CUSTOMER

COUNTRY

从上到下扩展,居中,其余默认

B6

EMPLOYEE

TITLE

从上到下扩展,居中,其余默认

C4

CUSTOMER

CUSTOMERDID

从上到下扩展,居中,其余默认

C6

EMPLOYEE

EMPID

从上到下扩展,居中,其余默认

E2

PRODUCT

PRODUCTTYPE

从左到右扩展,居中,其余默认

E3

PRODUCT

PRODUCTID

从左到右扩展,居中,其余默认

E4

ORD

AMOUNT

数据设置:汇总,求和,居中,其余默认

E5

ORD

QUANTITY

数据设置:汇总,求和,居中,其余默认

E6

ORD

AMOUNT

数据设置:汇总,求和,居中,其余默认

E7

ORD

QUANTITY

数据设置:汇总,求和,居中,其余默认

相应设置,如下:

2.3 形态设置

对C4和C6单元格作形态数据字典设置,都采用数据库表的方式,具体设置如下表:

单元格

数据库

数据表

列序号(实际值)

列序号(显示值)

C4

FRDemo

CUSTOMER

1

2

C6

FRDemo

EMPLOYEE

1

2

2.4 动态区域单元格过滤设置

单元格设置,如下:

单元格

可选列

操作符

值属性

E4

PRODUCTID

等于

单元格

E3

E4

CUSTOMERID

等于

单元格

C4

E5

PRODUCTID

等于

单元格

E3

E5

CUSTOMERID

等于

单元格

C4

E6

EMPID

等于

单元格

C6

E6

PRODUCTID

等于

单元格

E3

E7

EMPID

等于

单元格

C6

E7

PRODUCTID

等于

单元格

E3

2.5 静态区域绑定数据

如下图所示,在第六行前插入两行,就如图中的Signed区域所占的行,如下:

其中数据列的绑定设置,如下表:

单元格

数据集

数据列

属性

E6

ORD

AMOUNT

数据设置:汇总|求和,居中,其余默认

E7

ORD

QUANTITY

数据设置:汇总|求和,居中,其余默认

2.6 保存与预览

保存模板。设计器中点击分页预览,就可看到如上效果。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\dongjingfenpian.cpt

主子表

表单式主子表

1. 问题描述

对于主子报表,FineReport提供两种不同的实现方法。其中,单表式主子报表特点是用单个报表实现主子表的业务逻辑。由上一章节可知,一个报表可引用多个数据集,实现分片报表,表单式主子表便是按照该原理实现的。如下图,就是一张单表式主子报表:

2. 示例

3. 连接数据库FRDemo

4. 设计模板

4.1 新建报表

4.2 表样设计

设计报表的基本框架,如下:

4.3 添加数据源

新建数据集ds1 ,SQL语句:

SELECT orderID,customerID,signDate,payMethod,shipMethod,amount,empid FROM ORDERS

新建数据集ds2 ,SQL语句:

SELECT orderID,ordersdetail.productID,productname,ordersdetail.quantity,price FROM ORDERSDETAIL,product where product.productid=ordersdetail.productid

4.4 绑定数据列

拖入数据列后,如下:

其对应单元格内相应的设置,如下:

单元格

数据集

数据列

属性

C3

ds1

orderID

居中,其余默认

C4

ds1

customerID

左父格:C3,居中,其余默认

C5

ds1

payMethod

左父格:C3,居中,其余默认

C6

ds1

empid

左父格:C3,居中,其余默认

F4

ds1

amount

左父格:C3,居中,其余默认

F5

ds1

shipMethod

左父格:C3,居中,其余默认

F6

ds1

signDate

左父格:C3,居中,其余默认

B9

ds2

productID

左父格:C3,居中,其余默认

C9

ds2

productname

居中,其余默认

D9

ds2

price

居中,其余默认

E9

ds2

quantity

居中,其余默认

在单元格F9中写入公式=D9*E9,表示求产品的金额。将A1,A3,B3单元格的左父格都设为C3。

4.5 建立主子表的关联

主子表有着一个相同的数据列,那就是ORDERID,可通过过滤将两个表中的ORDERID关联起来,双击B9增加过滤条件:orderID等于 'ds1.orderID'

4.6 设置行后分页

设置行后分页,目的是要让报表按照不同的订单号分页显示。将B10单元格的左父格设为C3,右击B10单元格,选择单元格属性,设置行后分页,如下:

5. 保存与预览

保存模板。点击设计器中的分页预览,效果如上。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\Master.cpt


嵌入式主子表

1. 问题描述

在主子报表中,还有一类比较重要的报表,那就是嵌入式主子报表。如下图所示,是某员工销售一览表,该报表中包括三个子报表,即此雇员信息、客户订单信息、定单详细信息报表。

2. 主报表

2.1 新建报表

2.2 表样设计

设计报表的基本框架,如下:

2.3 报表参数设计

选择菜单栏报表|报表参数,打开报表参数对话框,添加报表参数empid,默认值:1001。

点击参数设计标签,使用默认的参数界面,将A2单元格改为员工编号。 

2.4 保存模板

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\super.cpt

3. 雇员信息报表

3.1 新建报表

3.2 表样设计

报表设计的基本框架,如下:

3.3 新建数据集ds1

SQL语句:SELECT EMPID,EMPNAME,REPORTDATE,TITLE,TEL FROM EMPLOYEE 

3.4 绑定数据列

将数据集的字段拖入对应单元格内作相应的设置,如下:

单元格

数据集

数据列

属性

B1

ds1

EMPID

从上到下扩展,居中,其余默认

D1

ds1

EMPNAME

从上到下扩展,居中,其余默认

B2

ds1

TITLE

从上到下扩展,居中,其余默认

D2

ds1

REPORTDATE

从上到下扩展,居中,其余默认

B3

ds1

TEL

从上到下扩展,居中,其余默认

对B1单元格设置过滤,如下图:

将单元格A1、D1、A2、B2、C2、D2、A3、B3的左父格设置为单元格B1

3.5 保存模板

保存模板。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\sub1.cpt

4. 客户订单信息报表

4.1 新建报表

4.2 表样设计

设计报表的基本框架,如下:

 

4.3 新建数据集ds1

SQL语句:SELECT orders.customerid,country,amount,empid FROM orders,customer where customer.customerid=orders.customerid

4.4 绑定数据列

将数据集的字段拖入对应单元格内,如下:

其单元格的设置,如下: 

单元格

数据集

数据列

属性

B2

ds1

empid

数据设置:汇总|个数,居中,其余默认

C2

ds1

amount

数据设置:汇总|求和,居中,其余默认

A3

ds1

country

从上到下扩展,居中,其余默认

B3

ds1

empid

数据设置:汇总|个数,居中,其余默认

C3

ds1

amount

数据设置:汇总|个数,居中,其余默认

分别双击B2、C2 、A3单元格,作过滤设置,如下:

4.5 保存模板

保存模板。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\com\doc\Tutorial\advanced\Master_Report\sub2.cpt

5. 订单详细信息报表

5.1 新建报表

5.2 表样设计

设计报表的基本框架,如下: 

5.3 新建数据集ds1

SQL语句:

SELECT orderid,empid,amount,city,shipmethod FROM ORDERS,customer where customer.customerid=orders.customerid 

5.4 绑定数据列

将数据集的字段拖入对应单元格,如下:

其上单元格的设置,如下: 

单元格

数据集

数据列

属性

B1

ds1

city

从左到右扩展;数据设置:汇总|个数,居中其余默认

A2

ds1

shipmethod

从上到下扩展,居中,其余默认

B2

ds1

orderid

数据设置:汇总|个数,居中,其余默认

双击B1单元格对其进行过滤设置,如下图:

5.5 保存模板

保存模板。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\sub3.cpt 

6. 主子报表

6.1 打开模板

打开已建立的主报表模板%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\super.cpt

6.2 添加子报表sub1.cpt

选定单元格D3,选择菜单栏插入|单元格元素|子报表,打开编辑子报表对话框,选择,选定雇员信息报表的路径,参数选择继承报表参数,即empid,如下图:

6.3 添加子报表sub2.cpt

选定元格D5,选择菜单栏插入|单元格元素|子报表,打开编辑子报表对话框,选择,选定客户订单信息报表的路径。如下:

  

6.4 添加子报表sub3.cpt

选定单元格D7,选择菜单栏插入|单元格元素|子报表,打开编辑子报表对话框,选择,选定订单详细信息报表的路径。如下图:

 

最终主报表模板为:

6.5 保存模板

保存模板,覆盖之前的模板。设计器中点击分页预览,效果如上。见

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\super.cpt

层次坐标原理

1. 问题描述

传统报表工具,一般只提供同行内的格间运算和针对某组(或全体)的集合运算,会有如下几种情况的不足: 跨行运算,如:引用上一行数据,典型应用就是做累计比和环比。 跨组运算,如:同期比等等,跨组则无能为力。 对于集合运算,只提供个别固定的函数,如:取第一名、算累计值等;无法组合出通用集合运算,如:取第二名、算累计的乘积等。某些带条件的运算更是无法处理,如:统计同组数据总比当前数大的个数,也就是数据排名等。

FineReport报表的数据模型,由于是通过单元格绑定数据列扩展,来实现数据的读取和展现。所以在设计界面上的某个单元格时,可采用层次坐标的方式,对扩展后的每个单元格进行精确定位,得到某个单元格扩展后的其他多条数据。通常像EXCEL中设计表格时,需将所得的数据进行一些运算。在FineReport中,若要对数据列扩展返回的结果集进行一些运算,较为常见的有:对扩展出的数据进行编号,数据排名,同期比与环比,占比,累计等等。

2. 概念

设计模板时,若某个单元格尚未进行扩展,但其单元格的表达式,往往需对其扩展后的单元格进行运算。例如,A1单元格扩展成A1-A5,若使用一个单元格的表达式,且希望这个表达式是对扩展后的A2和A3进行求和。在扩展前,表达式很难描述这样的关系,它是对扩展后的单元格进行唯一性的定义,这就是单元格的层次坐标

FineReport报表,采用的层次坐标,对单元格扩展后的定位规则(即动态格间运算的规则)分为绝对层次坐标与相对层次坐标两种情况。下面就其概念以下简单介绍。

3. 绝对层次坐标

3.1 单元格扩展后的定位规则

层次坐标的表达式,如图: 

说明: 

Cellx:指目标单元格,是Lk,Lk-1...L1;Tk,Tk-1...T1的附属格。 

左父格层次坐标原理:

Lk:指某个目标单元格Cellx的左父格,Lk的次序是从远到近的,也就是从离当前格最远的左父格开始,也可以理解为从最高级别的分组格开始。

lk:指左父格LK扩展后的次序,即扩展后的第几个单元格,如果不指定lk或lk为0,则表示为当前表达式所在单元格所属的当前左父格LK。

依此类推,上父格的原理也是相同的。如下:

Tk:指某个目标单元格Cellx的上父格,Tk的次序也是从远到近的,也就是从离当前格最远的上父格开始,也可以理解为从最高级别的分组格开始。

tk:指上父格Tk扩展后的次序,即扩展后的第几个单元格,如果不指定tk或tk为0,则表示为当前表达式所在单元格所属的当前上父格TK。

注:左父格和上父格的坐标是通过分号来隔开的。

如果没有左父格,只有上父格的话,分号不能省略,即写成Cellx [;Tk :tk, Tk-1 :tk-1,……T1 :t1]; 如果没有上父格,只有左父格的话,分号可以省略,即写成Cellx [Lk:lk, Lk-1:lk-1,……L1:l1 ]。

3.2 示例

下图模板中,我们使用图文结合的方式来看下它的使用,如: 

 

对照上面的模板,若有如下公式: 

C1[A1:1],表示父格A1的第一个扩展单元格下的所有B1扩展格下的C1单元格,即C1单元格中,值为5,6,7的单元格。返回值是以数组的形式显示:[5,6,7]

C1[A1:1,B1:2],其中A1:1,是表示A1单元格扩展出来的第一个单元格;B1:2,是表示在A1的第一个扩展格区域内,B1扩展出来的第二个单元格;C1[A1:1,B1:2],就表示在这个B1的第二个扩展格区域下的C1单元格,即值为6的单元格,所以返回值为6。

C1[B1:1],若这个公式写在D1单元格中,即写在以C1为父格的单元格中,则返回的C1单元格,所属的A1左父格为当前C1所属的左父格。公式就表示当前A1父格下的B1的第一个扩展格区域中的C1单元格。得到的结果,如下图:

若这个公式,写在其他与A1,B1,C1单元格没有关系的单元格中,则返回的是A1所有扩展格下,B1的第一个扩展格区域中的C1单元格,即值为5,10,15,20的单元格,返回值为:[5,10,15,20]。

4. 相对层次坐标

报表中,常常需计算同期比、与比上期之类的与时间相关的运算。而这些运算往往需用到下一行的数据减上一行数据,后一列数据减前一列数据等等。这种涉及到行间、列间的运算,称为位移运算,这种位移运算是通过相对层次坐标来表示的。

4.1 单元格扩展后的定位规则

层次坐标的表达式,如图:

与绝对层次坐标类似,Lk和Tk分别表示某目标单元格Cellx的左父格和上父格。不同的是,这里的±lk和±tk,表示的是对应父格的位移量(即当前表达式所在单元格的左父格Lk的上lk格或下lk格),对于左父格来说,+表示向下移动lk个单元格,-表示向上移动lk个单元格;对于上父格来说,+表示向右移动tk个单元格,-表示向左移动tk个单元格。 

注:如果不指定所在单元格的lk,则表示为当前所在的左父格Lk,Cellx为目标单元格,一般为Lk,Lk-1,......,L1的附属单元格,即子格;

如果没有左父格,只有上父格的话,分号不能省略,即写成Cellx [;Tk :±tk, Tk-1 :±tk-1,……T1 :±t1];如果没有上父格,只有左父格的话,分号可以省略,即写成Cellx [Lk:±lk, Lk-1:±lk-1,……L1:±l1 ]。

4.2 示例

依旧使用绝对层次坐标中的模板,在D1单元格中输入公式C1[A1:-1],则返回的是当前A1扩展出来的上一格,对应B1扩展出来的值,如下图:

5. 一些特殊格式的说明

使用如下模板,做示例讲解。

常见的特殊格式,有A1[!0]A1[!0]{} A1:-1 A1:+0 B1[A1:-1] B1[A1: !-1] &A1 $C1等等。

5.1 原理与示例

如:A1[!0]A1[!0]{}公式用法是相同的,都表示A1单元格扩展出来的所有单元格的值,它是无任何条件限制的。若A1[!0]{},其大括号中是加入条件内容的,就是指在A1扩展出来的所有单元格基础上,再根据括号中所选单元格的条件,展示出对应的单元格内容。

如:A1:-1,此类写法一般会有其对应的当前单元格,如:B1[A1:-1]中,A1-1表示当前单元格(即B1),所在单元格A1之前偏移一个位置的单元格A1,所对应的B1单元格中的值。返回的值,可参见图中的F1列;若是A1:+0写法,也是如此。如:B1[A1:+0],则表示当前单元格(即B1),所在单元格A1所对应的B1单元格中的值。返回的值,可参见图中的G1列。

如:C1[A1:-1,B1:+0],表示当前单元格(即C1),所在单元格A1之前偏移一个位置的单元格A1,所对应的C1单元格中的值,所对应的B1单元格值。返回的值,可参见图中的E1列。

如:B1[A1:!-1]中,表示当前单元格(即B1),所在的单元格A1扩展出来的最后一个单元格对应的B1单元格的值。返回的值,可参见图中的H1列。

如:&A1,是表示根据其A1单元格中的值的个数对应编号。这里返回的就是[1,2,3]。

如:$C1,一般也与其他公式一起使用的。如:C1[!0]{B1=$B1&&C1>$C1}就是指当前单元格(即C1),所属的B1分组格扩展出来的,C1单元格扩展出来的值中大于当前单元格的值。返回的值,可参见图中的D1列。

序号与编号

1. 组内序号

组内序号,就是对每一组的所有元素进行编号,如下图:

2. 示例

3. 连接数据库FRDemo

4. 设计报表

4.1 新建报表

4.2 表样设计

按照下图设计好报表的基本框架,如下:

4.3 新建数据集

新建一数据集名为ds1,SQL语句:SELECT CITY,CUSTOMERNAME,ORDERS.CUSTOMERID,AMOUNT FROM CUSTOMER,ORDERS WHERE CUSTOMER.CUSTOMERID=ORDERS.CUSTOMERID ORDER BY COUNTRY

4.4 绑定数据列

将数据集的字段分别拖入对应单元格内,如下:

其上的每个单元格作如下相应设置: 

单元格

数据集

数据列

属性

B3

ds1

CITY

从上到下扩展,居中,其余默认

D3

ds1

CUSTOMERNAME

从上到下扩展,居中,其余默认

E3

ds2

AMOUNT

数据设置:汇总|求和,居中,其余默认

4.5 单元格设置

在C3单元格中,写入公式: =&D3,设置其C3的左父格为D3。

5. 保存与预览

保存模板。设计器中分页预览,即可查看到如上的效果。 

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\com\doc\Tutorial\advanced\Cacuate_Between_Cells\number1.cpt

6. 组间序号

组间序号,是对所有组的元素进行编号,如下图:

只需修改,组内序号模板中C3单元格的公式即可得到上图模板效果。将C3单元格中的公式改为:=IF(&B3==1,0,C3[B3:-1,D3:!-1])+&D3

说明:上述公式中,&B3即判断B3的位置。如果&B3的返回值大于1,那么读取上一个C3的值;如果&B3的返回值不大于1,则读取0,再加上C3的组内序号,就可以得到C3的组间序号。

7. 保存与预览

保存模板,设计器中点击分页预览,即可得到如上的效果。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Caculate_Between_Cells\number2.cpt

注:以上为使用层次坐标实现的序号与编号,可看到组间的连续编号实现起来还是相当麻烦的,为此FineReport已提供一个非常简便的公式(SEQ函数),可方便快捷地实现组间、组内排序,具体可参考典型函数应用的相关内容。

排名

1. 问题描述

排名,是一个很有用的设置,通过排名可简单的看出很多信息。下图报表分别对家用电器(appliance)和办公用品(office)在各个月份的销售量进行了排名,效果如下:

2. 示例

3. 连接数据库FRDemo

4. 设计报表

4.1 新建报表

4.2 表样设计

按照下图设计好报表的基本框架,如下:

4.3 新建数据集

新建数据集名为ds1,SQL语句:SELECT PRODUCTID,PRODUCTTYPE,PRODUCTNAME FROM PRODUCT

新建数据集名为ds2,SQL语句:SELECT month(SIGNDATE) AS MONTH,ORDERS.ORDERID,ORDERSDETAIL.PRODUCTID ,ORDERSDETAIL.QUANTITY FROM ORDERSDETAIL,ORDERS WHERE ORDERS.ORDERID=ORDERSDETAIL.ORDERID

4.4 绑定数据列

将数据集的字段拖入对应单元格内,如下:

按照下列表格,对其各单元格作相应的设置,如下:

单元格

数据集

数据列

属性

B4

ds1

PRODUCTTYPE

从上到下扩展,居中,其余默认

C4

ds1

PRODUCTNAME

从上到下扩展,居中,其余默认

F2

ds2

MONTH

从左到右扩展,居中,其余默认

D4

ds2

QUANTITY

数据设置:汇总|求和,居中,过滤:"PRODUCTID等于ds1.PRODUCTID",其余默认

F4

ds2

QUANTITY

数据设置:汇总|求和,居中,过滤:"PRODUCTID等于ds1.PRODUCTID",其余默认

5. 排名

通过层次坐标来计算排名。E4中填入公式:=count(D4[!0]{B4==$B4 && D4>$D4})+1,G4中填入公式:=count(F4[!0]{B4==$B4 && F4>$F4 && F2==$F2})+1

公式说明:count()函数是计算数组或数组区域中所含项的个数,在这里就是指符合条件的单元格的个数。D4[!0]指所有的单元格,“{} ”中写的就是所选单元格的条件,”D4[!0]{B4==$B4&&D4>$D4})”就是指当前单元格D4,所属B4分组格扩展出来的,以及与D4单元格扩展出来的值大于当前单元格的值的个数。所以”count(D4[!0]{B4==$B4&&D4>$D4})+1”就是指当前单元格D4,所在的父格B4中的排名。G4中的公式类似,只是多了一个限制条件:”F2==$F2”,这是对其上父格的限制。

最终完成的模板,如下:

6. 保存与预览

保存模板。设计器中点击分页预览,效果如上。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Caculate_Between_Cells\SORT.cpt

占比

层次坐标的使用很广泛,它可用于计算占比、累计、同期比等等。

占比,顾名思义就是计算某个单独的数据,在总量中占据的比例。如下:

1. 示例

2. 连接数据库FRDemo

3. 设计报表

3.1 新建报表

3.2 表样设计

按照下图设计好报表的基本框架,如下:

3.3 新建数据集

新建一数据集名为ds1,SQL语句:SELECT MONTH(SIGNDATE) AS MONTH,ORDERID,AMOUNT FROM ORDERS

3.4 绑定数据列

将数据集的字段拖入其对应的单元格内,如下:

其上各单元格作如下相应的设置:

单元格

数据集

数据列

属性

A3

ds1

MONTH

从上到下扩展,居中,其余默认

B3

ds1

ORDERID

数据设置:汇总|个数,居中,其余默认

C3

ds1

AMOUNT

数据设置:汇总|求和,居中,其余默认

4. 求占比

在D3单元格中,写入公式:=C3/sum(C3[!0]{}),其中C3[!0]{},表示C3扩展出来的所有单元格。其整个公式的意义是计算每个C3单元格,在所有C3单元格总和中所占的比例。

选中并右击D3单元格,选择样式>自定义>百分比,如下:

  

最终得到模板,如下:

5. 保存与预览

保存模板,设计器中点击分页预览,效果如上。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Caculate_Between_Cells\ratio.cpt

同期比与环比

1. 问题描述

同期比,指一个与时间相关的运算。在普通的电子表格的报表中,可任意取值进行运算。但在可扩展的自由报表中,数据都是由一个单元格扩展出来的,所以需涉及到扩展后的单元格的定位。下图就是关于同期比的示例图:

2. 实现步骤

2.1 新建报表

连接数据库FRDemo,进行表样设计。

2.2 表样设计

按照下图设计好报表的基本框架,如下:

2.3 新建数据集

新建数据集名为ds1,SQL语句:SELECT YEAR(SIGNDATE) AS YEAR,MONTH(SIGNDATE) AS MONTH,AMOUNT FROM ORDERS

2.4 绑定数据列

将数据集的字段分别拖入对应单元格内,如下:

其上各单元格的相应设置,如下:

单元格

数据集

数据列

属性

A4

ds1

YEAR

从上到下扩展,居中,其余默认

B4

ds1

MONTH

从上到下扩展,居中,其余默认

C4

ds1

AMOUNT

数据设置:汇总|求和,居中,其余默认

2.5 写入与去年同期比

在D4单元格中,写入公式:=C4/C4[A4:-1]。此公式得到的数据,是把每年与上一年相应月份的数据进行一个比率运算。公式C4[A4:-1]中,A4:-1,表示当前单元格,所在的A4单元格之前,偏移一个位置的A4所对应的C4单元格。

2.6 写入与上月环比

在E4单元格中,写入公式:=C4/C4[B4:-1]。此公式得到的数据,是把每一年下的每月与上月的数据进行一个比率运算。公式C4[B4:-1]中,B4:-1,意义同上。

2.7 设置为百分比格式

如上公式计算后的同期比与环比为小数,可以设置D4和E4单元格为百分比格式的样式,如下:

2.8 保存与预览

保存模板,设计器中点击分页预览,效果如上。

已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Caculate_Between_Cells\compare.cpt