嵌入式主子报表
嵌入式子报表的特点是在单元格中嵌入子报表,形成格中嵌表的模式,子报表和主报表的格线可以不对齐,子表间格线也不对齐,子报表在展现、导出和打印时为图片。
嵌入式的子报表扩展后,是个独立的报表,因此子表源格一直保留着,主报表可以访问子报表的值。
一、报表实例1
制作主报表“客户订单统计表1”,嵌入子报表“订单明细1”。
二、设计过程1
第1步:定义数据集
主报表数据集demo_客户订单2:select 客户ID,联系人 from DEMO_CUSTOMERS
子报表数据集demo_订单明细:select 订单ID,客户ID,订购日期 from DEMO_ORDERS
第2步:新建子报表,引用数据集“demo_订单明细”
第3步:编辑子报表:
1. 设置B1单元格的表达式:= demo_订单明细.group(year(订购日期),false,客户ID==@guestID),并将扩展方式设为横向扩展
设置显示值为:map(list(to(1996,2000)),list("1996年","1997年","1998年","1999年","2000年"))
可以通过菜单栏的【编辑】-【显示值】设置(如下图所示),或在报表属性栏的“显示值”表达式中设置。
@arg1 表示引用参数arg1的值,主报表通过参数arg1将客户ID传到子报表。(参数的含义和用法我们将在下一章中具体介绍。)
2. 设置B2单元格的表达式:= demo_订单明细.group(month(订购日期),false)
设置显示值为:map(list(to(1 , 12)),list("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"))
3. 设置B3单元格的表达式:=demo_订单明细.count()
4. 美化外观
5. 保存子报表为“订单明细1”。
第4步:新建主报表,引用数据集“demo_客户订单2”
第5步:编辑主报表
1. 设置A3单元格的表达式:=demo_客户订单2.select(客户ID,false),设置显示值为:demo_客户订单2.select1(联系人,客户ID==value())
2. 选中B3单元格,点击菜单栏【插入】-【子报表】,如下图所示做相应设置:
将“引入方式”设为“嵌入式”,【增加】参数定义,对应值表达式为:=A3,设置完成点【确定】按钮。
3. 美化外观
4. 保存主报表为“客户订单统计表1”。
第6步:预览报表
嵌入式主子报表“客户订单统计表1”的预览效果如下图所示:
第7步:打印导出
三、报表实例2
对于嵌入式子报表,主报表里可以获得子报表特定单元格的值,办法是通过调用eval函数来实现。下面我们在上面嵌入式主子报表的基础上,讲解如何在主表中引用子表特定单元格的值,做出如下图所示的“客户订单统计表2”。
四、设计过程2
第1步:打开子报表
在“资源中心”界面将“订单明细1”【另存为】“订单明细2”,点【修改】打开报表。
第2步:修改子报表
1. 在报表下端追加一行。
2. 在A4单元格中输入“订单合计”,设置B4单元格的表达式:=sum(B3{})。
3. 选中B4单元格,展开报表属性栏中的“扩展”,把B4的上主格设为`0,这样可以使B4单元格汇总的,是B1扩展出来的所有年份的订单合计。
4. 选中第4行,将第4行的可视属性的打勾去掉,这样预览时就不会显示第4行了。
将第4行设为不可见,而不是删除,是因为主报表将引用B4单元格的值。
5. 保存报表“订单明细2”。
第3步:打开主报表
在“资源中心”界面将“客户订单统计表1”【另存为】“客户订单统计表2”,点【修改】打开报表。
第4步:修改主报表
1. 在报表下端追加一行。在报表右端追加一列。
2. 合并A3、A4单元格,合并A1、B1、C1单元格,合并B2、C2单元格,合并B3、C3单元格。调整单元格的大小。
3. 在B3单元格插入子报表“订单明细2”。
4. 在B4单元格中输入“订单合计”,设置C4单元格中的表达式:=eval("B4",B3)。
C4单元格表达式的含义是: B3为嵌入式子报表,取得B3中的子报表中B4的值,这样就相当于主报表引用子报表的数据值并汇总。
5. 保存主报表为“客户订单统计表2”
第5步:预览报表
嵌入式主子报表“客户订单统计表2”的预览效果如下图所示:
第6步:打印导出
五、小结
插入子报表
要为某个报表插入子报表时,选中要添加子报表的单元格,通过菜单工具栏上的【插入】-【子报表】
弹出子报表添加界面如下图所示:
1. 输入子报表名称
同一个主报表中,子报表的名称不允许重复。
2. 选择子报表的引入方式
可以选择“引入式”或者“嵌入式”,用户可以根据需要进行选择。
3. 路径类型
分为资源列表、相对路径、绝对路径和URL。
4. 路径
选择好路径类型后,可以选择需要的报表资源作为子报表。
5. 参数定义
可以定义子报表中参数对应的主报表中的值,例如,子报表的某个参数,等于主报表某个单元格的值或者参数的值。
6. 查看所有子报表
可以查看本报表中定义的所有子报表,界面如下图所示,选中相应子报表,点击【确定】可以对选中的子报表进行修改。
六、函数说明
1. count()数据集函数
函数说明: 计算数据集当前记录行集中,满足条件的记录数
语法: datasetName.count({filterExp{,rootGroupExp{,nullCheckExp}}})
参数说明:
filterExp 条件表达式,如果全部选出,则不要此参数
rootGroupExp 是否root数据集表达式
nullCheckExp 检查某一条记录是否为空的标达式
返回值: 整数
示例:
例1:ds1.count() 表示对ds1中当前记录行集中所有记录进行计数,返回记录数。
例2:ds1.count(true) 含义同上,但是运算速度比ds1.count()慢,因此当记录全部选出时,建议不要true。
例3:ds1.count(quantity>500) 表示从ds1当前记录行集中选出quantity>500的记录进行计数,返回记录数。 例4:ds1.count(,,ID) 表示当前记录行集中ID不为空的纪录数目
2. eval()
函数说明: 动态解析并计算表达式
语法: eval( StringExp )
eval( StringExp, SubRptExp )
eval( StringExp, DataSetExp )
参数说明:
StringExp 待计算的表达式串
SubRptExp 嵌入式子报表对象,一般是含有子报表的单元格
DataSetExp 数据集对象,一般是ds函数
返回值: 表达式的结果值,数据类型由表达式决定
示例:
例1:eval( "1+5" ) 返回6。
例2:eval("B2+10", A1) 其中A1为嵌入式子报表,表示计算A1子报表中的B2+10。
例3:eval("salary+100", ds("ds1")) 表示计算数据集ds1中salary加100。