2013-04-26 80 views
2

因此,我有一個相對簡單的查詢,它具有兩個參數,其中一個參數從表單中拉出一個長整型並從一個表中選擇只有一個字段具有該值的記錄。 (這是一個設計項目表,用戶正在選擇一個設計師,其項目應該列出)。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

回答

1

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

0

可以設置參數在這樣的代碼(你必須暗淡/設置查詢,太):

... 
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

0

恐怕不是一個非常令人滿意的答案。我沒有使用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) 

這工作得很好,所以我不打算把更多的精力投入到找出其他的方式來做到這一點。如果沒有人在接下來的幾天內發佈出色的答案,我會回答這個問題。感謝大家幫助解決問題。

0

我設法通過將查詢條件置入代碼中的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) 

它工作得很好。