在IN()条件下使用tempvar的MS Access 2010查询

时间:2014-12-13 02:12:34

标签: ms-access macros ms-access-2010

我正在尝试使用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。

1 个答案:

答案 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表达式。