2013-08-27 53 views
0

希望有人能幫助。我已經閱讀,似乎無法找到解決方案。OpenRecordSet參數設置太少4 QueryDefs問題

問題:我有一個表單(frm_input),用戶輸入一個人口範圍。一旦用戶輸入範圍的最小和最大值,並單擊「確定」按鈕,將值輸入到查詢(qryMasterQuery)中,並使用引用表單中的字段的'Between'語句根據這些輸入運行查詢。

「確定」按鈕還打開另一個窗體'frm_output'。此表單運行一個函數「百分比」,用於計算查詢中數據的百分位數。該函數傳遞三個參數 - 查詢名稱,用於計算百分位數的百分點查詢字段以及計算的百分位數。

當我省略查詢中的「between」語句時,函數和窗體運行良好。當我試圖將它們結合在一起時,我的OpenRecordset()函數收到了'太少的參數,4'。從我讀過的內容中,我需要明確聲明DAO.Querydef對象 並通過Querydef對象參數集合提供參數。

問題1:當我包括以下語句:

Set qdf = db.QueryDefs("qryMasterQuery") 

我得到一個運行時424錯誤消息。

更大的問題2: 我仍然不清楚通過qdf.Paramaters提供參數的系列。我不想在查詢中聲明所有內容,只會傳遞給函數的內容,即'fldName'。

我的代碼如下:

Public Function PercentileRst(RstName As String, fldName As String, PercentileValue As Double) As Double 

    'This function will calculate the percentile of a recordset. 

    Dim PercentileTemp As Double 
    Dim dbs As DAO.database 
    Dim RstOrig As DAO.Recordset 
    Set dbs = CurrentDb 
    Dim xVal As Double 
    Dim iRec As Long 
    Dim i As Long 
    Set RstOrig = CurrentDb.OpenRecordset("qryMasterFee", dbOpenDynaset) 
    RstOrig.Sort = fldName 
    Dim RstSorted As Recordset 
    Set RstSorted = RstOrig.OpenRecordset() 

    RstSorted.MoveLast 
    RstSorted.MoveFirst 
    xVal = ((RstSorted.RecordCount - 1) * PercentileValue) + 1 
    'x now contains the record number we are looking for. 
    'Note x may not be  whole number 
    iRec = Int(xVal) 
    xVal = xVal - iRec 
    'i now contains first record to look at and 
    'x contains diff to next record 
    RstSorted.Move iRec - 1 
    PercentileTemp = RstSorted(fldName) 
    If xVal > 0 Then 
     RstSorted.MoveNext 
     PercentileTemp = ((RstSorted(fldName) - PercentileTemp) * xVal) + PercentileTemp 
    End If 
    RstSorted.Close 
    RstOrig.Close 
    Set RstSorted = Nothing 
    Set RstOrig = Nothing 
    Set dbs = Nothing 
    PercentileRst = PercentileTemp 
End Function 

我永遠感激您的幫助,因爲我只是做了我撞頭在牆上。

回答

0

首先是一對夫婦風格的提示。在函數頂部標註所有變量。你可以讓代碼文本看起來像代碼一樣圍繞着backticks like so或在每個單獨的行前放4個空格。

Like so 

你不應該需要進行新的分類Recordset,如設置Sort屬性將排序。

問題1:
不要忘記聲明QueryDef變量。此外,您錯過了Database變量dbs中的。仔細檢查qryMasterQuery是正確的名稱。

Dim qdf as QueryDef 
Set qdf = dbs.QueryDefs("qryMasterQuery") 

See MSDN for more info.

問題2:
您將需要提供的查詢工作參數。這解釋了「參數太少」的錯誤。該方法如下:

Dim qdf as QueryDef 
Set qdf = dbs.QueryDefs("qryMasterQuery") 
qdf.Parameters("Prmtr1") = "blah" 'You can also use qdf.Parameters!Prmtr1 = "blah" 
qdf.Parameters("Prmtr2") = 1234 

set rstOrig = qdf.OpenRecordSet() 

的替代方法提供參數從查詢除去它們或創建與已經提供的隱含的參數的新查詢。

See the Parameters MSDN for more info.請注意,該示例很難遵循並使用不同的方法。

+0

謝謝!通過並提供參數解決了問題。我需要做的唯一其他更改是顯式聲明參數(而不是從表單中引用它們)。 – jimmyv41

+0

如果查詢在該表單的模塊上作爲記錄集打開,則可以引用表單對象(如文本框)作爲參數。如果它回答你的問題,也請選擇我的答案。謝謝 :) – usncahill