Access VBA: 如何通过一对多关系搜索子窗体来过滤主窗体?

Access VBA: How to filter a mainform by searching a subform in a one-to-many relationship?

我有一个用于输入联系人的表单,其中包含多个子表单,其中许多代表多对多关系。我希望用户能够通过子表单中的值搜索联系人。

具有讽刺意味的是,我实际上有一个很好的实用解决方案来搜索那些代表多对多关系的子表单——通常,这些是给我带来最多麻烦的!问题是,我使用的解决方案使用组合框,因此允许用户仅通过下拉列表中可用的确切值进行搜索。这就是我的意思:

Private Sub cboSourceSearch_AfterUpdate()

Dim strSQL As String
If IsNull(Me.cboSourceSearch) Then
    Me.Parent.RecordSource = "people"
Else
    strSQL = "SELECT DISTINCTROW people.* FROM people " & "INNER JOIN people_has_sourceref ON " & "people.personID = people_has_sourceref.people_personID " & "WHERE people_has_sourceref.sourceref_sourceID = " & Me.cboSourceSearch & ";"
    Me.Parent.RecordSource = strSQL
End If

End Sub

(改编自http://allenbrowne.com/ser-28.html
本质上,这个 VBA 是根据组合框中的值设置主窗体的 RecordSource,其行源是 "sourceref" table-- 多对多中的第三个关系。这很好用,但是如果我想通过联系人上留下的便条进行搜索怎么办? table被称为"Notes",与People(联系人)是多对一的关系。它是一个自由格式的文本块,用于输入与联系人相关的注释。

我已经大致了解了它是如何工作的,理论上它应该比上面的方法更简单:只需根据 SQL 搜索注释的查询设置主窗体的 RecordSource table 两边都有通配符。但是,我无法提出解决方案。这主要是由于我缺乏 VBA 知识,但我正在学习。

打完这个之后,我意识到我确实有 VBA 和 SQL 的诀窍来组合一个解决方案,但我想我还是 post 这个为了 post 诚实。

Private Sub NoteSearch_AfterUpdate()
    Dim strSQL As String
    If IsNull(Me.NoteSearch) Then
        Me.Parent.RecordSource = "people"
    Else
        strSQL = "SELECT DISTINCTROW people.* FROM people INNER JOIN notes ON people.personID = notes.people_personID WHERE notes.note LIKE '%" & Me.NoteSearch & "%'"
        Me.Parent.RecordSource = strSQL
    End If
End Sub

请注意:我已经在代码中明确地在文本的两边包含了 % 通配符,因为我认为这是一个比明确搜索其确切文本与搜索中的文本匹配的笔记更常见的用例场地。我想您可以排除通配符并教用户如何自己包含它,这可能更可取。