提问人:Marek Baranko 提问时间:10/28/2023 最后编辑:Marek Baranko 更新时间:10/28/2023 访问量:59
SQL Access select Query - 使用公共返回函数的多字符串值筛选器不返回任何结果(适用于一个值)
SQL Access select Query - Multiple string value filter using public return function returns no results (works for one value)
问:
我正在尝试创建一个SQL查询,该查询使用Public函数返回的字符串变量从表中过滤结果。我的目标是读取哪些复选框处于活动状态,并根据它们过滤国家/地区。当我对一个复选框执行此操作时,它可以工作,但是当我尝试将其更改为支持多个复选框时,查询不返回任何内容。
下面是访问 GetValue 函数的简化 SQL 查询:
SELECT *
FROM [transactionsTable]
WHERE [transactionsTable].Country In (GetValue());
这是countryFilterModule:
Public Function SetValue(str As String)
strcountries = str
End Function`
Public Function GetValue()
GetValue = strcountries
Debug.Print (GetValue)
End Function`
在 VBA Button_click中使用 SetValue,我将 strcountries 变量设置为: strCountries = “'Spain', 'Italy'”
sql 查询不返回任何结果。当我在变量(strCountries = “Spain”)中使用单个国家/地区名称时,查询工作正常。 如何设置变量的格式以按多个值进行筛选?据我所知,SQL语句中的格式应该是:
WHERE \[transactionsTable\].Country IN ("Spain", "Italy")
但是我无法弄清楚如何使用字符串变量复制它。
我尝试将变量格式更改为其他替代方案,但没有任何效果。strCountries = ('Spain', 'Italy')
我还尝试了不同的方法,例如直接在 VBA 中编辑 SQL 语句,但它只是第一次有效,然后当我在表单中检查不同的国家/地区时,它不再更新。即使我重新打开数据库。
答:
0赞
vbakim
10/28/2023
#1
下面的代码示例演示了如何实现此目的。我在 Form1 上放置了两个复选框,并将它们对应的标签命名为“西班牙”和“意大利”。然后,我使用此信息更新了已保存查询“query2”中的 SQL,以反映所选国家/地区。我会通过按钮调用此 Sub。
Sub RunQueryFromCheckBox()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim ctl As Control
Dim lbl As Label
Dim countryList As String
' Initialize
Set db = CurrentDb()
Set qdf = db.QueryDefs("query2")
' Loop through controls on Form1 to find checked checkboxes
For Each ctl In Forms("Form1").Controls
If TypeName(ctl) = "CheckBox" Then
If ctl.Value = True Then
' Get associated label
Set lbl = ctl.Controls(0)
' Add label's caption to countryList
If countryList <> "" Then countryList = countryList & ","
countryList = countryList & "'" & lbl.Caption & "'"
End If
End If
Next ctl
' Update and run query
If countryList <> "" Then
qdf.SQL = "SELECT * FROM Table1 WHERE [Country] IN (" & countryList & ")"
DoCmd.Close acQuery, "query2", acSaveNo
DoCmd.OpenQuery "query2"
End If
' Clean up
Set qdf = Nothing
Set db = Nothing
End Sub
评论
0赞
Marek Baranko
10/28/2023
这就是我在问题中写的,作为我尝试过的一个例子。不起作用
0赞
Gustav
10/28/2023
不,这是不一样的。
0赞
Marek Baranko
10/28/2023
在 VBA Button_click中使用 SetValue,我将 strcountries 变量设置为: strCountries = “'Spain', 'Italy'”
0赞
vbakim
10/28/2023
啊,我现在明白了。我之前没有意识到您已经尝试使用该字符串。现在我很清楚你的目标是什么了。代码已在上一个答案窗口中更新。
0赞
Marek Baranko
10/28/2023
谢谢你的建议。我会尝试你的代码,并让你知道它是否有效。几天前我也尝试过这种方法,但我无法弄清楚为什么查询只更新了一次。当我尝试更改复选框组合时,它不再更新。我可能错过了DoCmd.Close acQuery行
评论