我写了一些VBA:
For x = LBound(resProdID) To UBound(resProdID)
CurrentDb.QueryDefs("qry_findID_vba").SQL = "" & _
"SELECT tbl_products.ProdID " & _
"FROM tbl_products " & _
"WHERE (tbl_products.Size = " & resSize(x) & " " & _
"AND tbl_products.SupplID = '" & Forms.frm_suppliers.SupplID & "')"
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("qry_findID_vba")
MsgBox rst.RecordCount
If rst.RecordCount <> 0 Then
rst.MoveLast
rst.MoveFirst
newProdID(x) = rst.Fields(0).Value
MsgBox "This never fires"
End If
rst.Close
Set rst = Nothing
dbs.Close
Set dbs = Nothing
Next x
当我运行它时会发生什么,是弹出一个框说0。我点击确定,然后再重复一次。这是因为我的resProdID数组中有两个项目。
但是,如果我正常打开查询“qry_findID_vba”,它会显示一行,就像我预期的那样。
为什么VBA不返回此行?我做错了什么?
答案 0 :(得分:1)
此代码消息框是否正确计数?你可以用吗? (注意,我实际上没有运行它,所以请注意轻微的语法错误。)
For x = LBound(resProdID) To UBound(resProdID)
Dim sql as String
Dim rst As DAO.Recordset
sql = "Select tbl_products.ProdID FROM tbl_products " & _
"WHERE (tbl_products.Size = " & resSize(x) & " " & _
"AND tbl_products.SupplID = '" & Forms.frm_suppliers.SupplID & "')"
Set rst = dbs.OpenRecordset(sql)
if not rst.eof then
MsgBox rst.fields("ProdID")
else
Msgbox "None found!"
end if
rst.Close
Set rst = Nothing
Next x
此外,尝试将所有内容复制到新表单,并压缩和修复数据库......
答案 1 :(得分:1)
首先,你真的应该使用QueryDef参数。它们提供了许多好处:
您的情况正是参数化QueryDef的用途。
将Access中的qry_findID_vba
的查询文本更改为:
PARAMETERS [ProductSize] Text (255), [SupplID] Number;
SELECT ProdID
FROM tbl_products
WHERE [tbl_products].[Size] = [ProductSize] AND [tbl_products].[SupplID] = [SupplID];
根据表中的实际数据类型替换参数数据类型。
接下来,当您处于循环中时,不要一次又一次地重新定义固定变量。 <{1}}和dbs
根本不需要在循环内定义。
最后一点,rst
属性并不像您想象的那样工作。 Quote from the docs,强调我的:
使用
RecordCount
属性查找a中的记录数 已访问Recordset或TableDef对象。 RecordCount property不表示中包含的记录数 dynaset-,snapshot-或forward-only-type Recordset对象直到all 记录已被访问。 [...] 要强制访问最后一条记录,请使用Recordset对象上的RecordCount
方法。
您还可以检查MoveLast
属性,而不是调用MoveLast
。如果为假,则至少有一条记录可用。
对于像这样的一次性查询结果,我建议使用快照类型Recordset。您可以在QueryDef上调用.EOF
时定义要使用的which type you want。
现在:
OpenRecordset
请注意,我使用Dim qry_findID_vba As DAO.QueryDef
Set qry_findID_vba = CurrentDb().QueryDefs("qry_findID_vba")
qry_findID_vba.Parameters("SupplID") = Forms.frm_suppliers.SupplID
For x = LBound(resProdID) To UBound(resProdID)
qry_findID_vba.Parameters("ProductSize") = resSize(x)
With qry_findID_vba.OpenRecordset(dbOpenSnapshot)
If Not .EOF Then
newProdID(x) = .Fields("ProdID").Value
End If
End With
Next x
来保存辅助With
变量。