Как получить количество записей в текстовом поле формы доступа - PullRequest
1 голос
/ 30 апреля 2019

У меня есть таблица доступа, по которой я выполняю поиск по диапазону дат. В форме у меня есть текстовое поле 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

End Sub

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 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") & "#")
0 голосов
/ 30 апреля 2019

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

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

С наилучшими пожеланиями.

...