我有一个数组ListBoxContents(),它将包含像' 15',' 16',' 25' ...最多10个项目。我试图在 Bnumber 列中检索数据,其中长度> 6的数据以及(' 15',' 16',& #39; 25' ...)即列表框中指定的那些项目。并尝试在sql语句的cluase中查询这些列表框项目
表格列Bnumber包含
Bnumber
152
156
1523
16417
AA454
CC654
18A16
1826
18A16
25A76
54A16
54235A68
我的VBA代码
Private Sub arraywhere()
Dim qry As String
Dim Size As Integer
Size = Form_Input_From.lstdigits.ListCount - 1
ReDim ListBoxContents(0 To Size) As String
ReDim LContents(0 To 30) As String
Dim m As Integer
For m = 0 To Size
ListBoxContents(m) = Form_Input_From.lstdigits.ItemData(m)
Next m
For m = 0 To Size
qry = "SELECT col1,col2,Bnumber " & _
"FROM table WHERE (Len([table].[Bnumber]))>6) AND (Left
([table].[Bnumber],2))=(" & ListBoxContents(m) & ");"
Next m
Debug.Print qry
Application.CurrentDb.QueryDefs("[arrayqry]").sql = qry
DoCmd.OpenQuery "[arrayqry]"
End Sub
但我的WHERE子句只读取最后一个数组项。我如何在where子句中指定数组?
答案 0 :(得分:5)
尝试类似
的内容" ... ([table].[Bnumber],2)) in ('" & Join(ListBoxContents,"','") & "');"
答案 1 :(得分:0)
您正在将qry
设置为for循环的每次迭代的新语句。相反,您需要根据列表框内容(见("x", "y", "z")
)连接字符串,并将=
替换为in
。
完成设置一次后,它将类似于:
qry = "SELECT col1,col2,Bnumber " & _
"FROM table WHERE (Len([table].[Bnumber]))>6) AND (Left
([table].[Bnumber],2)) in (" & commaSeperatedContents & ");"
其中commaSeperatedContents
是一个类似("x", "y", "z")
的字符串,但当然有您的值。
答案 2 :(得分:0)
试试这个:
Dim inPart As String
For m = 0 To Size
inPart = inPart & "'" & ListBoxContents(m) & "',"
Next m
inPart = Left(inPart, Len(inPart) - 1)
qry = "SELECT col1,col2,Bnumber " & _
"FROM [table] WHERE Len([table].[Bnumber])>6 AND " & _
"Left([table].[Bnumber],2) In (" & inPart & ");"
Debug.Print qry
CurrentDb.QueryDefs("[arrayqry]").SQL = qry
DoCmd.OpenQuery "arrayqry"
答案 3 :(得分:0)
数组中的项目列表实际上似乎来自Form_Import_From_PMT.lstdigits
控件。此控件是否绑定到数据源?如果是这样,您只需使用join子句将table
加入该数据源,该子句指定只选择以Bnumber
值开头的行,这些值以连接表中的数字开头:
select col1, col2, Bnumber
from table as t
inner join tblDigits as d
on left(t.Bnumber, 2) = d.Digits
where len(t.Bnumber) > 6
如果控件不绑定到数据源,则立即绑定它(创建一个新表tblDigits
来保存数字,如上所示),你将成为能够使用上述查询。
简而言之,数据绑定是指在Access中的where
子句中使用数组的方式。