Пример 1
Function СписокПредметов (frm As Form)
Dim rst As RecordSet
Set rst = frm.RecordSetClone
rst.MoveFirst
Do
Debug.Print rst(0); " "; rst(1)
rst.MoveNext
Loop Until rst.Eof
End Function
Функции СписокПредметов передается аргумент frm, являющийся ссылкой на открытую форму (тип Form). Здесь мы видим, что в одной процедуре могут использоваться как объекты Access (формы, отчеты, элементы управления), так и Jet (RecordSet). Объектной переменной rst присваивается значение свойства формы RecordsetClone. Это свойство является ссылкой на базовый набор записей формы. Таким образом, можно получить доступ к объекту RecordSet, минуя обращение к сеансу и базе данных.
В следующей инструкции выполняется метод MoveFirst, который устанавливает указатель текущей записи набора rst на первую запись.
Цикл Do…Loop выполняется, пока не встретится конец набора, когда свойство набора Eof примет значение True.
В теле цикла выполняются 2 инструкции. Инструкция Debug.Print выводит в окно отладки строку, состоящую из трех частей. Для разделения частей используется точка с запятой. Выражение вида rst(n) определяет поле набора по его порядковому номеру. При этом нужно помнить, что нумерация в семействах начинается с нуля. Таким образом, в строку окна отладки выдается первое и второе поле базового набора записей формы, переданной в качестве аргумента. Поля разделены пробелом. Вторая инструкция тела цикла Do вызывает метод MoveNext объекта RecordSet, перемещающий указатель на следующую запись. Цикл Do выводит в окно отладки все записи формы frm.
Запустить функцию при открытой форме Экзаменаторы можно, записав в окно отладки строку, начинающуюся вопросительным знаком. ? СписокПредметов (Forms![Экзаменаторы]) После нажатия Enter функция СписокПредметов запускается и выдает результат в виде "Номер экзаменатора, Название предмета".
Информатика
Математика
…
Если в заголовок формы Экзаменаторы поместить кнопку, а свойству кнопки "Нажатие кнопки" присвоить выражение "=СписокПредметов([Form])", то при каждом нажатии этой кнопки будут выдаваться номера экзаменаторов и названия предметов.
Пример 2
Public Sub SQLRecords ()
Dim rst As RecordSet
Dim db As Database
Dim strSQL As String
Set db = CurrentDB()
StrSQL="SELECT * FROM Преподаватели WHERE [Звание] = 'Доцент'"
Set rst = db.OpenRecordSet (strSQL)
Do Until rst.Eof
Debug.Print rst!ФИО
rst.MoveNext
Loop
End Sub
В рассматриваемом примере для получения ссылок на базу данных используется функция CurrentDB. Обращение к ней равносильно строке "DBEngine.WorkSpaces(0).Datsbases(0)". Переменной rst типа RecordSet присваивается ссылка на объект типа RecordSet. Этот объект формируется на базе запроса strSQL с помощью метода OpenRecordset. Мы здесь не рассматриваем запросы на языке SQL. Предполагается, что читатель знаком с ними. Из содержания строки strSQL видно, что из таблицы Преподаватели извлекаются все поля и записи, в которых преподаватель имеет ученое звание Доцент.
Цикл Do…Loop выдает в окно отладки фамилии всех экзаменаторов-доцентов. Некоторые фамилии могут встретиться несколько раз, поскольку после слова SELECT не поставлено слово DISTINCT.
Используемый в процедуре запрос существует только в самой процедуре и исчезает после ее закрытия. В окне базы данных такой запрос отсутствует.
