Access 2003 VBA:查询在直接运行时有效,但从代码运行时运行时错误3061?

问题描述:

因此,我有一个相对简单的查询,它具有两个参数,其中一个参数从表单中拉出一个长整型并从一个表中选择只有一个字段具有该值的记录。 (这是一个设计项目表,用户正在选择一个设计师,其项目应该列出)。Access 2003 VBA:查询在直接运行时有效,但从代码运行时运行时错误3061?

如果我打开表单,然后手动打开查询,它的工作原理完美。如果我有第二种形式(用查询结果填充列表框)尝试设置记录集等于查询结果,它会失败,并显示“运行时错误'3061'。参数太少。

如果我将参数设置为静态整数,例如3,它工作正常(但显然是无用的)。为什么我的VBA代码无法从窗体上的文本字段中读取文本,当Access本身显然可以?

这里是我的查询:

SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID 
FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1 
WHERE ((([Project Request Log TABLE].Designer1)=[Forms]![frm_selectDesigner]![txtDesignerId]) AND (([Project Request Log TABLE].PercentComplete)<>1)) 
ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority; 

这里是VBA的给出错误的行:

Set rst_projects = dbs.OpenRecordset("qryDesignerProjectPrioritySet", dbOpenDynaset) 

感谢。

编辑:选择设计者的窗体打开第二个窗体,上面的代码试图打开一个记录集。原始的frm_selectDesigner没有关闭,当点击OK时隐藏,但保持打开状态。

编辑2:如果我有行

DoCmd.OpenQuery "qryDesignerProjectPrioritySet" 

查询打开,并有正确的结果。如果下一行尝试将该查询的结果分配为上述的记录集,则会出现3601错误?在编写OpenRecordset命令时必然会出现某种错误,对吧?

+1

只是为了澄清:当您尝试从其他窗体运行查询时,'frm_selectDesigner'窗体*被打开,对吧? – 2013-04-26 15:37:09

+0

*为什么我的VBA代码无法从窗体上的文本字段读取文本,当Access本身明显可以?*可能因为VBA在Access以外的环境中使用。 – 2013-04-26 15:50:15

+0

[Project Request Log TABLE] .PercentComplete 1 – CarlF 2013-04-26 16:34:13

OpenRecordset()应该是一个简单的基本操作;我不明白为什么当DoCmd.OpenQuery "qryDesignerProjectPrioritySet"工作失败。看看最小的程序发生了什么,它只能尝试OpenRecordset()

插入以下代码作为新的标准模块,并从VB编辑器的主菜单中运行Debug-> Compile。假设它编译没有错误,请在表单视图中打开frm_selectDesigner表单测试子表单。如果不编译,您可能需要添加DAO或ACEDAO的参考。

Option Compare Database 
Option Explicit 

Public Sub test_OpenRecordset() 
Dim dbs As DAO.Database 
Dim rst_projects As DAO.Recordset 

Set dbs = CurrentDb 
Set rst_projects = dbs.OpenRecordset("qryDesignerProjectPrioritySet", dbOpenDynaset) 
rst_projects.Close 
Set rst_projects = Nothing 
Set dbs = Nothing 
End Sub 

如果它编译无误的运行,比较该代码与发生故障的代码,看看你是否能发现如对象变量声明和分配方式的差异。

如果这种努力没有导致解决方案,或者test_OpenRecordset也引发同样的错误,我认为建议的所有内容是HOW TO decompile and recompile

可以设置参数在这样的代码(你必须暗淡/设置查询,太):

... 
Dim prm As DAO.Parameter 
Set qdef = db.QueryDefs("qryName") 

'Evaluate and set the query's parameters. 
For Each prm In qdef.Parameters 
    prm.Value = Eval(prm.Name) 
Next prm 

Set rs = qdef.OpenRecordset 
... 
+0

执行在“set qdef ...”行停止,并显示错误“运行时错误”424:Object required“。该代码包含查询的复制粘贴名称,如上所述在DoCmd.OpenQuery中正确运行。谢谢。 – CarlF 2013-04-26 17:58:39

+0

好吧,我摆弄并获得上述代码工作。 Debug.Print报告参数Forms!frm_selectDesigner!txtDesignerID是3.那么为什么Access会抱怨缺少参数?我甚至从查询中完全删除了其他参数,以确保它不是某个错误的。 VBA本身说参数已设置,然后抱怨它已丢失! – CarlF 2013-04-26 18:39:25

恐怕不是一个非常令人满意的答案。我没有使用FUTZ,而是使用我的查询中的SQL代码,并用一个变量(基于表单行设置)代替VBA尝试读取文本字段。我最后的代码如下所示:

designerToPrioritize = Me.designerList.Column(2, Me.designerList.ListIndex + 1) 

    queryText = "SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID" 
    queryText = queryText & vbCrLf & "FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1" 
    queryText = queryText & vbCrLf & "WHERE ((([Project Request Log TABLE].Designer1)=" & **designerToPrioritize** & " AND (([Project Request Log TABLE].PercentComplete)<1)))" 
    queryText = queryText & vbCrLf & "ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority;" 
'That should recreate my original query. Let's see how it works. 
     Set rst_projects = dbs.OpenRecordset(queryText, dbOpenDynaset) 

这工作得很好,所以我不打算把更多的精力投入到找出其他的方式来做到这一点。如果没有人在接下来的几天内发布出色的答案,我会回答这个问题。感谢大家帮助解决问题。

我设法通过将查询条件置入代码中的bybass运行时错误“3061”。 SQL的查询1是这样的:

SELECT * FROM tbl1 WHERE field1=[Forms]![form1]![txt1] 

代码:

Set dbs = CurrentDb 
Set rst = dbs.OpenRecordset("Query1") 

触发运行时错误 '3061'。我写QUERY2为:

SELECT * FROM tbl1 

,改变代码为:

dim txt1 as string 
txt1=[Forms]![form1]![txt1]" 
Set dbs = CurrentDb 
Set rst = dbs.OpenRecordset("SELECT * FROM Query2 WHERE field1=" & txt1) 

它工作得很好。