OpenRecordSet太少参数4 / QueryDefs的问题

时间:2013-08-27 22:27:57

标签: vb.net vba access-vba ms-access-2010

问题:我有一个表单(frm_input),用户输入一个人口范围。一旦用户输入范围的最小值和最大值并单击“确定”按钮,则将值输入到查询(qryMasterQuery)中,并使用引用表单中字段的“Between”语句基于这些输入运行查询

“确定”按钮还会打开另一个表单“frm_output”。此表单运行一个函数“百分位数”,用于计算查询中数据的百分位数。该函数传递三个参数 - 查询名称,查询中用于计算百分位数的字段和要计算的百分位数。

当我省略查询中的“between”语句时,函数和表单运行正常。当我试图将它们组合在一起时,我在OpenRecordset()函数中收到了“参数太少,4”。根据我的阅读,我需要显式声明DAO.Querydef对象 并通过Querydef对象参数集合提供参数。

问题1:当我包含声明时:

Set qdf = db.QueryDefs("qryMasterQuery")

我收到运行时424错误消息。

更大的问题2: 我仍然不清楚通过qdf.Paramaters提供参数的sytax。我不想在查询中声明所有内容,只需要传递给函数的内容,即'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

对于任何帮助我都是永远的,因为我刚刚把我撞到了墙上。

1 个答案:

答案 0 :(得分:0)

首先是几个风格提示。将所有变量标注在函数顶部。您可以通过backticks like so包围或在每个单独的行前面放置4个空格,使代码文本看起来像代码。

Like so

您不需要创建新的排序Recordset,因为设置Sort属性会对其进行排序。

问题1:
不要忘记声明QueryDef变量。此外,您错过了Database变量 dbs 中的 s 。仔细检查 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.请注意,该示例很难遵循并使用不同的方法。