2012-05-28 100 views
1

我試圖在VBA函數中運行以下查詢。我一直得到「參數太少,預期1」。在Access VBA中運行參數查詢

strSQL = "Parameters [Report Date] DateTime;" & vbCrLf & _ 
        "SELECT SCF.code AS [Stock Code], " & vbCrLf & _ 
        "SCF.desc AS [Description], " & vbCrLf & _ 
        "SCF.grp AS [Product Group]," & vbCrLf & _ 
        "SCF.qCurr AS [Closing Stock], " & vbCrLf & _ 
        "SCF.abp AS [Avg Price], " & vbCrLf & _ 
        "Sum(([Closing Stock]*[Avg Price])) AS [STOCK VALUE], " & vbCrLf & _ 
        "MaxDate.tDate AS [Last Transaction Date], " & vbCrLf & _ 
        "Sum(IIf(([Last Transaction Date]>[Report Date]),([Closing Stock]*[Avg Price]),0)) AS [After Report Date], " & vbCrLf & _ 
        "DateDiff(""d"",[Last Transaction Date],[Report Date]) AS [Days since Last Transaction], " & vbCrLf & _ 
        "[Report Date]" & vbCrLf & _ 
      "INTO [FinReport] " & vbCrLf & _ 
      "FROM SCF RIGHT JOIN MaxDate ON MaxDate.parent = SCF.this " 
strSQL = strSQL & _ 
      "WHERE (SCF.qCurr <> 0) " & vbCrLf & _ 
      "GROUP BY SCF.code, " & vbCrLf & _ 
         "SCF.desc, " & vbCrLf & _ 
         "SCF.grp, " & vbCrLf & _ 
         "SCF.qCurr, " & vbCrLf & _ 
         "SCF.abp, " & vbCrLf & _ 
         "MaxDate.tDate" & vbCrLf & _ 
      "ORDER BY MaxDate.tDate;" 

Set qdf = db.CreateQueryDef("", strSQL) 
qdf.Parameters("[Report Date]").Value = Form_IO_Form.ReportDate_TB.Value 
qdf.Execute 

我已經驗證了所有領域(當然比[報告日期]等)存在和查詢本身作爲訪問查詢運行(彈出詢問[報告日期])。

幫助!

編輯1: 按此處要求將DB文件作爲ZIP文件。它是一個Access 2007.accdb文件
DB File

+0

我會注意到,你不應該在每行中都需要'&vbCrLf'。編譯器不關心新行。除非你真的需要打印查詢來查看。無論如何,vbNewLine無論如何都是首選。 – BIBD

+0

@codeslave:vbcrlf使查詢字符串對於我和任何未來的程序員來說更具可讀性和可理解性。我會修改我的代碼並使用vbnewline ... – 147

+1

@CodeSlave爲什麼你更喜歡'vbNewLine'而不是'vbCrLf'? – HansUp

回答

1

你的SQL語句將引發錯誤#3122從數據庫引擎:

You tried to execute a query that does not include the specified expression 'DateDiff("d",[Last Transaction Date],[Report Date])' as part of an aggregate function.

這錯誤將導致之前數據庫引擎甚至考慮任何參數的語句失敗。

當您使用VBA構建SQL語句時,最好從數據庫引擎將接受的一個開始。然後,您還應該遵循@ mwolfe02至Debug.Print strSQL的聲音建議...給自己一個機會來檢查您要求db引擎執行的完整語句。

編輯:檢查了您上傳的ACCDB文件後,我仍不明白爲什麼您的查詢不會觸發錯誤#3122。但是,查詢確實可以作爲保存的查詢工作,並且可以在從VBA代碼執行時起作用。你得到關於「參數太少」的抱怨的原因是你實際上並沒有執行你創建的臨時QueryDef。相反,你試圖執行這樣的SQL文本:

' Execute created Query ' 
CurrentDb.Execute strSQL, dbFailOnError 

如果你改變這種做法(如你在你的問題所示),它的工作原理沒有錯誤:

qdf.Execute 
+0

vbcrlf就是出於這個原因 - 我使用它來使查詢字符串mire可讀取以進行調試。請注意,我突出顯示的廣告,查詢運行得很好,當作爲普通訪問查詢運行時 – 147

+0

謝謝。這工作。我不知道爲什麼3122錯誤不會觸發,但以前的DBA已經編寫了查詢,並且它工作。 – 147

1

我猜你在你的字段名稱中有一個錯字。找到它的最簡單方法是在您的Set qdf...行之前立即發出Debug.Print strSQL行。

然後在Access UI中創建一個新查詢,切換到SQL視圖,從即時窗口粘貼SQL文本並執行查詢。訪問會提示您輸入Report Date(您所期待的)和您的某個字段的錯誤輸入名稱。

+0

請查看我對@HansUp的評論。無論如何,我會再次重新檢查拼寫錯誤... – 147

+1

如果您對日期(例如'#5/28/2012#')進行硬編碼,而不是對錶單文本框的引用(例如'Form_IO_Form.ReportDate_TB.Value ')你還會收到錯誤信息嗎? – mwolfe02

+0

是的。試過 - 同樣的錯誤。即使當我使用'Form_IO_From.ReportDate_TB.value = Date' 來獲取當前系統日期。 – 147