My Access 2013数据库有两个主要表格;客户和网站。 Sites表具有指向Customer记录的外键。我正在使用未绑定的文本框和命令按钮在“站点表单”中构建搜索框。按下按钮后,它应根据搜索条件和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,查询表达式中的语法错误”
使用Debug Print,看起来我写的查询表达式很好,看起来就像我在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表单中的记录?
我的目标是能够在引用Customers表中的Customer名称时搜索Sites表中的记录,因为在Sites表中搜索客户名失败,因为它是指向Customers的外键表
预先感谢您的协助!
答案 0 :(得分:0)
好的,经过更多的谷歌搜索,我发现一个网站告诉我,我不能在一个表格中使用多个表,而不是在查询基础上。
这就是我的所作所为:
我做了一个名为qrySites的查询,它执行了此操作:
SELECT * FROM tblMainSites INNER JOIN tblMainCustomers ON tblMainSites.Customer = tblMainCustomers.CustomerID;
这为我提供了一个记录集,其中CustomerID
与Customer
名称相关联。然后我将表单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
子句。
我测试了它,搜索工作正常。该表单还通过查询将任何更改传递到适当的表,但我必须检查我的控件源和表中的一些字段共享名称。