Передача параметров в VBA для доступа к запросу

#ms-access

#ms-access

Вопрос:

Этот вопрос задавался ранее. Я скорректировал свой код (ниже) на основе того, что я понял из исследований по этой теме. Однако мой код разбивается на строки, выделенные жирным шрифтом ниже.

У меня есть форма ( PBCIncSum ), в которой пользователь может ввести критерии даты начала и окончания запроса RstName . Эта функция предназначена для вычисления значений 95-го процентиля для данных, находящихся в запросе RstName . Когда я запускаю код, я получаю ошибку времени выполнения ‘3061: слишком мало параметров. Ожидаемый 2. Что я делаю не так? Провел три дня, глядя на этот код без какого-либо решения.

 Public Function PercentileRst(RstName As String, fldName As String, PercentileValue As Double) As Double
 'This function will calculate the percentile of a recordset.
 'The field must be a number value and the percentile has to
 'be between 0 and 1.
 If PercentileValue < 0 Or PercentileValue > 1 Then
    MsgBox "Percentile must be between 0 and 1", vbOKOnly
 End If
 Dim PercentileTemp As Double
 Dim dbs As DAO.Database
 Set dbs = CurrentDb
 Dim xVal As Double
 Dim iRec As Long
 Dim i As Long
 Dim RstOrig As DAO.Recordset
 Dim qdf As DAO.QueryDef
 Dim prm As DAO.Parameter

 Set qdf = dbs.QueryDefs(RstName)
 qdf.Parameters(0) = Forms!PBCIncSum!StDate
 qdf.Parameters(1) = Forms!PBCIncSum!EndDate

 For Each prm In qdf.Parameters
      prm = Eval(prm.Name)
 Next prm

 **Set RstOrig = CurrentDb.OpenRecordset(RstName, dbOpenDynaset)**
 RstOrig.Sort = fldName
 Dim RstSorted As DAO.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
 Set qdf = Nothing
 PercentileRst = PercentileTemp
  

Завершить функцию

Комментарии:

1. У меня есть следующий вопрос. Как мне вычислить процентиль только для ненулевых или ненулевых значений?

Ответ №1:

Что я делаю не так?

Вы пытаетесь использовать CurrentDb.OpenRecordset для выполнения запроса. Вы создали объект QueryDef qdf и определили его параметры, поэтому вам нужно использовать OpenRecordset метод этого объекта QueryDef:

 Set rstOrig = qdf.OpenRecordset
  

Комментарии:

1. Горд, спасибо за твой быстрый ответ. Когда я делаю то, что вы предложили, это выдает мне следующую ошибку в той же строке: ошибка времени выполнения ‘3001’: недопустимый аргумент. Сунил.

2. Я попробовал следующий код, и он сработал!!! Спасибо за вашу помощь !!! 🙂

3. Установите rstOrig = qdf.OpenRecordset()