如下图所示,这个是一个典型的多层交叉报表,行定义为等级与性别,列定义为学历,汇总数据为计数;本章节中,我们会以该报表为例介绍交叉报表的制作步骤,该报表所用数据源为系统自带的demo数据源。
第一步:打开设计器
第二步:通过工具 - 数据源菜单,连接demo数据源
数据源连接前需要先保证所要连接的数据库为启动状态,然后在产品的数据源窗口可直接对已定义的数据源进行连接。
点击菜单本地应用 - 启动示例数据库,左侧的控制台会输出“数据库已启动”信息,表示demo数据源所需连接的HSQL数据库已启动。
第三步:新建报表
通过对前面一张简单的报表制作章节的学习,相信大家已经对向导新建报表有所了解,这里就不再赘述了。本例的数据集类型仍然是选择“SQL检索”,最终拼好的SQL语句为:
ds1: SELECT 员工.DEGREE,员工.EMPID,员工.TITLE FROM 员工
选好后点【确定】按钮, 回到向导窗口。
将【报表类型】设为“交叉报表”,点【下一步】按钮进行交叉报表的定义。
将“DEGREE”字段拖到【列定义】中,将“TITLE”字段拖到【行定义】中,将“EMPID”字段拖到【交叉汇总】中,其它默认不变,点击【生成交叉报表】按钮,进入设计器编辑界面,我们看到,一张交叉报表就做好了,单元格中自动产生了表达式:
第四步:定义表达式
1, 通过报表 - 数据集菜单,增加数据集
ds2:SELECT DEGREE.ID,DEGREE.NAME FROM DEGREE
ds3:SELECT TITLE.ID,TITLE.TITLENAME FROM TITLE
2, 将B1单元格的显示值设为:ds2.select(NAME,ID==value())
使用select函数从ds2数据集中选取ID为当前格值的记录中的NAME字段值
添加显示值后B1单元格出现一个红色的箭头,选择B1单元格,右侧属性的【扩展方式】显示为”横向扩展”。当可扩展单元格的扩展方向为横向时,该单元格进行的扩展称为横向扩展。此时该单元格会横向进行复制,复制出的单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个。
3, 将A3单元格的显示值设为:ds3.select(TITLENAME,ID==value())
4,将A1单元格内容修改为:等级,学历
本例中的group、count、select函数说明可参考《程序员参考》中的group、count、select函数。
第五步:美化外观
第六步:保存预览
此报表保存为2.2.1.rpx,预览效果如下图所示:
●设置单元格斜线
选中单元格,点击菜单栏中报表 - 边框设置,选择斜线属性,然后直接在单元格里输入分类字段,字段间用逗号隔开。
注意:逗号为英文输入状态的逗号。
然后将单元格的高度调高为一个合适的高度,否则单元格高度太低会看不到斜线效果。
●横向扩展
在右侧 属性栏 - 扩展 - 扩展方式 中选择【横向扩展】, 当可扩展单元格的扩展方向为横向时,该单元格进行的扩展称为横向扩展。此时该单元格会横向进行复制,复制出的单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个。
复制出来的新单元格的所有属性都引用被复制单元格的属性;
例:
在设计器打开报表2.2.1.rpx,将该报表改为多层交叉报表。
第一步:通过报表 - 数据集菜单,修改数据集,数据集字段中增加“GENDER”字段
第二步:定义表达式
1, 在B列前插入一列。
2, 合并A1、B1、B2单元格
3, 在B3单元格输入表达式:=ds1.group(GENDER; GENDER:1)
使用group函数把数据集ds1中所有记录按照GENDER字段升序排列,然后根据GENDER进行分组,并返回每组GENDER值组成的集合
4, 设置B3单元格显示值为:map(list(1,2),list("男","女"))
当真实值不够直观,需要用文字显示的时候,可以设置该单元格的显示值属性。比如此处性别的真实值是数值1和2,通过显示值显示为男和女。
设置该单元格在报表中的显示值,单元格的真实编码依然保留,当别的单元格引用该单元格时,引用的还是真实值,如果需要引用单元格显示值,可通过disp函数实现。
本例中的map、list函数说明可参考《程序员参考》中的map、list函数。
第三步:保存预览
此报表保存为2.2.2.rpx,预览效果如下图所示:
●显示值
由于业务的需要以及设计数据库的考虑,从数据库事实表中取出来的很多度量字段的值往往是编码,例如员工表的性别字段,往往存的是0或者1,但是在报表中希望显示成 男 或 女。
虽然编码字段在报表中显示成对应的中文,但是该单元格的真实编码还需要保留,当别的单元格引用该单元格时,引用的是编码而非中文,此时就需要用到单元格的显示值属性。
单元格的显示值也可以被引用,此时用到disp函数,例如:disp(A1) 代表A1单元格的显示值。
显示值的定义有两种方式:单值和对照表
举例:
单值定义法:
1、例如:"中国",那么该单元格就显示为"中国"
2、例如:ds1.select (name,value()==id,1)
对照表定义法:
例如:map(list(0,1),list("男","女"))
在设计器打开报表2.2.2.rpx,在该报表上增加分组汇总。
第一步:通过右键追加数据行/追加数据列,在报表的最下端追加两行,在最右端追加一列。
第二步:定义表达式
1, 合并单元格D1、D2,A3、A4,A5、B5
2, 在C4单元格输入表达式:=sum(C3{})
C4单元格左主格为A3单元格,上主格是C1单元格,=sum(C3{})是指A3单元格和C1单元格所辖范围内所有的C3格的值之和
3, 在D3单元格输入表达式:=sum(C3{})
4, 在D4单元格输入表达式:=sum(C3{})
5, 在D5单元格输入表达式:=sum(C3{})
6, 在C5单元格输入表达式:=sum(C3{})
C5单元格的左主格为根格,上主格是C1单元格,因此,此处 =sum(C3{})是指报表中所有的C1单元格所辖范围内C3单元格的值之和。
本例中的使用sum函数对可扩展单元格或集合表达式进行求和,函数说明可参考《程序员参考》中的sum函数说明。
第三步:美化外观,保存预览
此报表保存为2.2.3.rpx,预览效果如下图所示:
在设计器打开报表2.2.3.rpx,在该报表上增加标题、表头、表尾,实现定位与拉伸。
第一步:在报表的最上端插入两行,选中新插入的行,在右侧属性栏中设置这两行的行类型都为“头标题”。在最下端追加两行,设置最后一行的行类型为“尾标题”,倒数第二行的行类型为“报表尾”。
第二步:合并A1,B1,C1,D1,在A1中输入“员工学历、等级交叉统计表”,设置A1单元格居中显示。
第三步:在C2单元格中输入:报表日期,在D2单元格中输入:=now(),在D8单元格中输入:="第"+pno()+"页",在C9单元格中输入:审核员,在D9单元格中输入:张三
第四步:预览报表
我们发现报表日期和审核员都没有居右。
第五步:选中B2单元格,在右边的属性列表中展开“分页”,选择“分页时伸缩”属性。
如下图所示:
选中B9单元格,在右边的属性列表中展开“分页”,选择“分页时伸缩”属性。
第六步:美化外观,保存预览
此报表保存为2.2.4.rpx,预览效果如下图所示:
●定位拉伸规则
数据区横向扩展时,很可能横向扩展出很大面积,但是头标题区和尾标题区在设计的时候无法知道数据区会扩展出多大,而为了让报表整体美观,报表的头标题区和尾标题区都是希望随着数据区的横向扩展,有些内容靠右对齐,有些内容靠左对齐。
这时,除了希望靠左靠右对齐的单元格外,对中间某一单元格设置“分页时伸缩“属性,这样,横向扩展时报表引擎会对该单元格进行拉大,其他单元格保持位置不变,如果没有单元格设定了分页时伸缩,则对最右边一个单元格进行拉伸。
●除报表头、分组表头、数据区和表尾区以外的区域适用定位和拉伸规则