2014-03-04 192 views
1

我得到一個Access運行時錯誤:訪問運行時錯誤「3061」:參數太少。預計1

'3061': Too few parameters. Expected 1

試圖運行從分報告形式的一些VBA代碼時。

我試着在SQL查詢中使用變量(CurAssetID)以及直接鏈接(Forms!Details!ID),但都導致相同的錯誤。我只是爲了驗證它正在拾取正確的值而放入MsgBox。

如果我更換一個值(HAVING (((Assignments.AssetID)=1));")的SQL查詢的最後部分,它工作正常。這裏發生了什麼,我該如何解決它?

Private Sub LineSelect_Click() 
CurAssetID = Forms!Details!ID 
Status = MsgBox(CurAssetID, vbOKOnly) 
Dim LastAssignment As DAO.Recordset 
LastAssignmentSQL = "SELECT Assignments.AssetID, Last(Assignments.LocationID) AS LastLocationID FROM Assignments GROUP BY Assignments.AssetID HAVING (((Assignments.AssetID)=CurAssetID));" 
Set LastAssignment = CurrentDb.OpenRecordset(LastAssignmentSQL, dbOpenDynaset, dbSeeChanges) 
+0

您的SQL無法看到您的VBA參數。 –

回答

0

可以創建與在其內部串聯參數值的字符串變量:

curAssetID = Forms!Details!ID 
status = MsgBox(CurAssetID, vbOKOnly) 
Dim lastAssignment As DAO.Recordset 
lastAssignmentSQL = "SELECT Assignments.AssetID, " & _ 
        "Last(Assignments.LocationID) AS LastLocationID " & _ 
        "FROM Assignments " & _ 
        "GROUP BY Assignments.AssetID " & _ 
        "HAVING (((Assignments.AssetID)=" & CurAssetID & "));" 
Set lastAssignment = CurrentDb.OpenRecordset(lastAssignmentSQL, dbOpenDynaset, dbSeeChanges) 
' ... 

作爲附加的預防措施,如果Forms!Details!ID被suposed是一個號碼(IntegerLong),I建議您明確聲明變量CurAssetID

Dim curAssetID as Integer ' Or Long 
curAssetID = Forms!Details!ID 
Dim lastAssignment As DAO.Recordset 
lastAssignmentSQL = "SELECT Assignments.AssetID, " & _ 
        "Last(Assignments.LocationID) AS LastLocationID " & _ 
        "FROM Assignments " & _ 
        "GROUP BY Assignments.AssetID " & _ 
        "HAVING (((Assignments.AssetID)=" & CurAssetID & "));" 
Set lastAssignment = CurrentDb.OpenRecordset(lastAssignmentSQL, dbOpenDynaset, dbSeeChanges) 
' ... 

如果該值爲'字符串',則應將該值用引號括在查詢中:

Dim curAssetID as String 
' ... 
lastAssignmentSQL = "SELECT Assignments.AssetID, " & _ 
        "Last(Assignments.LocationID) AS LastLocationID " & _ 
        "FROM Assignments " & _ 
        "GROUP BY Assignments.AssetID " & _ 
        "HAVING (((Assignments.AssetID)= '" & CurAssetID & "'));" 
' ... 
+0

這工作得很好,謝謝你的幫助! – user3377449