Как получить количество записей в текстовом поле формы доступа

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

это мой модуль

Function FindRecordCount(strSQL As String) As Long
     Dim db As Database
     Dim rstRecords As Recordset

'On error GoTo ErrorHandler
            Set db = CurrentDb
            Set rstRecords = db.OpenRecordset("TblPurchases")
    If rstRecords.EOF Then
    FindRecordCount = 0
Else
    rstRecords.MoveLast
    FindRecordCount = rstRecords.RecordCount

End If
   rstRecords.Close
   db.Close
Set rstRecords = Nothing
Set db = Nothing
End Function

Это мой код для текстового поля TxtTotal в форме

   Sub Search()
   Dim strCriteria, task As String

      Me.Refresh
     If IsNull(Me.TxtPurchaseDateFrom) Or IsNull(Me.TxtPurchaseDateTo) 
 Then
   MsgBox "Please enter the date range", vbInformation, "Date Range 
   Required"
    Me.TxtPurchaseDateFrom.SetFocus
  Else
    strCriteria = "([Date of Purchase] >= #" & Me.TxtPurchaseDateFrom & 
   "# and [Date of Purchase] <= #" & Me.TxtPurchaseDateTo & "#)"
    task = "select * from TblPurchases where( " & strCriteria & ") order 
    by [Date of Purchase] "
   DoCmd.ApplyFilter task
    Me.TxtTotal = FindRecordCount(task)
End If

Конец сабвуфера

результаты продолжают давать мне полное количество записей, а не отфильтрованный диапазон.


person Wayne Seymour    schedule 29.04.2019    source источник


Ответы (2)


Я считаю, что основная проблема заключается в этой строке:

Set rstRecords = db.OpenRecordset("TblPurchases")

Вы устанавливаете набор записей для использования таблицы в качестве источника вместо строки SQL. Независимо от того, какие у вас даты ввода, если вы просматриваете всю таблицу, она вернет всю таблицу xD.

Что касается нахождения общего количества элементов в результате запроса, может иметь смысл использовать функцию SQL COUNT, например: SELECT COUNT(<Column>) FROM <table> WHERE <criteria>; Это предоставит вам количество записей данных, предоставленных из этого запроса.

Я бы также рекомендовал использовать объект QueryDef для ваших определений SQL, так как это делает вещи немного чище. Но опять же, это всего лишь рекомендация EG:

Function FindRecordCount(dateFrom As Date, dateTo As Date) As Long
    Dim db As DAO.Database
    Dim QDF As DAO.QueryDef
    Dim rstRecords As DAO.Recordset
    Dim SQL As String

    SQL = "SELECT COUNT(*) FROM TblPurchase WHERE([Date of Purchase] >= #@dateFrom# AND [Date of Purchase] <= #@dateTo#)"

    Set db = CurrentDb
    Set QDF = db.QuerDefs(SQL)
    QDF.Paramaters("@dateFrom").Value = dateFrom
    QDF.Paramaters("@dateTo").Value = dateTo

    Set rstRecords = QDF.OpenRecordset("TblPurchases")

    If rstRecords.EOF Then
        FindRecordCount = 0
    Else
        rstRecords.MoveLast
        FindRecordCount = rstRecords.RecordCount
    End If

    rstRecords.Close
    QDF.Close
    db.Close
    Set rstRecords = Nothing
    Set QDF = Nothing
    Set db = Nothing
End Function

С уважением.

person EliSauder    schedule 30.04.2019
comment
Спасибо за вашу помощь и рекомендацию, я действительно зеленый, чтобы получить доступ, поэтому, пожалуйста, извините за мои глупые вопросы, я буду учиться и работать над вашими рекомендациями. Спасибо. - person Wayne Seymour; 30.04.2019
comment
Нет проблем, вы всегда с чего-то начинаете, верно? xD Если это сработает, дайте мне знать, что мне интересно, так как я никогда не работал с датами доступа (я всегда конвертирую в метку времени UNIX (информация здесь: unixtimestamp.com). - person EliSauder; 30.04.2019
comment
Привет, Эли, я решил проблему с датой, спасибо. Мне было интересно, можно ли использовать тот же элемент управления кнопки поиска, чтобы также выполнить дополнительный поиск, который даст мне результаты определенного поля вместе с диапазоном дат? т.е. я получаю диапазон дат, а затем результаты, скажем, поставщиков, используемых в этом диапазоне дат, и/или выбранных поставщиков, или мне придется использовать отдельную кнопку поиска только для поставщиков. Моя цель - иметь возможность фильтровать записи по продавцы, которые ищут в то же время, имея фильтр поставщиков, отфильтрованный для приобретенных товаров. любые ресурсы, которые вы знаете. - person Wayne Seymour; 03.05.2019
comment
Будете ли вы использовать те же критерии поиска (дата начала и окончания) или будете добавлять новые критерии? Если вы просто добавляете новые критерии, та же кнопка должна работать, просто добавьте дополнительные критерии фильтра в код vba. (не уверен, что это ответ на ваш вопрос или нет) - person EliSauder; 03.05.2019
comment
да, я буду использовать те же критерии поиска. Я тоже пробовал это, я перечислил поставщиков в поле со списком и попробовал код vba для фильтрации записей. ) & Me.cboVendors & char(34) Me.FilterOn =True End Sub Я использую Access 2016 и получаю ошибку компиляции Sub или функция не определена Если я затемняю chae(34), я получаю синтаксическую ошибку (missingOperator) в запросе выражение[vendors] = Ace Hardware поставщик выбрал код, который я использовал, который я нашел в онлайн-видео на Youtube, который, похоже, работает с Access 2007. - person Wayne Seymour; 05.05.2019
comment
Было бы неплохо открыть еще один вопрос по этому вопросу. Как только вы это сделаете, дайте мне знать ссылку, чтобы я мог просмотреть ее. Я возьму эту информацию, которую вы мне дали, и посмотрю, смогу ли я что-то выяснить. - person EliSauder; 09.05.2019
comment
Извините за поздний ответ и спасибо за помощь. Я действительно получил это предложение от сообщества, которое я попробовал, и оно работает. Me.TxtTotal = Format(DCount(vendor, TblPurchases Query), 0) Я удалил два нуля, чтобы сохранить его от размещения нулей перед счетом, но спасибо за всю вашу помощь. В настоящее время я борюсь с другой проблемой, которую вы можете увидеть из моего поста, ура - person Wayne Seymour; 09.05.2019

Вы можете заменить все это выражением DCount в ControlSource текстового поля txtTotal:

=DCount("*","TblPurchase ","[Date of Purchase] Between #" & Format(Nz(Me!TxtPurchaseDateFrom.Value,Date()), "yyyy\/mm\/dd") & "# And #" & Format(Nz(Me!TxtPurchaseDateTo.Value,Date()), "yyyy\/mm\/dd") & "#")
person Gustav    schedule 30.04.2019