我正在尝试使用IN()
条件内的临时变量来过滤查询。临时变量包含文本值列表。我在Access 2010中使用宏构建器工具。
假设我有一个产生的查询qryMain
:
Field1 Field2
1 A
4 B
2 C
3 D
没有WHERE
子句。使用条款
WHERE [tblMain].[Field2] IN([TempVars]![tmpField2])
过滤查询,所需的结果是
Field1 Field2
1 A
4 B
将tmpField2
设置为"A,B"
时。我使用SetTempVar使用表单tmpField2
中的点击事件设置frmMain
,并重新查询基于sfrmMain
的子表单/子报表对象qryMain
。这是通过MS宏构建器完成的,而不是VBA。
不幸的是,重新查询sfrmMain
会产生一个空表而不是预期的结果。请注意,如果我将tmpField2
设置为"A"
,则requery宏将按预期工作。
我尝试了基于Access double quote requirements初始化tmpField2
的多种变体,但仍然没有成功。我的问题类似于尚未回答的问题question,但我的问题涉及在IN()
子句中的WHERE
语句中传递temp变量,而不使用VBA。
答案 0 :(得分:2)
问题实际上不是TempVars
造成的。如果您的值列表来自表单的文本框而不是TempVars
,则结果将相同。
对于您尝试执行的操作,IN ()
需要一个硬编码的值列表:
SELECT m.Field1, m.Field2
FROM tblMain AS m
WHERE m.Field2 IN ('A','B');
但是,您希望在运行查询时动态提供列表,而不是硬编码的值列表:
WHERE m.Field2 IN (something_dynamic);
不幸的是,Access不会合作。无论您为 something_dynamic 提供什么,Access都会将其解释为只有一个值... 不是值列表。并且用什么方法来提供 something_dynamic ... TempVar
,文本框,正式查询参数,返回包含字符串的自定义VBA函数并不重要值列表...该列表将仅作为单个值进行评估。
如果您愿意使用VBA,则可以在运行时编写查询以在执行之前包含硬编码值列表。既然你想避免VBA,你可以试试这样的......
WHERE InStr(1, [TempVars]![tmpField2], "'" & m.Field2 & "'") > 0
请注意,该方法需要引用 tmpField2 中的文字值:' A'' B'
还要注意使用大表时,方法可能会非常慢。 Access需要为表中的每一行评估InStr
表达式。