广州市力拓 上海往来:高级报表设计教程之一
来源:百度文库 编辑:中财网 时间:2024/07/04 21:07:52
概述:在使用报表软件过程中,往往会需要设计一些复杂的高级报表,本文以报表软件FineReport为例,向大家介绍,如何制作各类型多源报表、主子报表、以及如何进行动态隔间计算。
目录
多源报表………………………………………………………………………… 3
简单多源报表………………………………………………………………… 3
复杂多源报表………………………………………………………………… 5
动态与静态结合报表………………………………………………………… 8
主子表……………………………………………………………………………… 12
表单式主子表…………………………………………………………………… 12
嵌入式主子表…………………………………………………………………… 16
动态隔间计算…………………………………………………………………… 26
层次坐标原理…………………………………………………………………… 26
序号与编号……………………………………………………………………… 31
排名……………………………………………………………………………… 33
占比……………………………………………………………………………… 36
同期比与环比…………………………………………………………………… 38
多源报表
简单多源报表
1. 问题描述
多数据源,指的就是在同一张报表当中,显示的数据来自于多个不同的表或不同的库。传统的做法,是通过拼SQL将多源整合为单源。FineReport的数学模型,天然支持多数据源的报表。
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061525560765.jpg)
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
销售成本
不扩展,汇总|求和
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061526170171.jpg)
从效果图中可看到,销售成本字段的所有数据,被汇总到一个格子当中,且由于它没有扩展属性,它默认的左父格是C4单元格,但是这两个列又来自不同的数据列。因此不存在直接的附属关系,所以它就会跟随C4被复制出每个格子都相同的内容。而我们需要的,则是销售成本对应每个人来进行放置。
要得到我们期望的效果,需要做如下设置:双击销售成本字段所在的E4单元格,在过滤页面当中,定义条件类型为单元格,添加条件: 销售员 等于 'C4'(取单元格内的值作为关联条件);或定义条件类型为数据列,添加条件:销售员 等于 ds1.销售员(类似于拼SQL让ds2.销售员=ds1.销售员这个关联成立)。两种设置方式的原理虽然不同,但达到的效果是一致的。
需注意:必须要自定义E4单元格的左父格为C4。因为本身两个数据列并不来自于同一个数据表,所以不能直接存在附属关系
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061526400890.jpg)
2.4 保存与预览
保存模板。预览报表,即可看到如上的效果。
已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\simple.cpt
复杂多源报表
1. 概述
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061527000890.jpg)
在这张报表中,项目总数,财政拨款,自有资金及其它资金都是来自于不同的数据集。
2. 示例
2.1 准备数据集
数据库的数据表是项目ID与项目名称有一张单独的表来保存,另有项目数量,财政补贴资金,单位自筹资金,其它资金等四张列表。每张表均通过ID字段与项目名称表建立关系,以下是四张内置的数据集:
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061527170375.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061527330031.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061527480859.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061528050171.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061528200515.jpg)
2.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061528350984.jpg)
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 保存并预览报表
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061528530281.jpg)
保存模板。设计器中点击分页预览,即可如上的效果图。
已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\plan.cpt
说明:这个报表当中的数据,来自于5个不同的数据集。通过报表当中的数据列关联方式,将不同数据集的数据关联显示到一张表中。从而避免了在传统的报表处理方式中,通过复杂的SQL语句,将5个数据集拼成单源的情况,大大降低报表制作的难度及对报表设计人员SQL水平的要求。
动态与静态结合报表
1. 问题描述
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061529560484.jpg)
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
数据设置:汇总,求和,居中,其余默认
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061530350796.jpg)
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 静态区域绑定数据
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061531010718.jpg)
其中数据列的绑定设置,如下表:
单元格
数据集
数据列
属性
E6
ORD
AMOUNT
数据设置:汇总|求和,居中,其余默认
E7
ORD
QUANTITY
数据设置:汇总|求和,居中,其余默认
2.6 保存与预览
保存模板。设计器中点击分页预览,就可看到如上效果。
已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Multidatasource\dongjingfenpian.cpt
主子表
表单式主子表
1. 问题描述
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061531180812.jpg)
2. 示例
3. 连接数据库FRDemo
4. 设计模板
4.1 新建报表
4.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061531350437.jpg)
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 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061531520906.jpg)
其对应单元格内相应的设置,如下:
单元格
数据集
数据列
属性
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 建立主子表的关联
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061532300140.jpg)
4.6 设置行后分页
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061533060515.jpg)
5. 保存与预览
保存模板。点击设计器中的分页预览,效果如上。
已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Master_Report\Master.cpt
嵌入式主子表
1. 问题描述
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061533340890.jpg)
2. 主报表
2.1 新建报表
2.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061534170406.jpg)
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 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061534340390.jpg)
3.3 新建数据集ds1
SQL语句:SELECT EMPID,EMPNAME,REPORTDATE,TITLE,TEL FROM EMPLOYEE
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061534480562.jpg)
将数据集的字段拖入对应单元格内作相应的设置,如下:
单元格
数据集
数据列
属性
B1
ds1
EMPID
从上到下扩展,居中,其余默认
D1
ds1
EMPNAME
从上到下扩展,居中,其余默认
B2
ds1
TITLE
从上到下扩展,居中,其余默认
D2
ds1
REPORTDATE
从上到下扩展,居中,其余默认
B3
ds1
TEL
从上到下扩展,居中,其余默认
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061535120890.jpg)
将单元格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 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061535500500.jpg)
其单元格的设置,如下:
单元格
数据集
数据列
属性
B2
ds1
empid
数据设置:汇总|个数,居中,其余默认
C2
ds1
amount
数据设置:汇总|求和,居中,其余默认
A3
ds1
country
从上到下扩展,居中,其余默认
B3
ds1
empid
数据设置:汇总|个数,居中,其余默认
C3
ds1
amount
数据设置:汇总|个数,居中,其余默认
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061536100968.jpg)
4.5 保存模板
保存模板。已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\com\doc\Tutorial\advanced\Master_Report\sub2.cpt
5. 订单详细信息报表
5.1 新建报表
5.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061536280921.jpg)
5.3 新建数据集ds1
SQL语句:
SELECT orderid,empid,amount,city,shipmethod FROM ORDERS,customer where customer.customerid=orders.customerid
5.4 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061536470562.jpg)
其上单元格的设置,如下:
单元格
数据集
数据列
属性
B1
ds1
city
从左到右扩展;数据设置:汇总|个数,居中其余默认
A2
ds1
shipmethod
从上到下扩展,居中,其余默认
B2
ds1
orderid
数据设置:汇总|个数,居中,其余默认
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061537080343.jpg)
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
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061537550453.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061537400796.jpg)
6.3 添加子报表sub2.cpt
选定元格D5,选择菜单栏插入|单元格元素|子报表,打开编辑子报表对话框,选择,选定客户订单信息报表的路径。如下:
6.4 添加子报表sub3.cpt
选定单元格D7,选择菜单栏插入|单元格元素|子报表,打开编辑子报表对话框,选择,选定订单详细信息报表的路径。如下图:
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061540090312.jpg)
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 单元格扩展后的定位规则
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061540290296.jpg)
说明:
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 示例
下图模板中,我们使用图文结合的方式来看下它的使用,如:
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061540560031.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061541120453.jpg)
对照上面的模板,若有如下公式:
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。
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061541350343.jpg)
若这个公式,写在其他与A1,B1,C1单元格没有关系的单元格中,则返回的是A1所有扩展格下,B1的第一个扩展格区域中的C1单元格,即值为5,10,15,20的单元格,返回值为:[5,10,15,20]。
4. 相对层次坐标
报表中,常常需计算同期比、与比上期之类的与时间相关的运算。而这些运算往往需用到下一行的数据减上一行数据,后一列数据减前一列数据等等。这种涉及到行间、列间的运算,称为位移运算,这种位移运算是通过相对层次坐标来表示的。
4.1 单元格扩展后的定位规则
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061541570281.jpg)
与绝对层次坐标类似,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 示例
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061542230531.jpg)
5. 一些特殊格式的说明
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061543400250.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061544120750.jpg)
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061544130125.jpg)
常见的特殊格式,有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. 组内序号
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061544390953.jpg)
2. 示例
3. 连接数据库FRDemo
4. 设计报表
4.1 新建报表
4.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061544560140.jpg)
4.3 新建数据集
新建一数据集名为ds1,SQL语句:
4.4 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061545130328.jpg)
其上的每个单元格作如下相应设置:
单元格
数据集
数据列
属性
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. 组间序号
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061545370921.jpg)
只需修改,组内序号模板中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. 问题描述
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061545530796.jpg)
2. 示例
3. 连接数据库FRDemo
4. 设计报表
4.1 新建报表
4.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061546100250.jpg)
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 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061546270375.jpg)
按照下列表格,对其各单元格作相应的设置,如下:
单元格
数据集
数据列
属性
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”,这是对其上父格的限制。
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061546270375.jpg)
6. 保存与预览
保存模板。设计器中点击分页预览,效果如上。
已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Caculate_Between_Cells\SORT.cpt
占比
层次坐标的使用很广泛,它可用于计算占比、累计、同期比等等。
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061546420875.jpg)
1. 示例
2. 连接数据库FRDemo
3. 设计报表
3.1 新建报表
3.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061549520625.jpg)
3.3 新建数据集
新建一数据集名为ds1,SQL语句:SELECT MONTH(SIGNDATE) AS MONTH,ORDERID,AMOUNT FROM ORDERS
3.4 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061550260015.jpg)
其上各单元格作如下相应的设置:
单元格
数据集
数据列
属性
A3
ds1
MONTH
从上到下扩展,居中,其余默认
B3
ds1
ORDERID
数据设置:汇总|个数,居中,其余默认
C3
ds1
AMOUNT
数据设置:汇总|求和,居中,其余默认
4. 求占比
在D3单元格中,写入公式:=C3/sum(C3[!0]{}),其中C3[!0]{},表示C3扩展出来的所有单元格。其整个公式的意义是计算每个C3单元格,在所有C3单元格总和中所占的比例。
选中并右击D3单元格,选择样式>自定义>百分比,如下:
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061551000937.jpg)
5. 保存与预览
保存模板,设计器中点击分页预览,效果如上。
已完成的模板,可参见%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Tutorial\advanced\Caculate_Between_Cells\ratio.cpt
同期比与环比
1. 问题描述
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061551180062.jpg)
2. 实现步骤
2.1 新建报表
连接数据库FRDemo,进行表样设计。
2.2 表样设计
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061553300890.jpg)
2.3 新建数据集
新建数据集名为ds1,SQL语句:SELECT YEAR(SIGNDATE) AS YEAR,MONTH(SIGNDATE) AS MONTH,AMOUNT FROM ORDERS
2.4 绑定数据列
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061554010218.jpg)
其上各单元格的相应设置,如下:
单元格
数据集
数据列
属性
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 设置为百分比格式
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061551520203.jpg)
2.8 保存与预览
保存模板,设计器中点击分页预览,效果如上。
![](http://userimage2.360doc.cn/11/0806/15/6450264_201108061554160296.jpg)