从控件访问查询参数

时间:2013-12-23 16:28:48

标签: vba ms-access access-vba

从水中寻找方向/建议的鱼不一定是代码(虽然这会有所帮助)。我是一个设计机器的ME,我正在尝试自动化现有的用于工程零件编号的2010 Access数据库。我希望用户选择项目编号,并在零件编号字段中自动显示下一个可用的零件编号。

我尝试使用各种来源的ADO和DAO示例将基于表单控件值的参数传递给select查询失败。我的最新尝试如下:

Private Sub ctlProject_AfterUpdate()

Dim dblProject As Double

dblProject = Me.ctlProject.Value

MsgBox "The curret project number is " & dblProject, vbOKOnly, "Project Number"


Const cstrQueryName As String = "qryDetails"
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

Set dbs = CurrentDb()
Set qdf = dbs.QueryDefs(cstrQueryName)
qdf.Parameters("Project") = dblProject

' Open recordset on the query
Set rst = qdf.OpenRecordset()

rst.MoveLast

Debug.Print ("Project ID: " & rst!Project)

rst.Close
qdf.Close
dbs.Close

End Sub

代码产生一个“运行时错误'3265'。此集合中找不到的项目”源于这行代码:

qdf.Parameters("Project") = dblProject

原始资料来源here

使用ADO Command对象时遇到了类似的故障。我非常感谢任何有关参考/资源的帮助或建议。我一直在使用WROX的“Access 2003 vba程序员手册”和“Access 2010:缺少的手册”作为硬拷贝参考。

以下是qryDetails的SQL视图中的代码:

SELECT tblDetails.Project, tblDetails.Number, tblDetails.Title, tblDetails.Initials,
tblDetails.IssuedOn
FROM tblDetails
WHERE (((tblDetails.Project)=[Project]));

1 个答案:

答案 0 :(得分:1)

我对 Project 作为参数名称持怀疑态度,因为有一个具有相同名称的字段。这也是一个保留词,但我不确定这是否是一个额外的挑战。

修改 qryDetails 以为参数使用其他名称。

SELECT tblDetails.Project, tblDetails.Number, tblDetails.Title, tblDetails.Initials,
tblDetails.IssuedOn
FROM tblDetails
WHERE (((tblDetails.Project)=[pProject]));

不要忘记修改VBA以使用新名称......

qdf.Parameters("pProject") = dblProject

如果在这些更改后仍然遇到问题,请参阅Access对您的查询参数的看法。

Const cstrQueryName As String = "qryDetails"
Dim dbs As DAO.Database
Dim prm As DAO.Parameter
Dim qdf As DAO.QueryDef

Set dbs = CurrentDb()
Set qdf = dbs.QueryDefs(cstrQueryName)
MsgBox "Parameters.Count: " & qdf.Parameters.Count
For Each prm In qdf.Parameters
    MsgBox "Parameter Name: " & prm.Name
Next