我有几个输入,然后被传递到查询的形式。 这是非常简单的,但我想在IN语句中使用我的SQL像我这样的参数之一:
Select sum(id) as numobs from table where year=[form]![form1]![year] and (group in([form]![form1]![group]));
当[表格]![Form1中]![组] = “3,4”,它querys “组中(34)”,如果[表格]![Form1中]![组] = “3,4”,则我得到一个错误说“这种表达的输入不正确,或者实在是太复杂,无法评估。”
我希望能够进入的形式在现场用逗号分隔的多个号码,然后有一个查询中使用结果的陈述。 这看起来是可行的?
我知道用VBA我能做的if-then语句来看看一组数字每个可能的组合(有超过40组,以便combinatorically有超过4万亿方式到40+基团结合,因为42的总和选择k从0到42超过4万亿美元),以便使用IN语句似乎是一个更好的选择。
关于如何获取报表的任何想法与形式的参数来工作?
谢谢
这可以用VBA模块中的子非常简单地完成:
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
我不能想出一个办法做到这一点的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"
。
你也可以用这种方法来建立一个更复杂的,动态的参数查询 。
您可以考虑INSTR()函数,而不是在。 假设要生成编号列表程序上,而不是强迫最终用户键入一个逗号分隔的列表,可以改变的格式。 我们通常使用管隔板,因此,例如,输入可以是这样的: [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.
该管道确保我们没有得到误报(例如,发现3当我们通过34)。 我们用这个多选列表框和一个自定义的VBA函数,但它是完全可行的,你必须在格式控制的任何时间。 InStr函数- support.office.com