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

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

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

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

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”表-多对多关系中的第三个。这很好用,但是如果我想通过联系人留下的笔记进行搜索怎么办?该表称为“笔记”,并且与“人”(联系人)具有多对一关系。这是一个自由格式的文本块,用于输入与联系人有关的注释。

我对它的工作原理有一个大致的了解,从理论上讲,它应该比上述方法更容易:只需基于一个SQL查询设置主窗体的RecordSource,该SQL查询将在Notes表中搜索通配符侧。但是,我无法提出解决方案。这主要是由于我缺乏VBA知识,但是我正在学习。

super___1987cl 回答:Access VBA:如何通过一对多关系搜索子表单来过滤主表单?

输入此内容后,我意识到我确实拥有VBA和SQL的专业知识来组合解决方案,但我想无论如何我还是将其发布。

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

请注意:我将%通配符明确地包含在代码的两边,因为我认为这是一种比通常的用例还要多的用例,而不是在搜索字段中显式搜索与文本完全匹配的注释。我想您可以排除通配符,并教用户如何自己添加通配符,这可能是更好的选择。

本文链接:https://www.f2er.com/2871470.html

大家都在问