MS Access VBA .recordcount возвращает 0 при наличии записей, а debug.print возвращает значение - PullRequest
0 голосов
/ 06 июня 2018

У меня есть таблица доступа с 10 записями и одним полем краткого текста.Я использую функцию .recordcount, чтобы вернуть количество записей в этой таблице.Код ниже:

Dim db as DAO.Database
Dim RS as DAO.Recordset
Dim recCount as Integer
Set db = CurrentDb
Set RS = db.OpenRecordset("Table Name")

RS.MoveFirst
RS.MoveLast
recCount = RS.recordcount

Debug.Print(recCount)

Dim i as Integer
i = 0
RS.MoveFirst
'Option one. Commented out when option two is active and vice verse
Do While i < 10
    Debug.Print(RS(i))
    i = i + 1
Loop

Do While i < 10
    Debug.print(RS![Only Field Name])
    i = i + 1
    RS.MoveNext
Loop

recCount всегда печатает, чтобы быть равным 0. Попытка распечатать записи в наборе записей вернет только первое значение набора записей и ничего больше.После прочтения первой записи программа выдает ошибку «Элемент не найден в коллекции».Я не уверен, что может быть причиной этой ошибки, так как я использую тот же метод с другой таблицей в другом модуле VBA, который работает просто отлично.

Я смотрю на решения этой проблемы в другом месте, и единственныйМожно было найти, чтобы добавить RS.moveFirst и RS.moveLast после открытия, однако это не работает.Я думаю, это потому, что открытый набор записей фактически не содержит всех записей в таблице.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Возможно, вы могли бы попробовать что-то подобное в своей подпрограмме:

Dim db As DAO.Database
Dim RS As DAO.Recordset
Dim recCount As Integer
Set db = CurrentDb
Set RS = db.OpenRecordset("Table Name")
If Not (RS.EOF And RS.BOF) Then
RS.MoveFirst
Do Until RS.EOF = True
RS.MoveNext
Loop
MsgBox ("There are:" & " " & RS.RecordCount & " " & "records in the database")
End If
RS.Close
Set RS = Nothing
0 голосов
/ 06 июня 2018

Мне удалось решить эту проблему, но я понятия не имею, почему это сработало.Вместо того чтобы создавать новую таблицу и вводить значения для десяти записей, я вместо этого использовал запрос вставки, чтобы поместить значения, которые я хотел получить из запроса, в таблицу.Используя эту новую таблицу, это сработало.

0 голосов
/ 06 июня 2018

Вы можете перечислить записи при подсчете:

Set RS = db.OpenRecordset("Table Name")

While Not RS.EOF
    Debug.Print RS![Only Field Name].Value
    i = i + 1
    RS.MoveNext
Loop

Debug.Print i & " records found."
0 голосов
/ 06 июня 2018

РЕДАКТИРОВАТЬ:

Попробуйте это:

Sub Demo_IterateRecords()
    Const tblName = "YOUR TABLE NAME HERE"
    Dim rs As Recordset

    Set rs = CurrentDb.OpenRecordset(tblName)
    With rs
        .MoveLast
        .MoveFirst

        If MsgBox("Do you want to list all " & .RecordCount & " records?", _
            vbOKCancel, "Confirmation") <> vbOK Then GoTo ExitMySub

        Do While Not .EOF
            Debug.Print .Fields(0), .Fields(1), .Fields(2)
            rs.MoveNext
        Loop

ExitMySub:
        .Close
    End With
    Set rs = Nothing

End Sub

Я использовал .Fields(_), потому что я не уверен, как называются ваши поля, но лучший способ обратиться к ним будетпо имени, например:

        Debug.Print !myID, !myEmployeeName, !myEmployeeAddress

Оригинальный ответ:

Попробуйте:

RS.MoveLast
RS.MoveFirst
recCount = RS.RecordCount
Debug.Print(recCount)

Доступ не знает, сколько существует записей, пока выПройдите их хотя бы один раз.

Если бы вы проверяли значение RS.RecordCount после вашего цикла, вы бы получили число.

Заметки

Используйте свойство Recordcount, чтобы узнать, сколько записей в объекте Recordset или TableDef было получено.Свойство RecordCount не указывает, сколько записей содержится в объекте Recordset типа dynaset -, snapshot- или forward-only, до тех пор, пока не будут получены все записи.После получения доступа к последней записи свойство RecordCount указывает общее количество восстановленных записей в объекте Recordset или TableDef.Для принудительного доступа к последней записи используйте метод MoveLast объекта Recordset.Вы также можете использовать функцию SQL Count, чтобы определить приблизительное число записей, которые будет возвращать ваш запрос.

Важное примечание

Использование метода MoveLast для заполнения вновь открытого набора записей негативно влияетспектакль. Если нет необходимости иметь точный RecordCount, как только вы откроете набор записей , лучше дождаться, пока вы не наполните набор записей другими частями кода , прежде чем проверять RecordCount имущество.

( Источник )


См. Также: MSDN: Recordset.RecordCount Свойство

...