0

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

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

当我从查询中省略“之间”语句时,函数和表单运行良好。当我试图将它们结合在一起时,我在 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

我将永远感激任何帮助,因为我即将把我的头撞到墙上。

4

1 回答 1

0

首先是几个风格提示。在函数顶部标注所有变量。你可以让你的代码文本看起来像代码,方法是backticks like so在每个单独的行前面加上或放置 4 个空格。

Like so

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

问题 1:
不要忘记声明QueryDef变量。此外,您错过了变量dbs中的s。仔细检查qryMasterQuery是正确的名称。Database

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

有关详细信息,请参阅 MSDN。

问题 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()

提供参数的另一种方法是从查询中删除它们或使用已经提供的隐含参数创建一个新查询。

有关详细信息,请参阅参数 MSDN。请注意,该示例难以理解并且使用了不同的方法。

于 2013-08-27T23:32:40.163 回答