问题:我有一个表单(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
对于任何帮助我都是永远的,因为我刚刚把我撞到了墙上。
答案 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")
问题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.请注意,该示例很难遵循并使用不同的方法。