如何从组合框中选择访问子表单中的记录

表单包含控件,其中一个或多个可以是其他表单。 包含另一种形式的表单称为主表单。 主表单包含的表单称为子表单。 子表单本身可以包含其他形式,有时也称为子子表单。 本文仅涉及主要形式及其直接子形式。

我读过的有关Access的书包含一些有关子表单的有用信息,但是没有充分涵盖从主表单的组合框中选择子表单中记录的问题。 本文试图纠正这种情况。

在对Access中的表单进行了简要介绍之后,本文介绍了如何使用“表单向导”创建一个包含子表单的表单,通过使用导航按钮可以访问该子表单中的记录。 然后,本文介绍如何在主窗体上提供一个可用于访问子窗体记录的组合框。

本文假定您具有交互式使用Access的一般知识,并且对Visual Basic for Applications(VBA)代码有所了解。

注意:本文是使用Access 2003编写的。使用更高版本的Access版本可能会有一些细微的差异。 子窗体介绍

Microsoft的Northwind示例数据库包含包含子表单的表单示例。 此处显示的Northwind数据库中的Orders表单是子表单的典型示例。

Orders主窗体的记录源是Orders Qry查询,该查询包含有关Orders表中每个订单的信息,并且Customer表和Orders表之间具有一对多的关系。

子表单的源对象是“订单子表单”表单,其记录源是“订单详细信息扩展”查询。 该查询包含有关“订单详细信息”表中每个订单中包含的产品的信息,“产品”表中的产品名称以及显示每个项目的扩展价格(考虑到每个项目的数量和指定折扣)的计算字段。 。 在“产品”表和“订单明细”表之间存在一对多关系。

当第一次打开“订单”主窗体时,它将显示有关为“订单Qry”查询返回的第一个订单指定的客户的信息。 子表单按该顺序显示有关每个项目的信息。 您可以单击主窗体底部的导航按钮以显示有关其他订单的信息。 对于包含三个以上子项目的订单,子表单中有空格,您可以使用出现在子表单右侧的滚动条来滚动这些项目。

该数据库目前存在的一个问题是没有简单的方法来选择有关特定订单的信息。 假设您需要有关B饮料订单的信息。 您可能希望能够在“开单至”组合框中输入该客户名称,以访问相关信息。 但这不会发生。 访问有关特定订单信息的唯一方法似乎是使用表单底部的导航按钮来逐步浏览订单记录,直到找到所需的记录为止。

本文解决了这个问题,展示了如何在主窗体中使用组合框轻松访问子窗体中的详细信息。 本文使用了一个比Northwind简单得多的数据库,以便专注于相关主题。

有关子窗体的更多信息

直接打开的表单和作为主表单中的子表单对象打开的表单之间存在显着差异。 在简单表单及其子表单的情况下,您不必担心这些差异,但是在尝试更复杂的情况时,必须了解它们。

考虑罗斯文数据库中的“订单子窗体”表单。 直接从数据库窗口在设计视图中打开该表单,右键单击“订单”表单设计视图顶部水平标尺左端的按钮以显示上下文菜单,然后在该菜单中选择“属性”以显示表单的属性。 选中“数据”选项卡后,您将看到表单的“记录源”为“订单数量”。 选中事件标签后,您会看到一长串可用事件。

现在,在“订单”主窗体中查看子窗体的属性。 在仍然显示“订单”表单的设计视图的情况下,右键单击子窗体顶部标尺左端的按钮以显示子窗体的属性。 选择“数据”选项卡后,您将看到一组不同的属性。 除了“记录源”,还有“源对象”,在这种情况下,该对象是“订单”子窗体。 “链接子字段”和“列表主字段”属性控制子表单如何链接到主表单。 选中“事件”标签后,您会看到另一组可用事件; 而不是可用事件的长列表,只有两个,Enter Enter和On Exit,当您直接打开表单时,这两个都不在可用事件列表中。

创建一个包含子窗体的简单窗体

首先创建一个包含两个表的数据库,一个表包含用于主表单的数据,另一个表包含用于子表单的数据。 下面的Publishers示例包含一个名为Publisher的表,该表包含书籍发布者的名称;一个名为Book的表,其中包含书籍标题和作者名称。 目的是能够识别每个出版商的书籍。

使用两个字段创建Publisher表:PublisherID(主键)和PublisherName(文本)。 主键对于此表至关重要。 在表中输入发布者的几个名称。 输入发布者名称时,Access会自动为每个发布者提供一个主键。

注意:通常,请避免使用包含表,字段,查询和其他对象的空格的名称。 尽管空间是可以接受的,但是在开发数据库时,它们可能会给您带来麻烦。

创建具有四个字段的Book表:BookID(主键),Title(文本),Author(文本)和PublisherID(长整数)。 主键对于此表不是必需的,但是提供主键是一种很好的做法。 PublisherID字段在两个表之间建立的关系中充当外键。 输入有关在Publisher表中命名的出版商的几本书的信息(书名和作者的姓名),以确保至少有一些出版商列出了两本书或更多本书。

注意:在此示例中,第一个表中的主键和第二个表中的外键使用相同的名称。 尽管这是常见做法,但不是必需的。 主键和外键可以具有不同的名称。

创建并保存两个表并输入一些数据后,关闭所有打开的表,然后选择“工具” |“表”。 关系打开“关系”窗口。 在该窗口中显示Book和Publisher表。 从Publisher表中的PublisherID字段拖动到Book表中的PublisherID字段,以在这些表之间建立关系。 在自动打开的“编辑关系”窗口中,确认选择了正确的字段,并且关系类型为“一对多”。 单击“强制引用完整性”复选框以将其选中,然后单击“创建”以创建关系并关闭“编辑关系”窗口。 现在,“关系”窗口应显示两个窗口之间已建立的关系。 关闭“关系”窗口。

现在,您准备创建主表单及其子表单。 做这个:

  1. 在数据库窗口中,选择“表单”,然后单击“新建”以打开“新建表单”窗口。
  2. 选择表单向导,然后单击确定以显示该向导。
  3. 打开表/查询列表以显示可用的表和查询。
  4. 选择要用作主表单(在这种情况下为Publisher表)的记录源的表或查询。
  5. 将要在主窗体上具有的可用字段的名称移到“选定的字段”列。 在这种情况下,单击>>移动两个可用字段。
  6. 重新打开表/查询列表,然后选择要用作表单记录源的表或查询,该表或查询将成为子表单(在本例中为Book)的源对象。
  7. 将想要在子窗体上具有的可用字段的名称移到“选定的字段”列。 在这种情况下,双击“标题”,“作者”和“出版者ID”字段以将它们移动-您现在不需要“ BookID”字段。
  8. 单击“下一步”显示下一个“表单向导”窗口。
  9. 选择您要如何查看数据。 在这种情况下,请选择Publisher以使其成为主要表单。 在窗口底部附近,选择带有子表单的表单。
  10. 单击“下一步”显示下一个“表单向导”窗口。
  11. 选择表单的布局。 在这种情况下,选择表格。
  12. 单击“下一步”显示下一个“表单向导”窗口。
  13. 选择表单的样式。 在这种情况下,请选择“标准”。
  14. 单击“下一步”显示下一个“表单向导”窗口。
  15. 如果您希望表单的名称与建议的名称不同,请替换建议的名称。 向导建议的名称可能包含空格。 删除这些空格或将其替换为下划线。
  16. 单击“完成”以接受您在“表单向导”中所做的所有选择,然后关闭向导。 Access将显示您创建的表单和子表单,如下所示。

您可以单击主窗口底部的导航按钮,一个接一个地选择发布者。 选择每个发行者后,该子发行者中的书籍将显示在子表单中。 表单向导创建一个子表单,该子表单仅具有两个书记录的空间。 如果发布者的书籍多于两本,则可以使用子表单右侧的垂直滚动条滚动书籍,也可以使用子表单下方的导航按钮来访问书籍记录。最初未显示。

仔细查看表格,如上图所示。 字段的一部分显示在子窗体的右侧。 使用子窗体底部的水平滚动条向右滚动。 您会看到部分显示的字段是PublisherID字段。 在那里是因为您在表单向导中指定了该字段(前面​​过程的步骤7)。 必须包含该字段,因为子表单需要知道它才能链接到主表单。 但是,您可能不希望该字段显示在子窗体中,因为PublisherID字段已经显示在主窗体中。

若要更正此问题,请关闭主窗体,在“数据库”窗口中选择“书籍子窗体”窗体,然后在设计视图中打开该窗体。 选择PublisherID标签,然后按Delete键将其删除。 选择PublisherID文本框,然后按Delete键将其删除。 保存并关闭“书子表单”表单。 在窗体视图中重新打开Publisher窗体。 现在,子窗体不包含部分显示的PublisherID字段,如下所示。

在继续进行之前,请查看子窗体的属性。 在设计视图中显示主窗体(包括其子窗体)后,右键单击子窗体水平标尺左端的按钮以显示上下文菜单。 在上下文菜单中选择“属性”以显示“属性”窗口。 选择数据选项卡以显示此处显示的属性。

要注意的重要属性是“链接子字段”和“链接主字段”。 要显示有关这些属性的更多信息,请单击字段值之一;否则,单击“确定”。 一个带省略号(三个点)的按钮,其标题显示在值​​的右侧。 单击该按钮以显示“子窗体字段链接器”窗口。

“链接子字段”属性标识子窗体中链接到主窗体的字段。 “链接主字段”属性标识主表单中链接到子表单的字段。 在此示例中,这两个字段具有相同的值,因为作为主窗体的记录源的表中的主键字段与作为子窗体的记录源的表中的外键具有相同的名称。

如果其他字段可用作“链接子字段”或“链接主字段”属性(在这种情况下不可用),则可以在“属性”窗口或“子窗体字段链接器”窗口中更改值。

您可以创建一个包含子表单的表单,而无需使用“链接子字段”和“链接主字段”属性,如下所述。

创建不包含链接子字段和链接主字段属性的包含子窗体的表单。

如果要保存前面的示例,请使用Windows资源管理器制作数据库文件的副本,并为该副本指定适当的名称。 继续使用副本。

在设计视图中打开主表单(Publisher),右键单击表单水平标尺左端的按钮,然后在上下文菜单中选择“属性”以在“属性”窗口中显示表单的属性。 展开“属性”窗口顶部的对象列表,然后选择“书籍子表单”以显示子表单的属性。 在“数据”选项卡中,删除“链接子字段”和“链接主字段”属性的值。 保存表格。

切换到表单视图。 现在,当您使用主窗体底部的导航按钮时,选定的发布者会更改,但子窗体中什么也不会发生。 向下滚动子窗体或单击该窗体的导航按钮时,将看到所有可用的书,而与选定的出版商无关。 此行为是由于两种形式之间没有链接引起的,因为已删除了“链接子字段”和“链接主字段”属性的值。

若要创建一种在子窗体中显示正确书籍的新方法,请关闭Publisher窗体,然后创建一个新查询。 该查询应包含要在子表单中显示的字段以及用作外键的字段。 为外键字段定义一个标准,该条件表示该字段的值必须与主窗体中的主键的值相对应,如此处显示的“按示例查询”(QBE)窗口中所示。

相应的SQL代码为:

SELECT Book.Title, Book.Author, Book.PublisherID
FROM Book
WHERE (((Book.PublisherID)=[Forms]![Publisher]![PublisherID]));
切换到查询的数据表视图,您将看到以下对话框:

因为发布者表单不可用于提供指定条件的值。 在文本框中,在Publisher表中输入PublisherID的值之一,然后单击“确定”。 现在,查询的数据表视图应正确显示来自出版商的与您输入的PublisherID值相对应的书籍。 这验证新查询是否正常工作。

保存新查询,为其命名,例如BooksCriterion,然后关闭查询。 在“数据库”窗口中,在设计视图中显示子窗体。 右键单击水平标尺左端的按钮以显示上下文菜单,然后单击该菜单中的“属性”以显示“属性”窗口。 在该窗口中选择“数据”选项卡。 将“记录源”属性的值更改为刚创建的查询的名称,例如BooksCriterion。 保存并关闭查询。

在窗体视图中打开发布者窗体。 表单应打开,并选择第一个出版商,并且子表单应显示该出版商的书名。 使用主窗体底部的导航按钮选择各种发布者。 选中每个出版商后,子窗体应显示该出版商的书名。 如果这没有发生,则可能是新查询中定义的条件不正确。 例如,条件条件中的字段名称可能与主表单中的实际字段名称不匹配。

您可能想知道以这种方式指定主窗体和子窗体之间的链接的目的是什么,当它仅获得与使用链接子字段和链接主字段属性定义链接的初始示例相同的结果时。 您可能不会使用此技术来定义表单向导可以自动创建的功能。 但是,刚刚描述的在主表单和子表单之间创建链接的方法表明,与“链接子字段和链接主字段”对属性可以提供的灵活性相比,您可以提供更多的灵活性。 在本文的后续文章中,您将看到如何使用“链接子字段”和“链接主字段”属性来完成某些工作。

改进表格布局和性能

您不必接受由表单向导自动创建的布局。 要更改主窗体的布局,请在设计视图中显示该窗体,并采用常规技术进行更改,例如窗体的大小,控件在窗体上的大小和位置以及显示文本的字体。

要更改子窗体的布局,请首先选择子窗体,然后选择该子窗体上的控件。 或者,关闭主窗体,然后在数据库窗口中选择子窗体,然后在设计视图中将其打开。 在那里,您可以按常规方式进行更改并保存表格。 这些更改随后将在您重新打开主窗体时生效。

当您使用表格作为记录源创建诸如Publishers的表单和诸如BookSubform之类的子表单时,发布者的名称将按照它们在该表单的记录源的表中出现的顺序在主表单中显示。 同样,在子窗体中显示书名的顺序是在作为子窗体的记录源的表中列出这些书的顺序。 您可能希望按字母顺序列出出版商名称和书名。

要按字母顺序列出图书,请打开您刚创建的查询。 选择设计视图,然后将“标题”的“排序”属性设置为“升序”。 保存并关闭查询。

要按字母顺序列出发布者,请创建一个新查询,其中包含要在主表单中使用的Publishers表中的字段,在本例中为PublisherName和PublisherID。 将PublisherName的排序顺序设置为升序。 保存并关闭查询。 在设计视图中打开主窗体Publisher,并显示其属性。 将表单的“记录源”更改为刚创建的查询的名称。

随后,当您在窗体视图中显示发布者表单并使用导航按钮从一个发布者移动到下一个发布者时,您将按字母顺序查看发布者的名称。 为每个出版商列出的书籍也将按字母顺序排列。

当您使用仅包含少量项目的表时,剩下的一个问题并不明显,但是当您拥有大表时,该问题立即变得显而易见。 假设发布者表列出了数百甚至数千个发布者。 使用导航按钮查找特定的发布者将非常繁琐。 这是我在创建链接数千个项目的数据库时遇到的问题。

刚刚描述的问题的一种解决方案是在主表单中使用一个组合框来选择要在子表单中显示的详细信息。 如果将组合框的“自动扩展”属性设置为“是”,则只需在组合框中输入项目值的前几个字符,该框就会找到以这些字符开头的第一个项目。

使用组合框选择主窗体中的项目

表单向导没有提供创建带有组合框的主表单的方法,可以从中选择要在子表单中显示的项目。 必须采用其他方法。

此时,如果您按照本文第一部分中所述的步骤进行操作,则可能需要保存数据库,然后使用Windows资源管理器创建数据库的另一个副本。 后续文本假定您已完成此操作。

在新版本的数据库中,在设计视图中打开Publisher表单。 删除PublisherID字段及其关联的标签。 选择PublisherName字段,选择Format |。 更改为| 组合框。 为组合框指定一个适当的名称,例如SelectPublisher。

后续步骤为组合框定义适当的属性。

  1. 右键单击组合框以显示其上下文菜单。
  2. 选择“属性”以显示组合框的属性窗口。
  3. 选择格式选项卡。
  4. 将列计数属性设置为2(因为组合框应包含PublisherID和Publisher字段)。
  5. 将“列宽度”属性设置为0; 5(以隐藏第一列)。
  6. 选择数据标签。
  7. 将“绑定列”属性设置为1(这是包含发布者名称的第二列)。
  8. 删除控制源的值。
  9. 单击“行来源”属性,然后单击出现在值空间右端的三角形,以查看可用来源的列表。 选择主表单所基于的查询的名称。
  10. 设置其他格式属性以匹配您的首选项。
  11. 保存并关闭表格。
  12. 修改现有的BooksCriterion查询。 该查询应包含要在子表单上显示的字段以及将子表单链接到主表单的字段,如下所示。

相应的SQL代码为:

SELECT Book.Title, Book.Author, Book.PublisherID
FROM Book
WHERE (((Book.PublisherID)=SelectedPublisherID()));
请注意,现在已将PublisherID字段的条件指定为一个函数。 在“数据库”窗口中选择“模块”。 选择一个现有的代码模块或创建一个新的模块。 输入此功能:
Function SelectedPublisherID()
    SelectedPublisherID = Forms!Publisher!SelectPublisher.Column(0)
End Function
该函数返回的值是从Publisher表单的组合框的第一列(包含PublisherID值的列)派生的。 保存功能。

当您在主窗体的组合框中选择发布者名称时,您需要更新子窗体,以便它使用更新的查询。 为此,请创建一个响应组合框的AfterUpdate事件的过程。 在设计视图中打开主窗体的情况下,显示组合框的“属性”窗口,然后选择“事件”选项卡。 单击更新后; 右侧将出现一个带有省略号(三个点)的按钮。 单击省略号按钮; Access将显示“选择生成器”对话框。 在该对话框中选择“代码生成器”,然后单击“确定”。 Access显示代码窗口,在其中自动创建了框架过程。 该基本过程包括:

Private Sub SelectPublisher_AfterUpdate(Cancel As Integer) 
End Sub
在框架中添加一个语句,使其变为:
Private Sub SelectPublisher_AfterUpdate(Cancel As Integer)
    BookSubform.Requery
End Sub
注意: VBA要求子窗体名称不包含空格。 如果名称包含空格,例如Book Subform,则VBA代码要求名称不包含空格。 如果子窗体名称包含一个空格,请用下划线替换该空格。

在对象上执行Requery方法时,在这种情况下,子窗体Access会重新运行对象所基于的查询,从而更新对象。

保存数据库,然后关闭代码窗口。

在“数据库”窗口中选择“表单”,然后在表单视图中显示“发布者”表单。 现在,您应该能够在组合框中选择出版商名称,并在子窗体中查看有关该出版商的书籍的信息。

您不再需要主窗体中的导航按钮,记录选择器和分隔线,因此可以将其删除。 为了简化和改善主窗体的外观,请切换到窗体的设计视图,显示“属性”窗口,选择“格式”选项卡,然后将“记录选择器”,“导航按钮”和“分隔线”属性设置为“否”。

保存该窗体并返回到窗体视图,并使用组合框选择发布者。 您看到的表格应类似于此处显示的表格。

保留在此表单中的导航按钮将应用于子表单; 它们可用于访问该子表单中最初未显示的任何记录。

我希望本文提供的信息比以前从其他来源收集的信息能使您对子表单有更全面的了解,并且现在您知道如何在主表单中使用组合框来访问子表单中的记录。

戈登·帕德威克

From: https://bytes.com/topic/access/insights/900238-how-select-records-access-subform-combo-box

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值