【问题标题】:MS Access 2010 query using tempvar inside IN() conditionMS Access 2010 查询在 IN() 条件中使用 tempvar
【发布时间】:2014-12-14 01:06:44
【问题描述】:

我正在尝试使用 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 使用表单frmMain 中的单击事件设置tmpField2,并重新查询基于qryMain 的子表单/子报表对象sfrmMain。这是通过 MS 宏生成器完成的,而不是 VBA。

不幸的是,重新查询sfrmMain 会产生一个空表,而不是预期的结果。请注意,如果我将tmpField2 设置为"A",则重新查询宏将按预期工作。

我尝试了多种初始化tmpField2 的变体,基于Access 的double quote requirements,但仍然没有成功。我的问题类似于这个尚未回答的question,但我的问题涉及在WHERE 子句内的IN() 语句中传递临时变量,而不使用VBA。

【问题讨论】:

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


    【解决方案1】:

    问题实际上并不是由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 表达式。

    【讨论】:

    • 感谢您确认这不是语法问题,而是我使用了错误的方法。我改变了我的方法并通过简单地将多个临时变量(即不是列表形式)传递给IN() 部分来解决我的问题。我开始使用我的临时变量来包含一个列表的(不成功的)路径,因为有一次我通过宏生成器指定了WHERE() 内容。但是,该环境将用户限制为 255 个字符,并且我有很多临时变量。因此,将临时变量聚合到连接列表中的想法是 Access 不喜欢的。
    • 马克,如果你知道你只有两个值,那么你的方法就可以了。 @汉斯。我同意,尽管我认为我会建议使用以下可能会更快一些的方法,并且您的方法可能会将 ",dog" 与 ",doggie," WHERE "," & m.Field2 & ",匹配>" LIKE [TempVars]![tmpField2] TempVars 假定为逗号分隔
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多