使用变量过滤列表框时出现问题

时间:2019-07-05 17:27:56

标签: vba ms-access access-vba

我不确定这是否是完成我要完成的工作的最佳方法,但是我目前正在尝试使用多个文本框更改列表框上的活动过滤器。

我有一个主搜索框,它过滤了一个初始列表框,这也将过滤我的其他一些列表框,这些列表框也填充了相关数据。

当我查看其他列表框(不是我的主要列表框)时,我有想要进一步过滤的数据。因此,我进入另一个文本框,然后输入要尝试进行排序的内容,当我单击第二个“搜索按钮”时,这就是我得到错误的地方。这是一个语法错误,但我不完全理解其背后的语法。

除了新的搜索条件外,我还希望保留初始过滤器。

这是我最初的搜索按钮后面的代码(此方法有效)

Private Sub Command37_click()
    Dim sql As String
    Dim sql2 As String

sql = "SELECT People.LName, People.[Phone #], People.State " _
    & "FROM People" _
    & "WHERE SystemLocation LIKE '*" & Me.SearchTxt1 & "*' " _
    & "ORDER by People.LName "

    me.List35.RowSource = sql
    me.list35.requery

sql2 = "SELECT Orders.Item, Orders.Price, Orders.Department " _
     & "FROM People INNER JOIN Orders " _
     & "ON People.SystemLocation = Orders.Department " _
     & "WHERE Department LIKE '*" & Me.SearchTxt1 & "*' " _
     & "ORDER by Orders.Department"

    Me.List41.RowSource = sql2
    Me.List41.Requery

这是我尝试与辅助过滤器一起使用的代码

Dim sql2 As String

sql2 = "SELECT Orders.Item, Orders.Price, Orders.Department " _
         & "FROM People INNER JOIN Orders " _
         & "ON People.SystemLocation = Orders.Department " _
         & WHERE (People.SystemLocation LIKE '*" & Me.SearchTxt1 & "*') & (Orders.Item LIKE '*" & Me.SearchTxt2 & "*' " _
         & "ORDER by Orders.Department"

Me.List41.RowSource = sql2
Me.List41.Requery

理想情况下,我希望能够创建各种“搜索引擎”。

1 个答案:

答案 0 :(得分:1)

语法错误围绕着您的where子句。

首先,您在这里缺少双引号:

& WHERE (People.SystemLocation LIKE '*" & Me.SearchTxt1 & "*') & (Orders.Item LIKE '*" & Me.SearchTxt2 & "*' " _
 ^----- Double quote missing

但是主要的问题是您使用的是&串联运算符(&)来表示逻辑and语句:

"*') & (Orders.Item LIKE '*"
     ^----- This should be AND

相反,您应该使用and运算符,例如:

& "WHERE (People.SystemLocation LIKE '*" & Me.SearchTxt1 & "*') AND (Orders.Item LIKE '*" & Me.SearchTxt2 & "*' " _

但是,在这种情况下,不需要连接表单控制值(这为SQL注入提供了可能),因为您可以直接从列表框的行源中引用表单值。

这样,代码可以变成:

Me.List41.RowSource = _
    "SELECT Orders.Item, Orders.Price, Orders.Department " & _
    "FROM People INNER JOIN Orders ON People.SystemLocation = Orders.Department " & _
    "WHERE " & _
    "    People.SystemLocation LIKE '*' & Forms![YourForm]!SearchTxt1 & '*' AND " & _
    "    Orders.Item LIKE '*' & Forms![YourForm]!SearchTxt2 & '*' " & _
    "ORDER by Orders.Department"
Me.List41.Requery

在这里,将[YourForm]更改为您的表单名称。