ms-Access 不使用组合框显示值作为查找值

Posted

技术标签:

【中文标题】ms-Access 不使用组合框显示值作为查找值【英文标题】:ms-Access Not using combo box display values as the lookup value 【发布时间】:2021-04-17 21:12:26 【问题描述】:

注意 我对原始帖子进行了重大编辑,以包含更多相关信息并删除了无关紧要的信息。部分 cmets 是基于删除的信息,但原题的完整性依然完好,这些 cmets 仍然具有相关性和有用性。

在我的数据库中,我有一个表tblStandards,其中包含一个化合物名称列表及其相关字段。 我创建了一个表单来生成一个子表单,该子表单仅在您选择溶液混合物时填充化合物名称及其数据(我将这些称为“句柄”)。我使用此子表单作为生成与该溶液混合物“句柄”相关的所有相应化合物的“位置查找器”的一种方式。问题是某些化合物用于多种不同的混合物中,因此具有多个“句柄”。我按照@June7 的建议包含了一个级联组合框,但我遇到了最后一个组合框过滤器的问题。

我不想将一个单独的字段附加到我的 tblStandards 与组合框显示值(“句柄”)只是为了过滤我的表(这是我过去所做的)。在我的表格中使用组合框显示值字段是可行的,但它是有限的,我希望使其更加模块化。我有第二张表tblComboBox,它有三个字段; [化合物名称]、[Standard_InternalStd] 和 [Cal_QC_Handle]。

我有级联组合框工作,除了最后一个过滤器。我想我找到了一种基于表格进行过滤的迂回方法。我正在使用带有FilterOn 函数的After_Update 事件来过滤TempSubform,它基于将[Cal_QC_Handle] 与cboxSecondChoice 匹配来过滤tblComboBox,然后使用TempSubform![Compound Names] 字段作为第二个FilterOn我的MainSubform 的功能。 我的代码正在运行,但第二个FilterOn 仅使用我的TempSubform 中的第一个复合名称来过滤MainSubform。我想根据Tempsubform.[Compound Name] 中的所有行进行过滤。我认为我的问题在于我的 " & Me.Temsubform![Compound Name] &" 代码块。

Private Sub cboxSecondChoice_AfterUpdate()

Dim Filter_Tempsubform As String
Filter_Tempsubform = "[Cal_QC_Handle] ='" & Me.cboxSecondChoice & "'"
Forms![Standards_Form]![TempSubform].Form.FilterOn = False
Forms![Standards_Form]![TempSubform].Form.Filter = Filter_Tempsubform
Forms![Standards_Form]![TempSubform].Form.FilterOn = True

Dim Filter_MainSubform As String
Filter_MainSubform = "[Compound Name] = '" & Me.TempSubform![Compound Name] & "'"
Forms![Standards_Form]![MainSubform].Form.FilterOn = False
Forms![Standards_Form]![MainSubform].Form.Filter = Filter_MainSubform
Forms![Standards_Form]![MainSubform].Form.FilterOn = True

End Sub

问题是过滤器仅使用一个化合物名称(列表中的第一个)进行过滤。我需要过滤器来使用新过滤的 TempSubform 中的 all 复合名称。抱歉,如果这是一个非常复杂的方法。到目前为止,我看到的每个示例总是在他们正在过滤的表中嵌入组合框值,这是我希望避免的。

更新

我已经放弃了我的第一次尝试(带有临时子表单的双重 FilterOn 函数)并且我有一个工作表单!我不得不修改我的tblStandards 以包含一个新字段,该字段包含我最终选择的组合框的值(由于我对这种设计的感知限制,我最初想绕过它)。我表上的新Form-Handle 字段是一个带有多个单个“句柄”的字符串,如果最终的组合框选择(只能选择一个“句柄”)在使用通配符“Like *”的子表单中,我将使用它。这些“句柄”中的每一个都对应于一种溶液混合物,它是一个特定的化合物列表。

此解决方案允许我使用一种化合物来制造多种不同的解决方案,如果您从下拉组合框中选择任何这些解决方案来制造,该化合物将被返回。我认为这是解决我的问题的最简单方法,我可能只是太固执地寻找过于复杂的解决方案。

我从Allen Browne's ms-Access "Filter a Form on a Field in a Subform"修改了代码

Relationships (All)

Form with cascading comboboxes and filter button

Working code

【问题讨论】:

我无法想象查找表的替代方案。基于我认为你想做的,这就是他们的目的。虽然,我并不完全清楚您的问题到底是什么。 对不起,我在原帖中并不清楚,但我不知道如何编码或使用组合框属性使组合框显示值引用其他值列表以过滤子窗体。例如从上面看,我希望组合框显示“标准”选项; 《内部标准》; “Misc.”,这些选项中的每一个都会从查找表tblComboBoxFilterValues 中提取相应的值,以用于过滤我的子表单。如果显示值实际存在于子表单中,我只知道如何制作组合框过滤器。 这听起来像是所谓的“级联”组合框——一个非常常见的话题。组合框提供广泛类别的列表,然后根据第一个组合框中的选择过滤另一个组合框列表。做一些研究并努力。需要一点 VBA。 谢谢@June7,我不知道名字。我将查看 eckman 提供的教程!我也想尝试一些 VBA,所以我会试一试并回复您。 【参考方案1】:

正如@June7 所说,级联组合框(或列表框)是用于数据表多级过滤的标准 UI 设计。如果我有可用的表单空间,我更喜欢级联列表框而不是组合框,因为它们提供了视觉提示。比如看看Digi-Key does it是怎么回事。级联组合框的问题已被质疑至死here。过滤数据、列表或组合的框通常是未绑定的,应该同时用于更新数据。它们的唯一目的是显示项目选择、选择一个项目并将其值传递给下一个过滤器。

我在下面链接到一些教程,它们几乎不需要 VBA 代码。第三个教程过滤“植物和动物,按其分类等级分类”,这与过滤化合物类似。第 4 个是我之前对类似问题的回答之一。

Microsoft Access: How to Create Cascading Combo Boxes Access 2016 - How to Make a City/State Selector (Cascading Combo Boxes) Creating Cascading Combo Boxes and List Boxes on Microsoft Access Forms Creating Cascading Comboxes in VBA code using RowSource

【讨论】:

在第三个链接(过滤植物和动物)中,如果我正确理解了他们的代码,他们通过将字段 KingdomID 设置为等于最终组合框中的选择 @ 来更新 lstSpeciesID.RowSource 987654329@?就我而言,我的最终组合框值不在我希望过滤的子表单中,这与提供的示例不同,其中 cboKingdomID 实际上位于其表中的 KingomID 字段或qryTaxonomy 我的最后一个组合框值 (CAL-QC) 是从只有 3 个字段的表中提取的;化合物名称、标准内部标准和 CAL-QC。我想使用最后一个组合框值来提取关联的复合名称字段,然后使用复合名称过滤我的子表单。我的子表单正在从具有 >10 个字段的表中提取数据,并且它们都没有最终组合框中的确切值。 我在原始帖子中添加了更新。感谢@eckman 对级联组合框以及 June7 的帮助。我想我找到了使用最后一个组合框过滤的最新问题的解决方法,但我认为我的语法错误? @Ari 我刚刚看了你的消息。我一直很忙。我确信您的问题描述在您的脑海中是有意义的,因为您可以看到整个应用程序。您能否添加表格关系的屏幕截图,Standards_Form 与 MainSubform 可见,以及 cboxSecondChoice 展开(“下拉”)? @Ari 我有更多时间来回顾一下。我同意你的看法。您的解决方案是“复杂的”。关系数据库需要遵循特定的结构和规则才能按预期运行。你可以稍微改变规则,但不能改变很多。我已经用一个新链接更新了我的答案,该链接指向我以前的答案之一,该链接演示了如何过滤 VBA 代码中的级联组合框。

以上是关于ms-Access 不使用组合框显示值作为查找值的主要内容,如果未能解决你的问题,请参考以下文章

在 ms-Access 中使用组合框创建搜索表单

在 MS-Access 中,当外键不再存在时,如何在组合框中显示旧的外键?

如何设置MS-Access文本框以根据表值直接输入您正在键入的内容?

访问 VBA - 使用组合框(多值字段)时类型不匹配

在没有鼠标的情况下一遍又一遍地使用 MS-Access 组合框

将文本框中的值插入 2 个不同的表 ms-access