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, | Разрешено | Ошибка | Ошибка | Разрешено |
BOF=False, | Разрешено | Разрешено | Ошибка | Ошибка |
Оба свойства имеют значение 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, которая в основном совпадает с запросом, который я пытаюсь использовать.