Access 2013 - 由表单上的组合框过滤的嵌入式查询
Access 2013 - Embedded query filtered by combo box on form
我是 Access 的新手,这就是我遇到的问题:我有四个 tables - Task、Person、Role 和 TaskPerson(映射 table)。我有一个表单,顶部有一个未绑定的组合框,显示来自 Person 的人员列表。在表单的正文中,我有一个从作为数据表嵌入的 Task 和 TaskPerson tables 提取的查询。 TaskPerson 中的字段对 Person 和 Role 执行查找以显示实际值。每个任务可以分配给多个人,每个人可以有多个角色。我希望从组合框中选择一个名称,并更新数据表以仅显示与该人相关的任务(即将组合框中的名称与表单上的人员字段(这是一个查找)中的名称相匹配)只显示那些任务)。
我已尝试调整查询的记录源,以便使用
从组合框中提取人员字段条件
'Forms![Task Form]![Combo11]'
但这并没有奏效。我也试过这个 answer:
的一个版本
Private Sub Form_SelectionChange()
' If the combo box is cleared, clear the form filter.
If Nz(Form) = "" Then
Me.Form.Filter = ""
Me.FilterOn = False
' If a combo box item is selected, filter for an exact match.
' Use the ListIndex property to check if the value is an item in the list.
ElseIf Me.Combo11.ListIndex <> -1 Then
Me.Form.Filter = "[Combo11] = '" & _
Replace(Me.Combo11.Text, "'", "''") & "'"
Me.FilterOn = True
End If
End Sub
虽然代码没有中断,但它也没有从组合框中获取选定的名称,因此它不会更新。一个可能的因素是当我键入 Me.Combo11.Text 时,它实际上并没有将 Combo11 显示为一个选项。我试着输入它,希望能奏效,但我知道这有点愚蠢。
任何详细答案将不胜感激。我还在学习我的方法,我有点容易迷路。
史蒂夫
第一种方法比较简单。
在查询中你有
WHERE TaskPerson = Forms![Task Form]![Combo11]
请注意,组合引用周围有 no '。使用 'Forms![Task Form]![Combo11]'
整个事情都被解释为字符串,所以它不起作用。
那么在 Combo11_AfterUpdate
中你只需
Me.Requery
这种方法的缺点:你总是要select一个人,否则表格将是空的。
第二种方法:
您的查询列出了所有记录,组合框应用了过滤器。或者,如果用户清除了组合框,则将其删除。
我建议回到您使用的answer,只替换
Combo_Reported_LOB_Selection
来自 Combo11
和
[ReportedLOB]
来自 [TaskPerson]
并且代码不会进入 Form_SelectionChange()
,而是进入 Combo11_AfterUpdate()
我是 Access 的新手,这就是我遇到的问题:我有四个 tables - Task、Person、Role 和 TaskPerson(映射 table)。我有一个表单,顶部有一个未绑定的组合框,显示来自 Person 的人员列表。在表单的正文中,我有一个从作为数据表嵌入的 Task 和 TaskPerson tables 提取的查询。 TaskPerson 中的字段对 Person 和 Role 执行查找以显示实际值。每个任务可以分配给多个人,每个人可以有多个角色。我希望从组合框中选择一个名称,并更新数据表以仅显示与该人相关的任务(即将组合框中的名称与表单上的人员字段(这是一个查找)中的名称相匹配)只显示那些任务)。
我已尝试调整查询的记录源,以便使用
从组合框中提取人员字段条件'Forms![Task Form]![Combo11]'
但这并没有奏效。我也试过这个 answer:
的一个版本Private Sub Form_SelectionChange()
' If the combo box is cleared, clear the form filter.
If Nz(Form) = "" Then
Me.Form.Filter = ""
Me.FilterOn = False
' If a combo box item is selected, filter for an exact match.
' Use the ListIndex property to check if the value is an item in the list.
ElseIf Me.Combo11.ListIndex <> -1 Then
Me.Form.Filter = "[Combo11] = '" & _
Replace(Me.Combo11.Text, "'", "''") & "'"
Me.FilterOn = True
End If
End Sub
虽然代码没有中断,但它也没有从组合框中获取选定的名称,因此它不会更新。一个可能的因素是当我键入 Me.Combo11.Text 时,它实际上并没有将 Combo11 显示为一个选项。我试着输入它,希望能奏效,但我知道这有点愚蠢。
任何详细答案将不胜感激。我还在学习我的方法,我有点容易迷路。
史蒂夫
第一种方法比较简单。
在查询中你有
WHERE TaskPerson = Forms![Task Form]![Combo11]
请注意,组合引用周围有 no '。使用 'Forms![Task Form]![Combo11]'
整个事情都被解释为字符串,所以它不起作用。
那么在 Combo11_AfterUpdate
中你只需
Me.Requery
这种方法的缺点:你总是要select一个人,否则表格将是空的。
第二种方法:
您的查询列出了所有记录,组合框应用了过滤器。或者,如果用户清除了组合框,则将其删除。
我建议回到您使用的answer,只替换
Combo_Reported_LOB_Selection
来自 Combo11
和
[ReportedLOB]
来自 [TaskPerson]
并且代码不会进入 Form_SelectionChange()
,而是进入 Combo11_AfterUpdate()