处理关系数据(其中相关数据存储在不同表中)时,通常需要查看同一报表中多个表或查询的信息。 例如,你想在查看客户数据的同时查看有关客户订单的信息。 Access 中的子报表可以帮助你完成此任务,它允许以符合逻辑、易于阅读的方式显示报表上的订单信息和客户信息。 Access 提供了有助于快速创建子报表的多种方式。
你想做什么?
了解子报表
子报表是插入到另一个报表中的报表。 合并报表时,其中一个报表必须充当包含另一报表的主报表。 主报表可分为“绑定”或“未绑定”两种。 绑定报表可以显示数据,且其“记录源”属性中指定了表、查询或 SQL 语句。 未绑定报表不基于表、查询或 SQL 语句,即报表的“记录源”属性为空。
带有两个不相关子报表的未绑定主报表示例
未绑定主报表不能显示自己的任何数据,但仍可以充当想要合并的不相关子报表的主报表。
1.未绑定主报表包含两个子报表。
2.一个子报表按雇员汇总销售额。
3.另一个子报表按类别汇总销售额。
绑定到同一记录源的主报表和子报表示例
可以使用主报表显示详细信息记录(如一年中的每个销售额),然后使用子报表显示摘要信息(如每季度的总销售额)。
1.子报表按季度汇总当年的销售额。
2.主报表列出每日的销售额。
绑定到相关记录源的主报表和子报表示例
主报表可以包含一个或多个子报表共有的数据。 在本例中,子报表所包含的数据与主报表中的数据相关。
1.主报表列出每个博览会的名称和举办城市。
2.子报表列出参加每个博览会的代表。
报表上的子窗体
主报表在包含子报表的同时还可以包含子窗体,且它可以包含所需任意数量的子窗体和子报表。 此外,主报表可以包含至多七级子窗体和子报表。 例如,报表可以包含子报表,该子报表可以包含子窗体或子报表,以此类推,最多可以包含七级。
如果向报表添加子窗体并在报表视图中打开该报表,则可以使用此子窗体筛选和浏览记录。 虽然此上下文中禁用了某些事件,但附加到窗体及其控件的 Visual Basic for Applications (VBA) 代码和嵌入宏将继续运行。 无法通过使用报表上的子窗体来添加、编辑或删除记录。
将报表链接到子窗体或子报表
如果插入的子窗体或子报表包含与主报表中的数据相关的信息,子报表控件必须链接到主报表。 此链接确保子窗体或子报表中显示的记录与主报表中打印的记录正确对应。
通过使用向导或通过将对象从导航窗格拖动到报表来创建子窗体或子报表时,如果满足以下任一条件,Access 会自动将子窗体或子报表链接到主报表。
-
你可以为所选的表定义关系,或为作为所选查询基础的表定义关系。
-
主报表所基于的表具有主键,子窗体或子报表所基于的表包含与主键名称相同的字段且拥有相同或兼容的数据类型。 例如,如果作为主报表基础的表的主键是自动编号字段,且其“字段大小”属性设置为“长整型”,则作为子窗体或子报表基础的表中的对应字段必须是数字字段,且其“字段大小”属性设置为“长整型”。 如果选择一个或多个查询作为子窗体或子报表的记录源,这些查询中的基础表必须满足相同的条件。
创建子报表
如果子报表将链接到主报表,请在使用以下过程之前确保基础记录源已处于相关状态。
使用子报表向导创建子报表
此过程假定你已具有要添加子报表的报表。 有关创建报表的详细信息,请参阅创建简单报表或创建分组报表或汇总报表文章。
-
在导航窗格中,右键单击要向其添加子报表的报表,然后单击“设计视图”。
-
在“设计”选项卡上的“控件”组中,单击右下角的向下箭头来打开“控件”库:
-
在出现的菜单中,确保选中“使用控件向导”。
-
再次打开“控件”库,然后单击“子窗体/子报表”。
-
在报表上,单击要放置该子报表的位置。
-
如果出现安全通知对话框,单击“打开”以启动向导。
-
在子报表向导的第一页上,如果要基于表或查询新建子窗体或子报表,单击“使用现有表和查询”。 如果要将现有报表或窗体用作子报表,单击“使用现有报表或窗体”,在列表中选择报表或窗体,然后单击“下一步”。
注意: 如果数据库中没有其他报表或窗体,列表将为空白,且“使用现有报表或窗体”选项将不可用。
-
如果在向导的上一页中选择了“使用现有报表或窗体”,请跳过此步骤并直接转到步骤 9。 否则,在“表/查询”列表中选择包含要添加到子报表的字段的表或查询,然后在“可用字段”列表中双击所需字段来将其添加到子报表。
如果计划将子报表链接到主报表,请确保包括将用于创建链接的字段(尽管不希望显示这些字段)。 通常情况下,链接字段是 ID 字段。 在上图中,“订单”表是子报表的记录源,“客户”表是主报表的记录源。 “订单”表和“客户”表通过客户 ID 字段相关,因此该字段要添加到“所选字段”列表。
注意: 可以将多个表和查询的字段添加到子报表中。 添加完一个表中的字段后,从“表/查询”列表中选择下一个表或查询,然后添加所需字段。
单击“下一步”以继续。
-
在此向导页上,确定子报表链接到主报表的方式。 如果 Access 认为某些字段看起来适用于将子报表链接到主报表,向导将显示可能的链接建议列表。
可以选择看起来最能满足需求的链接建议,或者如果不希望将子报表链接到主报表,请选择“无”。 如果要将子报表链接到主报表,但所有建议看起来均不适用,请单击“自行定义”。
注意: 如果向导找不到适用于链接的字段,则不会提供链接建议列表,而是自动选择“自行定义”选项。
选择“自行定义”选项后,向导会显示两组列表。
-
在“窗体/报表字段”下,从主报表中选择要用于将主报表链接到子窗体或子报表的字段。 可以选择至多三个字段,且选定的每个字段必须与子窗体或子报表数据源中的相关字段匹配。
-
在“子窗体/子报表字段”下,从子窗体或子报表中选择链接到选定的主报表字段的对应字段。
-
若要使子窗体或子报表未链接到主报表,请确保所有列表均为空。
单击“下一步”以继续。
-
-
在向导的最后一页上,键入子窗体或子报表的名称,或只需单击“完成”以接受默认设置。
Access 将子报表控件添加到报表并按以下规则绑定控件(即设置控件的“源对象”属性):
-
如果在向导的第一页上选择了“使用现有报表或窗体”,则 Access 将子报表控件绑定到指定的报表或窗体。
-
如果在向导的第一页上选择了“使用现有表和查询”,则 Access 在导航窗格中创建新的报表对象并将子报表控件绑定到该对象。 新报表对象的名称即是在向导最后一页上键入的名称。
将表、查询、窗体或报表添加为报表的子报表
若要将子报表快速添加到报表,可在布局视图或设计视图中打开主报表,然后在导航窗格中将对象拖动到主报表。 如果要将子报表链接到主报表,请确保基础记录源已处于相关状态,且记录源中包含用于将子窗体或子报表链接到主报表的字段。
-
在导航窗格中,右键单击要用作主报表的报表,然后单击快捷菜单上的“布局视图”或“设计视图”。
-
将表、查询、窗体或其他报表从导航窗格拖动到主报表上希望子报表出现的位置。
Access 执行下列操作之一:
-
如果 Access 可以确定链接两个对象的方式,则 Access 将子报表控件添加到报表。 如果添加窗体或报表,则 Access 将子报表控件绑定到该对象。 如果添加表或查询,则 Access 首先创建报表对象,然后将子报表控件绑定到该新对象。
-
如果 Access 无法确定链接两个对象的方式,则显示子报表向导。 若要继续,请按照使用子报表向导创建子报表部分中的过程,从步骤 9 开始操作。
完成向导后,Access 将子报表添加到报表。
通过以下过程仔细检查子窗体或子报表是否已正确链接到主报表。
-
单击子报表控件以将其选中。
-
如果尚未显示属性表,请按 F4 显示该表。
-
在属性表的“数据”选项卡上,检查“链接主字段”和“链接子字段”属性。
-
未链接的子窗体或子报表的这两个属性均应为空。
-
对于链接的子窗体或子报表,“链接主字段”和“链接子字段”属性应显示关联这两个对象的字段。 例如,如果主报表显示“员工”表的信息,且子窗体或子报表显示“订单”表的信息,则“链接主字段”属性应显示“员工”表的 ID 字段,且“链接子字段”属性应显示“订单”表的员工 ID 字段。
-
你可能发现需要编辑这些属性,然后子窗体或子报表才能正常工作。 使用以下过程。
-
在属性表的“数据”选项卡上,单击“链接主字段”属性框,然后单击“生成”按钮 。
将显示“子报表字段链接器”对话框。
-
在“主字段”和“子字段”列表中,选择要用于链接报表的字段。 如果不确定要使用哪些字段,请单击“建议”让 Access 尝试确定链接字段。 完成后,单击“确定”。
如果没有看到要用于链接报表的字段,则需要对主报表或子窗体、子报表的记录源进行编辑,以确保包含链接字段。 例如,如果报表基于查询,则应确保链接字段出现在查询结果中。
-
保存主报表并切换到报表视图,然后验证报表是否按预期工作。
将表或查询作为数据表添加到报表
数据表与电子表格类似,是数据的简单视觉表现形式。 数据表中的每一列代表源表格或查询中的一个字段,每一行代表一条记录。 可以使用子窗体/子报表控件在报表上显示数据表。 要紧凑地显示数据但不需要窗体或报表对象的格式设置功能时,这种技巧十分适用。 向报表添加数据表:
-
在导航窗格中,右键单击要用作主报表的报表,然后单击快捷菜单上的“设计视图”。
-
在“设计”选项卡上的“控件”组中,单击右下角的向下箭头来打开“控件”库:
-
在出现的菜单中,确保没有选中“使用控件向导”。
-
再次打开“控件”库,然后单击“子窗体/子报表”。
-
在报表上,单击要放置该子报表的位置。
-
如果启动了子报表向导,请单击“取消”以将其关闭。
-
如果尚未显示属性表,请按 F4 显示该表。
-
在报表上,单击新的子报表控件以将其选中。
-
在属性表的“数据”选项卡上,单击“源对象”属性框中的箭头,然后单击要在子报表控件中显示的表或查询。 例如,若要显示“订单”表,请单击“Table.Orders”。
Access 基于数据库中定义的关系,尝试将数据表链接到主报表。
-
在属性表的“数据”选项卡上,检查“链接主字段”和“链接子字段”属性。
-
请确保未链接的数据表的这两个属性均为空。
-
对于链接的数据表,请确保“链接主字段”和“链接子字段”属性显示将主报表关联到数据表的字段。 例如,如果主报表显示“员工”表的信息,且数据表显示“订单”表的信息,则“链接主字段”属性应显示“员工”表的 ID 字段,且“链接子字段”属性应显示“订单”表的员工 ID 字段。
-
在某些情况下,你可能需要自己设置链接字段属性。 可使用以下过程执行此操作。
-
在属性表的“数据”选项卡上,单击“链接主字段”属性框,然后单击“生成”按钮 。
-
如果出现安全通知对话框,单击“打开”。
将显示“子报表字段链接器”对话框。
-
在“主字段”和“子字段”列表中,选择要用于将主报表链接到数据表的字段。 如果不确定要使用哪些字段,请单击“建议”让 Access 尝试确定链接字段。 完成后,单击“确定”。
如果没有看到要用于链接的字段,则需要对主报表或数据表的记录源进行编辑,以确保包含链接字段。 例如,如果数据表基于查询,则应确保链接字段出现在查询结果中。
-
保存主报表并切换到报表视图,然后验证报表是否按预期工作。
更改子报表的设计
向报表添加子报表后,你可能想要更改子报表的设计,或想要在主报表上引用子报表数据。 以下部分提供相关提示,帮助你完成这些任务。
在设计视图的新窗口中打开子窗体或子报表
在设计视图中处理主报表时,若要对其中的子窗体或子报表进行设计更改,可以在子窗体或子报表的窗口中将其打开。
-
单击子窗体或子报表以将其选中。
-
在“设计”选项卡上的“工具”组中,单击“新窗口中的子报表”。
注意: 如果子窗体/子报表控件绑定到表或查询,则此命令不可用。
在主报表上显示子报表中的总计
假设你使用名为“订单”的子报表,其中包含名为“运费总计”的文本框,且该文本框计算“运费”列中值的总和。 若要在主报表上显示子报表中值的总和,必须向主报表添加文本框,然后使用表达式引用子报表中的“运费总计”文本框。 可使用以下过程执行此操作。
-
在导航窗格中右键单击主报表,然后在快捷菜单上单击“设计视图”。
-
在“设计”选项卡上的“控件”组中,单击“文本框”。
-
在主报表上,单击要放置新文本框的位置。
-
如果尚未显示属性表,请按 F4 显示该表。
-
在属性表的“数据”选项卡上的“控件来源”属性框中,键入以下表达式。
=IIf(IsError([Orders subreport].[Report]![Shipping Fee Total]),0,[Orders subreport].[Report]![Shipping Fee Total])
注意:
-
在此示例中,可以使用更简单的表达式 =[Orders 子报表].[报告]![运费总计]但是,如果子报表不包含任何数据,则main报表上的控件将显示 #Error。 使用 IIf 函数中的 IsError 函数(如第一个表达式中所示),可确保如果子报表不返回任何数据,则main报表上的文本框显示零 (0) 。
-
单击“控件来源”属性框中的“生成”按钮 ,以使用表达式生成器创建表达式。
-
-
在属性表的“格式”选项卡上,将“格式”属性设置为适当的值(在本例中为“货币”)。
-
保存报表并切换到报表视图,验证计算是否按预期工作。