分组报表

阅读(40477) 标签: 分组,

如下图所示,这个是一个典型的分组报表,以地区与城市为分组字段,展现不同分组中的公司信息,本章节中,我们会以该报表为例介绍分组报表,该报表所用数据源为系统自带的demo数据源。

分组报表,体验主子格概念

第一步:打开设计器

第二步:通过“工具”-> “数据源”菜单,连接demo数据源。

数据源连接前需要先保证所要连接的数据库为启动状态,然后在产品的数据源窗口可直接对已定义的数据源进行连接。

点击菜单“本地应用”->“启动示例数据库”,左侧的控制台会输出“数据库已启动”信息,表示demo数据源所需连接的HSQL数据库已启动。

第三步:“文件”->“新建报表”,利用向导定义数据集,新建一个分组报表。

通过对前面一张简单的报表制章节的学习,相信大家已经对向导新建报表有所了解,这里就不再赘述了。本例的数据集类型仍然是选择“SQL检索”,最终拼好的SQL语句为:ds1: SELECT 客户.城市,客户.公司名称,客户.联系人姓名,客户.联系人职务 FROM 客户

选好后点【确定】按钮,回到向导窗口。

将【报表类型】设为“分组报表”,点【下一步】按钮进行分组定义。

将“城市”字段拖到【分组定义】中,其它默认不变,点【生成分组报表】按钮,进入设计器编辑界面,我们看到,一张分组报表就做好了,单元格中自动产生了表达式:

1,  A2单元格中表达式为:=ds1.group(城市;城市:1)

这里group函数表示对数据集ds1按照城市字段进行分组,获得一组组的集合,然后从每组中取出一个城市字段的值,放到单元格中进行扩展,扩展出来的每个单元格都保留了一个指针指向当前的组集,该组集称为当前组。

2,  B2单元格中表达式为:=ds1.select(公司名称)

A2是可扩展格,默认情况下,我们称A2是其右边格子的主格,B2单元格是对该组集进行操作,返回对应城市组的公司名称的集合,所以不需要用任何条件和主单元格关联。

select函数返回的集合在单元格中进行扩展,此时每个扩展出来的单元格都保留一个指针,指向当前记录,即当前行。

3,  C2单元格中表达式为:=ds1.联系人姓名

B2是可扩展单元格,默认情况下,我们称B2是其右边格子的主格,C2是在当前行操作,直接取得当前记录的联系人姓名,所以不用重复使用select函数,也不需要用任何条件和主单元格关联。

4,  D2单元格中表达式为:=ds1.联系人职务

同理,默认情况下,D2的左主格也是B2单元格,可以直接从当前行取得联系人职务字段值。

本例中的group函数说明和select函数说明可参考《程序员参考》中groupselect函数。

第四步:保存预览

此报表保存为2.1.1.rpx,预览效果如下图所示:

多层分组

用设计器打开报表2.1.1.rpx,在该报表上做修改,增加一级分组,变成多层分组。

 

第一步:通过“报表”-> “数据集”菜单,修改数据集,在数据集字段中增加“地区”字段。

关于数据集菜单的具体使用介绍可参考《用户参考》数据集小节。

第二步:定义表达式

1在报表4.1中,选中第一列,在列首格点右键,选“插入列”

2、在A1单元格输入:地区

3、在A2单元格输入:= ds1.group(地区;地区:-1)

使用group函数把数据集ds1中所有记录按照地区字段降序排列,然后根据地区进行分组,并返回每组的地区值组成的集合

4、给报表增加边框,并设置居中显示等,使报表更美观。

可以通过工具栏上的图标将标题设为居左,居中和居右

第三步:保存预览

此报表保存为2.1.2.rpx,预览效果如下图所示:

 

主格和附属格

单元格进行扩展的过程中,缺省情况下,相对于其右(下)边的单元格而言,扩展格是主动复制的,被称为其它格(其右/下的格)的主格,而其右(下)的单元格是被动跟随复制的,被称为扩展格的附属格或子格。主格和附属格是相对的概念,即某格是另一格的主格或附属格,不存在单独的主格和附属格。

从主格的定义中看,显然只有扩展格才能是其它格的主格!

要注意的是,在缺省情况下,扩展格左(上)的格并不是其附属格,只有右(下)的格才是其附属格。

特别地,某个单元格的主格属性可以人为被改变。

主格

左主格设置:

在属性栏 - 扩展 左主格 中设置单元格的左主格

 

缺省左主格认定规则:

单元格纵向扩展时,左边纵向扩展单元格缺省为它的左主格,右边单元格缺省为它的附属格;如果左边没有纵向扩展格,则左主格缺省为 `0 格。

如下图:A1B1的左主格,B1A1的附属格,A1的左主格缺省为`0

 

人为改变主格规则:

可以将某个单元格的左主格设置成某个纵向扩展格。如果要将某单元格的上主格改为00格,则将其上主格属性设置为`0

为了符合扩展变化的规则,我们可以知道人为设置主格需要满足一些条件:

Ø  左主格必须是纵向扩展格,否则设置无效。

Ø  不允许出现循环设置的情况,即设置A的主格是BB的主格是CC的主格又是A,出现循环设置时认为设置有误,报表无法计算。显然,在缺省的情况下是不可能出现循环设置的,而在人为设置时必须避免这种情况的出现。

Ø  横向扩展格不允许有左主格。

人为设置时,可能发生左主格在右边的情况,而且主格也不一定和附属格在同一行上。

基本汇总统计

在设计器中打开报表2.1.2,在该报表上增加分组汇总。

 

第一步:定义表达式

1、选中最后一行追加数据行

2、合并A2A3单元格。

3、在C3单元格录入表达式:=count(C2{}) 

使用count函数获取当前主格扩展区域内所有扩展后的C2单元格的个数

4、合并C3D3E3单元格。

5、增加单元格边框,并修改汇总行背景色加以区分。

本例中的count函数具体说明可参考《程序员参考》

第二步:预览报表

此报表保存为2.1.3.rpx,预览效果如下图所示:

组表头重复

有时候进行分组时,一个组的记录可能要跨越报表的多页,如果只在第一页中显示组名称,其他页中不显示组名,那么用户在查看报表时就会弄不清这些记录属于哪一个组,为了使用户在每一页中都能看到组名称,我们提出了组表头的概念。

组表头分页的时候每页重复,分栏时每栏不重复。按行数分页时,所指定的行数为分组头区和数据区行数之和。

用设计器打开报表2.1.3.rpx,在该报表上增加组表头重复。

 

第一步:打开报表2.1.3.rpx

第二步:定义表达式,如下图:

1、取消A2的合并单元格。

2、在第3行前插入两行。

3、把B2单元格的表达式移到B3,把C2D2E2单元格的表达式分别移到C4D4E4

4、把C5单元格的表达式更改为=count(C4{})

5、选中第二行,在属性栏中选择行类型为“分组表头”,设置组头级别为1

如下图所示:

6、同样的方法,设置第三行的行类型为:“分组表头”,组头级别为2

7、把A3的左主格设为B3

8、同样的方法设置A4B4的左主格为C4C4的左主格为B3B3的左主格为A2A5的左主格为A2

单元格进行纵向扩展时,称其为其右边格子的左主格。设置后A3单元格随B3单元格的扩展而扩展;A4B4单元格随C4单元格的扩展而扩展;C4单元格随B3单元格的扩展而扩展;B3单元格随A2单元格的扩展而扩展;A5单元格随A2单元格的扩展而扩展。

第三步:保存预览

此报表保存为2.1.4.rpx,预览效果如下图所示:

第四步:通过“本地应用”->WEB预览”,发布报表:

从上图发布报表的页面可以看到,左边是报表的第1页,分组地区为华南,分组城市为深圳的数据并没有在第1页展现完;右边是报表的第2页,第2页的前两行依然显示了分组表头,接着第1页展现该组的数据,这就是组表头重复的效果。

设置组表头重复时要注意三点:

1、分组所在行的行类型要设置为“分组表头”。

2、如果有多个分组表头,那么要设置分组表头的“组头级别”。

3、分组格不能纵行扩展,可以横向扩展。如果分组格为纵向扩展,那么要调整分组格下面单元格的左主格(例如本例)

计算列的汇总

前面的例子,还只是比较简单的汇总,下面我们看一个例子,这个例子就复杂一些了:

 

从上图中可以看出,这个报表不是简单地对某个单元格进行汇总,而是对D2*C2的值进行计算,一般的报表工具需要对这种情况定义一个隐藏格(本例中将E列隐藏),先把D2*C2计算出来,再进行汇总,这种方式耗费内存,也影响效率。

润乾报表提供了更加简洁的计算方式,做法如下:

 

第一步:打开设计器

第二步:通过“工具->“数据源”菜单,连接demo数据源

数据源连接前需要先保证所要连接的数据库为启动状态,然后在产品的数据源窗口可直接对已定义的数据源进行连接。

点击菜单本地应用”->“启动示例数据库,左侧的控制台会输出数据库已启动信息,表示系统demo数据源所需连接的HSQL数据库已启动。

第三步:点击新建空白报表,定义数据集

通过报表->数据集菜单,增加数据集

ds1SELECT 产品.产品名称,产品.库存量,产品.单价,产品.产品ID FROM 产品 WHERE 产品.中止 ='0' AND 产品.类别ID ='5'

第四步:定义表达式

1,  A2单元格输入表达式:=ds1.select(产品ID) 

使用select函数从数据集ds1中选取产品ID字段列的所有值,该组字段值保留了一个指针,指向数据集中的源记录,因此在当前格的附属单元格里可直接通过dsn.colname表达式检索,如B2,C2等。

2,  B2单元格输入表达式:=ds1.产品名称

3,  C2单元格输入表达式:=ds1.库存量

4,  D2单元格输入表达式:=ds1.单价

5,  C3单元格输入表达式:=sum(C2*D2, B2{}) 

使用sum函数计算分别与每个B2相对应的C2D2的和的合计值

第五步:美化外观,保存预览

此报表保存为2.1.5.rpx,预览效果如下图所示: