嵌入式主子报表- 主子报表-报表设计初级教程
目录

嵌入式主子报表

 嵌入式子报表的特点是在单元格中嵌入子报表,形成格中嵌表的模式,子报表和主报表的格线可以不对齐,子表间格线也不对齐,子报表在展现、导出和打印时为图片。
    嵌入式的子报表扩展后,是个独立的报表,因此子表源格一直保留着,主报表可以访问子报表的值。

一、报表实例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。