【问题标题】:Using parameter from form in IN statement在 IN 语句中使用表单中的参数
【发布时间】:2015-04-21 17:44:19
【问题描述】:

我有一个包含多个输入的表单,然后将其传递给查询。这非常简单,除了我希望在我的 sql 中的 IN 语句中使用我的参数之一,如下所示:

Select sum(id) as numobs from table where year=[form]![form1]![year] and (group in([form]![form1]![group]));

当 [form]![form1]![group]="3,4" 它查询 "group in(34)" 并且如果 [form]![form1]![group]="3, 4" 然后我收到一条错误消息,提示“此表达式键入错误,或者它太复杂而无法评估...”

我希望能够在表单的字段中输入多个用逗号分隔的数字,然后让查询在 IN 语句中使用结果。这看起来可行吗?

我知道使用 VBA 我可以做 if-then 语句来查看组数的每个可能组合(有超过 40 个组,因此组合起来有超过 4 万亿种方法可以组合 40 多个组,因为 42 的总和选择 k从 0 到 42 超过 4 万亿)所以使用 IN 语句似乎是一个更好的选择。

关于如何让 IN 语句与表单中的参数一起工作的任何想法?

谢谢

【问题讨论】:

  • 你的意思是group in (3, 4)?我不知道 Access 是否支持多值参数,但这可能是您应该关注的。即使您最终使用 VBA,也不需要 4 万亿次测试。
  • 链接说 in(3, 4) 是正确的不是 in (3, 4)
  • 空间不大,大部分SQL都是用它写的。不过我担心逗号:你写了34,这可能会变成一个完全不同的问题。
  • 这里是一些建议的方法。你也可以尝试另一种方法,用你的“组”的值填充另一个表并使用IN (select group from <mygroups>)support.microsoft.com/en-us/kb/210530

标签: sql ms-access vba ms-access-2010


【解决方案1】:

我想不出使用IN 的方法。

我的解决方案:在数据库的 VBA 模块中,编写一个子程序以根据表单控件中的值构建查询。让我们使用Split 方法创建一个数组,我们可以遍历它来构建一个查询。

Sub MakeTheQuery()
Dim strSQL As String, db As DAO.Database
Set db = CurrentDb()

strSQL = "SELECT sum(id) AS numobs _
FROM table WHERE ("

Value = Forms!YourForm!YourControl.Caption
'The property may vary with controls ^

'Create an array from the control values
anArray = Split(Value, ",")

'Add to the query for each value
For i = LBound(anArray) To (UBound(anArray) - 1)
strSQL = strSQL & " ErrorKey.ID = " & anArray(i) & " OR"
Next i

'Wrap it all up
strSQL = strSQL & " ErrorKey.ID = " & anArray(UBound(anArray)) & ")"

'Assign SQL to query
db.QueryDefs!YourQuery.SQL = strSQL

End Sub

请记住,这假设表单控件中的字符串将被格式化为无空格,但您可以通过使用anArray = Split(Value, ", ") 轻松更改它(注意逗号后添加的空格)。

要将 VBA 子分配给表单上的按钮或其他控件,方法是转到 Layout View,单击控件,转到属性表上的 Event 选项卡,点击 ... 单击时旁边的按钮。点击Code Builder。将Call MakeTheQuery 放入它为您构建的子目录中。如果您也想运行查询,请输入DoCmd.OpenQuery "YourQuery"

你也可以用这个方法build a more complex, dynamic parameter query

【讨论】:

    【解决方案2】:

    这可以通过 VBA 模块中的 sub 非常简单地完成:

    Sub MakeTheQuery()
        Dim db As DAO.Database
        Dim strSQL As String
        Dim strElements As String
    
        Set db = CurrentDb()
    
        strSQL = "SELECT Sum(id) AS numobs " & _
            "FROM ErrorKey WHERE ErrorKey.ID In ({0});"
    
        ' Example: "3,5"
        strElements = Forms!YourForm!YourControl.Caption
    
        ' Assign SQL to query
        db.QueryDefs!YourQuery.SQL = Replace(strSQL, "{0}", strElements)
    
    End Sub
    

    【讨论】:

    • 我将如何实现这个?我将此代码输入到表单的模块中,但是如何调用/使用它?谢谢
    • 嗨@Carl 我已经用一些实现细节编辑了这个问题。你只需要运行这个子来改变查询(Call MakeTheQuery)然后run the query。确保你也替换了所有事物的名称。
    • @Carl 我试图编辑上面的答案,因为它更精简,但我的编辑被拒绝了。我在答案中添加了实施信息。
    • @st78:请阅读问题并再次回答。该值是从用户无法控制的 Caption 属性中提取的。
    【解决方案3】:

    您可以考虑使用 Instr() 函数而不是 In。假设您是按程序生成编号列表,而不是强制最终用户键入逗号分隔的列表,您可以更改格式。我们通常使用管道分隔符,例如,输入可能如下所示: [form]![form1]![group]="|3|4|" 这作为单个字符串参数传递给查询,并在 Instr() 函数中进行测试,如下所示: Instr([form]![form1]![group],"|" & group & "|")>0 ' Instr() returns a numeric value of the position in the first argument where the second argument is found. 管道确保我们不会得到误报(例如,当我们通过 34 时找到 3)。我们将它与多选列表框和自定义 VBA 函数一起使用,但只要您可以控制格式,它就完全可行。 Instr Function - support.office.com

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2011-04-03
      • 1970-01-01
      相关资源
      最近更新 更多