循序渐进使用润乾报表30.docx
- 文档编号:26517465
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:88
- 大小:735.53KB
循序渐进使用润乾报表30.docx
《循序渐进使用润乾报表30.docx》由会员分享,可在线阅读,更多相关《循序渐进使用润乾报表30.docx(88页珍藏版)》请在冰豆网上搜索。
循序渐进使用润乾报表30
循序渐进使用润乾报表
第一章入门
润乾报表3.0是一套专门面向程序开发人员制作复杂报表的工具系统,润乾报表3.0首次成功解决了复杂中国式报表的格式任意性及关系数据库的关联规律性之间的矛盾,使得用户能够方便简捷地制作自动化的任意报表,实现了报与表的完美结合。
润乾报表3.0采用了纯JAVA技术,设计器和运算器均采用JAVA开发,可以运行在任何操作系统下(Windows,Linux,各种UNIX),支持所有有JDBC接口的关系数据库,支持所有J2EE标准的应用服务器。
润乾报表3.0提供报表运算的JAVA类的API调用,可最紧密地和应用程序无缝结合,运算器可采用应用服务器的数据库缓冲池,程序员可自定义参数输入界面与运算器结合。
第一节基本概念
¯单元格
我们运行润乾报表编辑器,点击新建报表菜单,即可出现如下界面:
我们发现,新建的报表由行列整齐的格子组成,这些格子我们称为单元格,所有的单元格组成了报表。
¯合并单元格
我们选中一片连续的单元格区域,点击合并单元格菜单,就把这些被选中的单元格合并成了一个单元格,如下图所示,这个合并出来的新单元格称为合并单元格
¯单元格数据类型
我们选中一个单元格,在窗口右边的属性列表中,点击数据类型的属性值下拉箭头,即可看到下拉选项,分别有文字、统计图、图片字段、图片文件,如下图所示。
也就是说,单元格里的内容可以是文字、也可以是图片,图片内容可以来自文件,也可以来自数据库中的字段,还可以是统计图
¯单元格属性的属性值和表达式
在单元格的属性列表中,大家看到,每个属性都有属性值和表达式两种,这两种有什么区别呢?
首先,属性值和表达式是互斥的,定义了属性值,就不必定义表达式,定义了表达式,就不必定义属性值。
其次,属性值是在编辑报表时就写死了的,在报表运行时不必经过运算,也不会被改变。
例如:
你在单元格的背景色的属性值中定义了红色,那么报表运行时,它就是红色,不会被运算,不会被改变。
而属性的表达式在报表运行时,会被运算,该属性的最终属性值取决于表达式的运算结果值。
¯单元格数据值
1、文字:
选中一个单元格,直接在里面输入文字,这些文字就成了单元格的数据值
2、图片文件:
如果单元格的数据类型是图片文件,则在单元格的属性列表的数据值的属性值中,直接敲入图片文件的全路径文件名即可,如下图所示:
3、图片字段:
如果单元格的数据类型是图片字段,则在单元格的属性列表的数据值的表达式中,将单元格中的数据值指定为数据集中的某个图片字段即可,如下图所示:
如图中所示,数据集ds1的第三个字段是个图片字段,所以将图片字段单元格的表达式设为ds1.#3即可。
当然,写成别的数据集表达式,只要结果是个从数据库返回的图片,就可以。
4、统计图:
如果单元格的数据类型是统计图,在双击单元格后,会弹出统计图的属性编辑框,如下图所示:
在统计图属性编辑框中,编辑完善统计图的各种属性,即形成了统计图。
具体的属性介绍,后面有单独的一章讲解
¯数据源
数据源其实就是定义报表数据来源的SQL语句,也称为数据集,如果报表的数据来自数据库,那么必须给报表定义数据源。
如果报表的数据不是来自数据库,而是常数等,则不必定义数据源。
¯参数
报表往往有参数,例如,日报表,当我们希望生成一张日报表时,首先需要向报表传递日期参数,然后报表才会根据我们传递进去的日期参数,生成该日的日报表。
我们的报表也有参数,我们的参数有以下几个特征:
1、参数有数据类型
2、参数有缺省值
3、参数有输入格式和最大宽度
参数可以在数据源和单元格的表达式中被引用
第二节一张最简单的报表
下面我们来制作一张最简单的报表——人员信息表:
要求输入员工的ID,然后生成该员工的信息表。
点击新建,设值参数,参数为员工编号,类型为整数,如下图所示:
然后建立数据源,数据源名称为ds1,sql语句为SELECTemployee.id,employee.empname,employee.birthday,employee.sex,employee.native,employee.degree,employee.specialty,employee.title,employee.worker,employee.mobile,employee.bp,employee.tel,employee.address,employee.charac,employee.resume,employee.photo,employee.intime,employee.expiretimeFROMemployee,如下图所示:
最后编辑单元格的数据值和表达式,以及单元格的各种外观属性,如下图所示:
预览界面如下:
第二章可扩展报表
第一节概念
一横向扩展
¯描述
单元格的表达式返回多个数据值时,该单元格可以横向进行复制,复制单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个,这种现象称为单元格的横向扩展。
横向扩展时,下方单元格进行复制,复制时,复制出来的新单元格的所有属性都引用被复制单元格的属性;
横向扩展时,上方单元格的宽度进行延展,延展成复制后的所有单元格的宽度总和;
横向扩展时,下方的单元格如果从属于高于当前单元格级别的单元格,则该下方单元格也应该延展,而非复制
¯例1:
横向扩展
扩展前:
B1
C1
B2
C2
B3
C3
扩展后:
B1
F1
B2
F2
B3
F3
¯例2:
下方较高级别单元格延展
假设B2是B1的附属单元格,B4也是B1的附属单元格,因此从逻辑上讲,B4至少和
B2平级,当B2进行扩展时,B4应该延展,不应该复制
B1
C1
B2
C2
B3
C3
B4
C4
扩展后:
B1
F1
B2
F2
B3
F3
B4
F4
一纵向扩展
¯描述
单元格的表达式返回多个数据值时,该单元格可以纵向进行复制,复制单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个,这种现象称为单元格的纵向扩展。
纵向扩展时,右边单元格进行复制,复制时,复制出来的新单元格的所有属性都引用被复制单元格的属性;
纵向扩展时,左边单元格的高度进行延展,延展成复制后的所有单元格的高度总和;
纵向扩展时,右边的单元格如果从属于高于当前单元格级别的单元格,则该右边单元格也应该延展,而非复制
¯例1:
纵向扩展
A1
B1
C1
A2
B2
C2
A3
B3
C3
扩展后:
A1
B1
C1
A2
B2
C2
A5
B5
C5
¯例2:
右边较高级别单元格延展
假设B2是A2的附属单元格,D2也是A2的附属单元格,因此从逻辑上讲,D2至少和
B2平级,当B2进行扩展时,D2应该延展,不应该复制
A1
B1
C1
D1
A2
B2
C2
D2
A3
B3
C3
D3
扩展后:
A1
B1
C1
D1
A2
B2
C2
D2
A5
B5
C5
D5
二左主格
¯描述
单元格纵向扩展时,有时候需要跟着被复制的单元格不一定在该单元格的右边,此时,需要对被复制的单元格设置左主格属性。
A单元格纵向扩展时,B单元格被同步复制,此时A单元格称为B单元格的左主格。
B单元格称为A单元格的附属单元格。
主单元格扩展时,附属单元格被同步复制,附属单元格同行本身的附属单元格也将被复制。
复制时,复制出来的新单元格的所有属性都引用被复制单元格的属性;
附属单元格的表达式定义可以引用主单元格的数据值
在实际的报表逻辑中,附属单元格往往是主单元格在同一维上的更细划分,或者是主单元格当前维度的聚集,有时候附属单元格可能是主单元格的标题。
¯例1:
附属单元格是主单元格的更细划分
假设:
A3为A2的附属单元格,A4为A3的附属单元格,A2是A3的左主格,A3是A4的左主格
A1
B1
A2(年)
B2
A3(季度)
B3
A4(月份)
B4
扩展后:
A1
B1
2000年
第一季
1月
2月
3月
第二季
4月
5月
6月
第三季
7月
¯例2(附属单元格是主单元格的在当前维度的聚集)
假设A3是A2单元格的附属单元格,A2是A3的左主格
A1
B1
C1
A2(季度)
B2(月份)
C2
A3(小计)
C3
扩展后:
A1
B1
C1
第一季
1月
2月
3月
小计:
第二季
4月
5月
6月
小计:
第三季
7月
8月
9月
小计:
三上主格
¯描述
单元格横向扩展时,有时候需要跟着被复制的单元格不一定在该单元格的下边,此时,需要对被复制的单元格设置上主格属性。
A单元格横向扩展时,B单元格被同步复制,此时A单元格称为B单元格的上主格。
B单元格称为A单元格的附属单元格。
主单元格扩展时,附属单元格被同步复制,附属单元格同行本身的附属单元格也将被复制。
复制时,复制出来的新单元格的所有属性都引用被复制单元格的属性;
附属单元格的表达式定义可以引用主单元格的数据值
在实际的报表逻辑中,附属单元格往往是主单元格在同一维上的更细划分,或者是主单元格当前维度的聚集,有时候附属单元格可能是主单元格的标题。
¯例1:
附属单元格是主单元格的更细划分
假设:
C1为B1的附属单元格,D1为C1的附属单元格,B1是C1的上主格,C1是D1的上主格
A1
B1(年)
C1(季度)
D1(月份)
A2
B2
扩展后:
A1
2000年
第一季
1月
2月
3月
第二季
4月
5月
6月
第三季
7月
¯例2(附属单元格是主单元格在当前维度的聚集)
假设C1是B1单元格的附属单元格,B1是C1的上主格
A1
B1(季度)
C1(小计)
A2
B2(月份)
A3
B3
C3
扩展后:
A1
第一季
小计
第二季
小计
第三季
小计
A2
1月
2月
3月
4月
5月
6月
7月
8月
9月
A3
第二节一般行式报表
¯说明
假设数据源ds1为:
SELECTemployee.id,employee.empname,employee.birthday,employee.sex,employee.nativeFROMemployee
数据源ds2为:
SELECTarea.id,area.areanameFROMarea
希望生成一张普通的行式报表
¯定义界面
¯各单元格属性
A3:
扩展方向:
纵向扩展
数据值:
=ds1.select(#1)
B3:
数据值:
=ds1.#2
C3:
数据值:
=ds1.#3
显示格式(属性值):
yyyy-MM-dd
D3:
数据值:
=ds1.#4
显示值(表达式):
map(list(1,0),list("男","女"))
E3:
数据值:
=ds1.#5
显示值(表达式):
ds2.select_one(#2,#1==@value)
¯运行预览界面
第三节交叉报表
¯说明:
数据源为:
ds1=SELECTcustomer.customer_id,customer.customer_namefromcustomer
ds2=SELECTproduct.product_id,product.product_namefromproduct
ds3=SELECTbuy_record.id,buy_record.buy_date,buy_record.product,buy_record.quantityfrombuy_recordWHEREdatediff(day,?
buy_date)>0
ds3的参数为:
buy_date
希望生成一张交叉报表,横向标题显示产品,纵向标题显示客户名称,统计每个客户购买每种产品的总数
¯定义界面:
¯各单元格属性
C3:
数据值(表达式):
ds2.group(product_id,false)
显示值(表达式):
ds2.select_one(product_name,product_id=@value)
扩展方向:
横向扩展
A5:
数据值(表达式):
ds1.group(customer_id,false)
显示值(表达式):
ds1.select_one(customer_name,customer_id=@value)
扩展方向:
纵向扩展
C5:
数据值(表达式):
ds3.sum(quantity,id==A5&&product==C3)
扩展方向:
不可扩展
¯运行预览界面
第四节分组报表
¯说明
假设数据源为SELECTarea.id,area.areaname,area.fatherfromarea
希望生成一张以area.father为分组表达式的分组汇总报表,要求分组字段放在细节区的左边
¯定义界面
¯各单元格的属性
A3:
数据值(表达式):
ds1.group(father,true,father!
=null)
显示值(表达式):
ds1.select_one(areaname,id=@value)
扩展方向:
纵向扩展
B3:
数据值(表达式):
ds1.select(id,true)
扩展方向:
纵向扩展
C3:
数据值(表达式):
ds1.areaname
扩展方向:
不可扩展
¯运行预览界面
第二章报表区域
第一节概念
¯页眉
页眉位于页面的最上面,仅仅在打印和打印预览的时候出现,每页都重复。
一般用于放置和页面有关的信息。
¯页脚
页脚位于页面的最下面,仅仅在打印和打印预览的时候出现,每页都重复。
一般用于放置和页面有关的信息。
¯标题区
标题区位于页眉和数据区之间,用于放置报表标题,以及一些报表抬头要显示的信息,例如:
打印日期、报表单位、金额单位等。
标题区的单元格可以引用数据区的单元格的数据,但不参与扩展和复制。
¯表尾区
表尾区位于数据区和页脚之间,一般用于放置报表的一些汇总统计信息,以及常在报表表尾显示的一些信息,例如:
操作员、操作时间、批注等。
表尾区的单元格可以引用数据区的单元格的数据,但不参与扩展和复制。
¯表头区
表头区是数据区的一部分,参与数据区的扩展和复制,它和数据区其他单元格不一样的地方在于:
分页的时候表头区每页重复
¯数据区
数据区位于标题区和表尾区之间,包含了表头区。
数据区的单元格可以进行扩展和复制。
第二节定位和拉伸规则
¯说明
除了数据区以外,其它区域的单元格不参与单元格的扩展和复制。
因此,当数据区单元格因扩展而膨胀时,其他区域的单元格需要有一个定位和拉伸规则。
除了数据区以外,其它所有区域的单元格都适用本规则
¯相对表右边位置固定(向右靠拢)
描述:
当数据区单元格扩展后,当前单元格向右靠拢,即相对表右边位置固定
举例:
数据区扩展前:
汇总报表
日期:
2002年
数据区扩展后:
汇总报表
日期:
2002年
¯单元格拉伸
描述:
当数据区单元格横向扩展后,当前行从右往左第一个不向右靠拢的单元格被拉伸。
从右往左第一个不向右靠拢的单元格被拉伸
举例:
扩展前:
向右靠拢
汇总报表
日期:
2002年
扩展后:
汇总报表
日期:
2002年
¯位置不变
描述:
当数据区单元格扩展后,当前行除了向右靠拢和拉伸外,其余所有单元格位置不变
从右往左第一个不向右靠拢的单元格被拉伸
举例:
扩展前:
向右靠拢
位置不变
汇总报表
日期:
2002年
扩展后:
汇总报表
日期:
2002年
¯空白格优先占用
由于数据区的单元格是可扩展的,所以当用户在定义报表时,往往数据区的单元格列数很少,而其他区域的单元格列数很多,此时,数据区的右边会有一些空白格。
因此,当数据区的单元格横向扩展时,应该优先占用右边的空白格,然后才执行前面的定位和拉伸规则。
如下图所示:
空白格,当B3单元格横向扩展时,优先被占用
扩展前:
汇总报表
单位名称:
润乾软件公司
日期:
2002年
=ds1.group(#1)
=ds2.group(#1)
=ds3.sum(#1,#2==B3&==A4)
扩展后:
汇总报表
单位名称:
润乾软件公司
日期:
2002年
产品1
产品2
产品3
产品4
产品5
客户1
客户2
客户3
第三节一张完整区域的报表
¯说明
下面我们来定义一张完整的报表,它具有页眉、标题区、数据区、表尾区、页脚,其中数据区还包含了表头。
数据源为:
ds1=SELECTcustomer.customer_id,customer.customer_namefromcustomer
ds2=SELECTproduct.product_id,product.product_namefromproduct
ds3=SELECTbuy_record.id,buy_record.buy_date,buy_record.product,buy_record.quantityfrombuy_recordWHEREdatediff(day,?
buy_date)>0
ds3的参数为:
buy_date
希望生成一张交叉报表,横向标题显示产品,纵向标题显示客户名称,统计每个客户购买每种产品的总数
¯定义界面
¯各单元格的属性
¯运行预览界面
第三章单元格的汇总运算
第一节概念
¯单元格的层次坐标
描述:
在进行报表编辑时,单元格尚未进行扩展,为避免混淆,应该对扩展后的单元格进行唯一性定义,这就是单元格的层次坐标
表达式规则:
左边的分组格/扩展格上边的分组格/扩展格
Cellx[Lk:
lk,Lk-1:
lk-1,……L1:
l1;Lk’:
lk’,Lk-1’:
lk-1’,……L1’:
l1’]
单元格扩展后的次序,即扩展后的第几个单元格
分组单元格/可扩展单元格
目标单元格,一般为Lk,Lk-1,。
。
。
。
。
。
L1的附属单元格
说明:
1、Lk为分组单元格,或称可扩展单元格,lk为单元格扩展后的次序,即扩展后的第几个单元格,如果不指定lk或者lk为0,则表示为当前格,Cellx为目标单元格,一般为Lk,Lk-1,。
。
。
。
。
。
L1的附属单元格
2、如果没有左边的分组格/扩展格,光有上边的分组格/扩展格的话,分号不能省略,即写成Cellx[;Lk’:
lk’,Lk-1’:
lk-1’,……L1’:
l1’]
3、如果没有上边的分组格/扩展格,光有左边的分组格/扩展格的话,分号可以省略,即写成Cellx[Lk:
lk,Lk-1:
lk-1,……L1:
l1;]
4、Lk的次序是从近到远的,就是从离当前格最近的扩展格开始的
举例:
假设:
A2,A7单元格由A2单元格扩展而来
扩展前:
A1
B1
C1
D1
A2
B2
C2
D2
扩展后:
a1
b1
c1
d1
a2
b2
c2
d2
c3
d3
b4
c4
d4
c5
d5
c6
d6
a7
b7
c7
d7
c8
d8
c9
d9
b10
c10
d10
c11
d11
c12
d12
C2[B2:
0,A2:
0]:
表示当前格所在当前分组格B2和A2的共同覆盖区域中的所有C2单元格
C2[B2:
1,A2:
2]:
表示第一个B2分组格和第二个分组格A2共同覆盖区域中的所有C2单元格,如上表所示,为c7,c8,c9三个单元格
B2[B2:
0,A2:
0]:
表示当前的B2单元格
¯单元格的位移表达式
描述:
报表中常常需要计算同期比、比上期之类的与时间相关的运算,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减前一列数据,等等,这种涉及到行间、列间的运算,称为位移运算,相关的表达式称为位移表达式
表达式规则:
左边的分组格/扩展格上边的分组格/扩展格
Cellx[Lk±lk,Lk-1±lk-1,……L1±l1;Lk’±lk’,Lk-1’±lk-1’,……L1’±l1’]
偏移量
分组单元格/可扩展单元格
目标单元格,一般为Lk,Lk-1,。
。
。
。
。
。
L1的附属单元格
说明:
5、Lk为分组单元格,或称可扩展单元格,lk为单元格的偏移量,即当前所在单元格的上lk格或下lk格,如果不指定lk,则表示为当前所在的分组格,Cellx为目标单元格,一般为Lk,Lk-1,。
。
。
。
。
。
L1的附属单元格
6、如果没有左边的分组格/扩展格,光有上边的分组格/扩展格的话,分号不能省略,即写成Cellx[;Lk’±lk’,Lk-1’±lk-1’,……L1’±l1’]
7、如果没有上边的分组格/扩展格,光有左边的分组格/扩展格的话,分号可以省略,即写成Cellx[Lk±lk,Lk-1±lk-1,……L1±l1;]
8、Lk的次序是从近到远的,就是从离当前格最近的扩展格开始的
举例:
假设:
A2,A7单元格由A2单元格扩展而来
扩展前:
A1
B1
C1
D1
A2
B2
C2
D2
扩展后:
a1
b1
c1
d1
a2
b2
c2
d2
c3
d3
b4
c4
d4
c5
d5
c6
d6
a7
b7
c7
d7
c8
d8
c9
d9
b10
c10
d10
c11
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循序渐进 使用 报表 30