【问题标题】:Filtering Records in a Form with an Inner Join Query in Access在 Access 中使用内部联接查询过滤表单中的记录
【发布时间】:2014-05-30 09:52:23
【问题描述】:

我的 Access 2013 数据库有两个主表;客户和网站。 Sites 表有一个指向客户记录的外键。我正在将搜索框构建到带有未绑定文本框和命令按钮的站点表单中。按下按钮后,它应该根据搜索条件和 VBA 代码过滤记录。我需要能够通过位于通过外键链接的单独表中的客户名称进行搜索。到目前为止,这是我的按钮代码:

Private Sub cmdSearch_Click()

Dim strSQL As String

strSQL = "SELECT * FROM tblMainSites " & _
            "INNER JOIN tblMainCustomers " & _
            "ON tblMainSites.Customer=tblMainCustomers.CustomerID " & _
            "WHERE tblMainCustomers.Customer LIKE '*" & Me.txtSearch & "*'"

If IsNull(Me.txtSearch) Then
    Me.Filter = ""
    Me.FilterOn = False
Else
    Debug.Print strSQL
    Me.Filter = strSQL
    Me.FilterOn = True
End If

End Sub

问题是每次我尝试过滤记录时,都会得到以下信息:

“运行时错误 3075,查询表达式中的语法错误”

使用调试打印,看起来我写的查询表达式很好,看起来就像我在 Access 中构建的工作查询:

SELECT * FROM tblMainSites INNER JOIN tblMainCustomers ON tblMainSites.Customer=tblMainCustomers.CustomerID WHERE tblMainCustomers.Customer LIKE '*Affinity*'

我的问题是:我是否正确使用了 Me.Filter 方法?我找不到任何使用完整 SQL 字符串的示例。我也尝试过使用 OpenArgs 作为字符串的 DoCmd.OpenForm 方法,但也无济于事。

问另一种方式,有没有办法使用 JOIN 查询过滤 Access 表单中的记录?

我的目标是能够在引用客户表中的客户名称时在站点表中搜索记录,因为在站点表中搜索客户名称失败,因为它是指向客户的外键表。

提前感谢您的帮助!

【问题讨论】:

  • 当您对访问数据库运行生成的 sql 时会发生什么?
  • 实际上,现在我意识到,您可能需要做的就是将您的过滤器设置为Customer LIKE '*" & Me.txtSearch & "*'" Me 已经有数据库,您不是在查询,而是在过滤。所以只需将过滤器设置为where 部分。
  • 你找到答案了吗?
  • paqo,对数据库运行生成的 SQL 会返回我想要的记录。将筛选器值设置为筛选器的 where 部分不起作用,因为值 CustomerName 不在 Sites 表中。站点表中的唯一链接是客户 ID。
  • 啊,是的,您无法过滤不存在​​的内容。 :) 很高兴你明白了。

标签: sql vba filter ms-access-2013


【解决方案1】:

好的,经过更多谷歌搜索,我发现一个网站告诉我,如果表单不基于查询,我不能在表单中使用多个表。

这就是我所做的:

我做了一个名为 qrySites 的查询,它会这样做:

SELECT * FROM tblMainSites INNER JOIN tblMainCustomers ON tblMainSites.Customer = tblMainCustomers.CustomerID;

这给了我一个记录集,其中CustomerIDCustomer 名称相关联。然后我将frmSites 形式的记录源更改为这个新查询,并更新了相应的控制源。

然后,搜索功能过滤记录如下:

Private Sub cmdSearch_Click()

Dim strFilter As String

strFilter = "tblMainCustomers.Customer LIKE ""*" & Me.txtSearch & "*"""

If IsNull(Me.txtSearch) Then
    Me.Filter = "" 'Clears filter if text box is blank when searching
    Me.FilterOn = False
Else
    Me.Filter = strFilter
    Me.FilterOn = True
End If

End Sub

这为Me.Filter 方法提供了正确的输入,即SQL 查询字符串的Where 子句。

我对其进行了测试,并且搜索有效。该表单还通过查询将任何更改传递到相应的表,尽管我确实必须检查我的控制源和表中的某些字段共享名称。

【讨论】:

  • 旧帖子,但您的回答今天对我有所帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2021-09-09
  • 2014-08-13
  • 2013-01-07
  • 2016-09-22
  • 1970-01-01
相关资源
最近更新 更多