Vba recordset: Объект Recordset (DAO) | Microsoft Learn

Свойство Recordset.EOF (DAO) | Microsoft Learn


  • Статья



Область применения: Access 2013, Office 2013

Возвращает значение, которое указывает, находится ли позиция текущей записи после последней записи в объекте Recordset. Только для чтения, Boolean.

выражение.EOF

выражение Переменная, которая представляет объект Recordset.

С помощью свойств BOF и EOF можно определить, содержит ли объект Recordset записи и не вышли ли вы за пределы объекта Recordset при переходе от записи к записи.

Значения, возвращаемые свойствами BOF и EOF, определяются расположением указателя текущей записи.

Если любое из свойств BOF или EOF имеет значение True, то текущей записи нет.

Если открыть объект Recordset, не содержащий записей, свойства BOF и EOF будут иметь значение True, а свойство RecordCount объекта Recordset — значение 0. Если открыть объект Recordset, содержащий хотя бы одну запись, первая запись будет текущей записью, а свойства BOF и EOF будут иметь значение False; они будут иметь значение False до тех пор, пока вы не переместитесь за начало или конец объекта Recordset с помощью метода MovePrevious или MoveNext соответственно. Если вы переместитесь за начало или конец объекта Recordset, то не будет ни текущей, ни другой записи.

Если удалить последнюю оставшуюся запись в объекте Recordset, свойства BOF и EOF могут по-прежнему иметь значение False, пока вы не попытаетесь изменить позицию текущей записи.

Если использовать метод MoveLast для объекта Recordset, содержащего записи, последняя запись станет текущей записью; если затем воспользоваться методом MoveNext, текущая запись станет недопустимой, и свойству EOF будет присвоено значение True. И наоборот, если использовать метод MoveFirst для объекта Recordset, содержащего записи, первая запись станет текущей записью; если затем воспользоваться методом MovePrevious, текущей записи не будет, и свойству BOF будет присвоено значение True.

Обычно при работе со всеми записями в объекте Recordset код проходит через все записи с помощью метода MoveNext, пока значение свойства EOF не станет равно True.

Если вы воспользуетесь методом MoveNext, когда свойство EOF имеет значение True, или методом MovePrevious, когда свойство BOF имеет значение True, возникнет ошибка.

В этой таблице показано, какие методы Move разрешено использовать при различных сочетаниях свойств BOF и EOF.

BOF=True,
EOF=False

Разрешено

Ошибка

Ошибка

Разрешено

BOF=False,
EOF=True

Разрешено

Разрешено

Ошибка

Ошибка

Оба свойства имеют значение True

Ошибка

Ошибка

Ошибка

Ошибка

Оба свойства имеют значение False

Разрешено

Разрешено

Разрешено

Разрешено

Разрешение использовать метод Move не означает, что этот метод успешно найдет запись. Это всего лишь значит, что попытки выполнить указанный метод Move разрешены и не приведут к возникновению ошибки. В результате выполнения методов Move состояние свойств BOF и EOF может изменяться.

Метод OpenRecordset внутренним образом вызывает метод MoveFirst. Таким образом, при использовании метода OpenRecordset для пустого набора записей свойствам BOF и EOF будет присвоено значение True. (Сведения о том, как ведет себя метод MoveFirst при его неудачном выполнении, см. в приведенной ниже таблице.)

Если любой метод Move успешно находит запись, свойствам BOF и EOF присваивается значение False.

Если в рабочей области Microsoft Access вы добавите запись в пустой объект Recordset, свойству BOF будет присвоено значение False, а свойство EOF будет по-прежнему иметь значение True, указывая на то, что текущая позиция находится в конце объекта Recordset.

Любой метод Delete, даже если он удаляет единственную оставшуюся запись из объекта Recordset, не изменяет значений свойств BOF и EOF.

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

MoveFirst, MoveLast

True

True

Move 0

Без изменений

Без изменений

MovePrevious, Move< 0

True

Без изменений

MoveNext, Move> 0

Без изменений

True

Метод Recordset.

GetRows (DAO) | Microsoft Learn


  • Статья



Область применения: Access 2013, Office 2013

Извлекает несколько строк из объекта Recordset.

Синтаксис

expression . GetRows(NumRows)

expression: переменная, представляющая объект Recordset.

Параметры

NumRows

Необязательный

Variant

Количество возвращаемых строк.

Возвращаемое значение

Variant

Используйте метод GetRows, чтобы скопировать записи из объекта Recordset. GetRows возвращает двумерный массив. Первый подстрочный знак определяет поле, а второй определяет номер строки. Например, intField представляет поле, а intRecord определяет номер строки:

avarRecords(intField, intRecord)

Чтобы получить значение первого поля во второй возвращенной строке, используйте следующий код:

field1 = avarRecords(0,1)

Чтобы получить значение второго поля в первой строке, используйте следующий код:

field2 = avarRecords(1,0)

Переменная avarRecords автоматически становится двумерным массивом, когда метод GetRows возвращает данные.

Если запрошено больше строк, чем доступно, метод GetRows возвращает только число доступных строк. Можно использовать функцию UBound в Visual Basic для приложений, чтобы определить количество строк, фактически возвращенных методом GetRows, так как размер массива соответствует числу возвращаемых строк. Например, если результаты возвращаются в виде значения Variant с именем varA, можно использовать следующий код, чтобы определить число фактически возвращенных строк:

numReturned = UBound(varA,2) + 1

Нужно использовать «+ 1», так как первая возвращенная строка находится в элементе 0 массива. Число строк, которые можно получить ограничено объемом доступной памяти. Не следует использовать метод GetRows для извлечения всей таблицы в массив, если она большая.

Так как GetRows возвращает все поля объекта Recordset в массив, в том числе поля MEMO и LONG BINARY, может потребоваться использовать запрос, ограничивающий возвращаемые поля.

После вызова метода GetRows текущая запись располагается в следующей непрочитанной строке. То есть метод GetRows действует на текущую запись аналогично методу Move numrows.

Если вы пытаетесь извлечь все строки с помощью нескольких вызовов GetRows, используйте свойство EOF, чтобы убедиться, что вы находитесь в конце объекта Recordset. Метод GetRows возвращает меньшее число, чем запрошено, если он находится в конце объекта Recordset или не может извлечь строку из запрошенного диапазона. Например, если вы пытаетесь получить 10 записей, но не удается получить пятую запись, метод GetRows вернет четыре записи и сделает пятую запись текущей. Это не приводит к возникновению ошибки во время выполнения. Это может произойти, если другой пользователь удаляет записи в объекте Recordset типа «Динамический набор». См. пример, демонстрирующий способ обработки такой ситуации.

Пример

В этом примере используется метод GetRows для получения указанного числа строк из объекта Recordset и для заполнения массива итоговыми данными. Метод GetRows возвращает меньше строк, чем нужно в двух случаях: если достигнуто значение EOF или метод GetRows пытается получить запись, удаленную другим пользователем. Функция возвращает значение False только при возникновении второго случая. Функция GetRowsOK необходима для запуска этой процедуры.

    Sub GetRowsX() 
     
     Dim dbsNorthwind As Database 
     Dim rstEmployees As Recordset 
     Dim strMessage As String 
     Dim intRows As Integer 
     Dim avarRecords As Variant 
     Dim intRecord As Integer 
     
     Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
     Set rstEmployees = dbsNorthwind.OpenRecordset( _ 
     "SELECT FirstName, LastName, Title " & _ 
     "FROM Employees ORDER BY LastName", dbOpenSnapshot) 
     
     With rstEmployees 
     Do While True 
     ' Get user input for number of rows. 
     strMessage = "Enter number of rows to retrieve." 
     intRows = Val(InputBox(strMessage)) 
     
     If intRows <= 0 Then Exit Do 
     
     ' If GetRowsOK is successful, print the results, 
     ' noting if the end of the file was reached. 
     If GetRowsOK(rstEmployees, intRows, _ 
     avarRecords) Then 
     If intRows > UBound(avarRecords, 2) + 1 Then 
     Debug. Print "(Not enough records in " & _ 
     "Recordset to retrieve " & intRows & _ 
     " rows.)" 
     End If 
     Debug.Print UBound(avarRecords, 2) + 1 & _ 
     " records found." 
     
     ' Print the retrieved data. 
     For intRecord = 0 To UBound(avarRecords, 2) 
     Debug.Print " " & _ 
     avarRecords(0, intRecord) & " " & _ 
     avarRecords(1, intRecord) & ", " & _ 
     avarRecords(2, intRecord) 
     Next intRecord 
     Else 
     ' Assuming the GetRows error was due to data 
     ' changes by another user, use Requery to 
     ' refresh the Recordset and start over. 
     If .Restartable Then 
     If MsgBox("GetRows failed--retry?", _ 
     vbYesNo) = vbYes Then 
     .Requery 
     Else 
     Debug.Print "GetRows failed!" 
     Exit Do 
     End If 
     Else 
     Debug.Print "GetRows failed! " & _ 
     "Recordset not Restartable!" 
     Exit Do 
     End If 
     End If 
     
     ' Because using GetRows leaves the current record 
     ' pointer at the last record accessed, move the 
     ' pointer back to the beginning of the Recordset 
     ' before looping back for another search.  
     .MoveFirst 
     Loop 
     End With 
     
     rstEmployees.Close 
     dbsNorthwind.Close 
     
    End Sub 
     
    Function GetRowsOK(rstTemp As Recordset, _ 
     intNumber As Integer, avarData As Variant) As Boolean 
     
     ' Store results of GetRows method in array. 
     avarData = rstTemp.GetRows(intNumber) 
     ' Return False only if fewer than the desired number of 
     ' rows were returned, but not because the end of the 
     ' Recordset was reached. 
     If intNumber > UBound(avarData, 2) + 1 And _ 
     Not rstTemp.EOF Then 
     GetRowsOK = False 
     Else 
     GetRowsOK = True 
     End If 
     
    End Function

Доступ к наборам записей VBA — открытие, подсчет, цикл и т. д.

Вернуться к примерам кода VBA

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

У нас есть таблица доступа с именем ProductsT, показанная ниже:

Открытие набора записей

Сначала нам нужно создать базу данных, которую мы собираемся использовать, в данном случае это открытая в данный момент база данных. Затем мы можем использовать метод CurrentDB.OpenRecordSet, чтобы открыть/создать наш набор записей.

Чтобы создать набор записей, который позволит нам манипулировать данными в таблице с именем ProductsT, мы должны использовать следующий код:

 CurrentDb.OpenRecordset ("ProductsT") 

Подсчет количества записей с помощью VBA

После того, как вы создали набор записей, вы, скорее всего, захотите сделать с ним что-то полезное или каким-то образом манипулировать данными в нем. Вы можете подсчитать количество записей в вашем наборе данных (в данном случае это таблица с именем ProductsT), используя следующий код:

 MsgBox CurrentDb.OpenRecordset("ProductsT").RecordCount 

Цикл через набор записей с использованием VBA

Следующий код проходит через наш набор записей:

 Sub RecordSet_Loop ()

Затемните нашу базу данных как базу данных
Dim ourRecordset As Recordset

Установите нашу базу данных = CurrentDb
Установите ourRecordset = ourDatabase. OpenRecordset("ProductsT")

Делать до нашего набора записей.EOF
  MsgBoxнашRecordset!ProductID
  нашRecordset.MoveNext
Петля

Конец суб 

Добавление записи в RecordSet

Используйте метод Recordset.AddNew для добавления новой записи в RecordSet:

 Sub RecordSet_Add()

С CurrentDb.OpenRecordset("ProductsT")
.Добавить новое
![ИД продукта] = 8
![ProductName] = "Продукт ЧЧЧ"
![ЦенаПродуктаЗаЕдиницу] = 10
![ProductCategory] = "Игрушки"
![ЕдиницНа складе] = 15
.Обновлять
Конец с


End Sub 

Результат:

Обновление набора записей

Необходимо использовать метод Recordset.AddNew или Recordset.Edit. После этого оператора вы должны использовать метод Recordset.Update, чтобы сохранить изменения.

 

 

Чтение значений из записи

Для создания записи, текущей записи, необходимо использовать метод Recordset.FindFirst. Затем вам нужно использовать Recordset.Fields, чтобы указать, на какое поле смотреть.

 Sub RecordSet_ReadValue ()

Затемните нашу базу данных как базу данных
Dim ourRecordset As Recordset
Установите нашу базу данных = CurrentDb
Установите ourRecordset = ourDatabase.OpenRecordset("ProductsT", Type:=RecordsetTypeEnum.dbOpenDynaset)
С нашим набором записей
.FindFirst "ProductName = " & "'Product CCC'"
Если .NoMatch Тогда
MsgBox "Совпадение не найдено"
Еще
MsgBox ourRecordset.Fields("Категория Продукта")
Конец, если
Конец с

Конец суб 

Результат:

Кодирование VBA стало проще

Остановить поиск кода VBA в сети. Узнайте больше об AutoMacro — конструкторе кода VBA, который позволяет новичкам создавать процедуры с нуля с минимальными знаниями в области кодирования и множеством функций, позволяющих сэкономить время для всех пользователей!

Узнать больше

Удаление записи из набора записей

Чтобы удалить запись из набора записей, вы должны сначала сделать ее текущей записью с помощью метода Recordset. FindFirst. Затем вы можете удалить его с помощью метода Recordset.Delete. Следующий код показывает, как удалить запись 2 в наборе данных:

 Sub RecordSet_DeleteRecord ()

Затемните нашу базу данных как базу данных
Dim ourRecordset As Recordset

Установите нашу базу данных = CurrentDb
Установите ourRecordset = ourDatabase.OpenRecordset("ProductsT", Type:=RecordsetTypeEnum.dbOpenDynaset)

С нашим набором записей
  .FindFirst "ProductName = " & "'Product BBB'"

  Если .NoMatch Тогда
    MsgBox "Совпадение не найдено"
  Еще
    нашRecordset.Delete
  Конец, если
Конец с

'Повторно открыть таблицу
DoCmd.Close acTable, "ProductsT"
DoCmd.OpenTable "ПродуктыT"

Конец суб 

Результат:

Надстройка примеров кода VBA

Удобный доступ ко всем примерам кода, найденным на нашем сайте.

Просто перейдите в меню, нажмите, и код будет вставлен прямо в ваш модуль. Надстройка .xlam.

(Установка не требуется!)

Скачать бесплатно

Access VBA: набор записей не работает с определенным запросом?

Задавать вопрос

спросил

Изменено
2 года, 11 месяцев назад

Просмотрено
674 раза

Во-первых: я не эксперт, я почти новичок в VBA.
на мой вопрос:

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

Запрос, который я пытаюсь использовать с набором записей, в основном содержит поле «пользователь», которое изменяется в зависимости от текстового поля формы. Нельзя ли открыть этот запрос как набор записей, потому что он зависит от текстового поля формы, или я что-то упустил в коде?

Вот мой код для справки:

 Dim db As Database
Dim rs As DAO.Recordset
Установить БД = CurrentDb
Установите rs = db.OpenRecordset("tblExample")
Делать до rs.EOF
    Debug.Print rs.Fields("ПримерПоля")
    rs.MoveNext
Петля
rs.Закрыть
db.Закрыть
Установить rs = Ничего
Установить БД = Ничего
 

Я также безуспешно пытался заменить «tblExample» строкой SQL, которая в основном совпадает с запросом, который я пытаюсь использовать.