Возвратный счет клиента от SQL в VBA - PullRequest
1 голос
/ 28 апреля 2020

У меня есть следующий код, который при выполнении вернет количество клиентов, которые поступили в течение данного месяца в параметре. Тем не менее, во время выполнения кода я получаю ошибку времени выполнения 3021 (нет текущей записи). Где именно я иду не так?

Public Function CountOfcustomer(RequiredDate As Date)
    Dim strSQL As String
    Dim rst As DAO.Recordset

       strSQL = "SELECT Format([dateArrived]," & Chr(34) & "mm\yyyy" & Chr(34) & ") AS reportDate, Count(CalibrationLog.customer) AS CountOfcustomer " & _
            "From CalibrationLog " & _
            "GROUP BY Format([dateArrived]," & Chr(34) & "mm\yyyy" & Chr(34) & ") " & _
            "HAVING (((Format([dateArrived]," & Chr(34) & "mm\yyyy" & Chr(34) & "))= Format(" & RequiredDate & "," & Chr(34) & "mm\yyyy" & Chr(34) & ") ));"


    Set rst = CurrentDb.OpenRecordset(strSQL)

    CountOfcustomer = rst!CountOfcustomer

    rst.Close
    Set rst = Nothing
End Function

Показано в окне "Немедленно";

SELECT Format([dateArrived],"mm\yyyy") AS reportDate, Count(CalibrationLog.customer) AS CountOfcustomer 
From CalibrationLog 
GROUP BY Format([dateArrived],"mm\yyyy") 
HAVING (((Format([dateArrived],"mm\yyyy"))= Format(12/02/2020,"mm\yyyy") ));

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Вы хотите получить счет за месяц вашего аргумента даты, RequiredDate.

Мне кажется, было бы проще избежать всего этого Format(). Вам даже не нужно делать это как GROUP BY запрос. Просто попросите Count с предложением WHERE, которое выбирает только те строки, которые попадают в целевой диапазон дат ... и сравнивайте даты как даты вместо дат, преобразованных в строки.

Dim strSQL As String
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

strSQL = "PARAMETERS RequiredDate Date; " & _
    "SELECT Count(*) AS CountOfcustomer FROM CalibrationLog " & _
    "WHERE [dateArrived] >= DateSerial(Year(RequiredDate), Month(RequiredDate), 1) " & _
    "AND [dateArrived] < DateSerial(Year(RequiredDate), Month(RequiredDate) + 1, 1);"

Set qdf = CurrentDb.CreateQueryDef(vbNullString, strSQL)
qdf.Parameters("RequiredDate").Value = RequiredDate
Set rst = qdf.OpenRecordset(strSQL)
If Not (rst.BOF And rst.EOF) Then
    CountOfcustomer = rst!CountOfcustomer
End If

С При таком подходе Access может использовать индекс в этом поле dateArrived, чтобы быстро определить, какие записи удовлетворяют ограничению WHERE запроса.

2 голосов
/ 28 апреля 2020

Вы должны подтвердить в функции, что вы, вероятно, не получите никакой записи в наборе записей.

CountOfcustomer = rst!CountOfcustomer

Если в указанную RequiredDate клиент не поступил, вы не можете сделать rst!CountOfcustomer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...