Программирование в ACCESS 2000, страница 17

НОВОЕ Объект Recordset теперь имеет метод Save, который позволяет сохранить содержи-мое этого объекта в файле или объекте Stream. Файл может иметь один из двух форматов: XML и ADTG (Microsoft Advanced Data TableGram). Об использовании XML-файлов мы будем говорить в уроке 7, а об объектах Stream — в конце данного урока (см. раздел «Объекты Record и Stream».)

Перемещение по набору записей

При работе с записями в наборе важным является понятие текущая запись Обращаясь к полям записи, мы всегда имеем дело только с текущей записью. Нельзя получить значения полей произвольной записи набора, сначала нужно сделать требуемую запись текущей, то есть переместиться на эту запись. Работа с записями в моделях DAO и ADO выполняется аналогично.

Для перемещения по набору записей используются методы, перечисленные ниже.

·  MoveFirst — переход к первой записи в наборе. Используется при всех типах курсора. При использовании статического курсора с последовательным доступом вызывает повторное выполнение команды, которая возвратила Recordset.

·  MoveNext — переход к следующей записи. Используется при всех типах курсора.

·  MovePrevious — переход к предыдущей записи. При использовании статического курсора с последовательным доступом вызывает генерацию ошибки времени исполнения.

·  MoveLast — переход к последней записи. При использовании статического курсора с последовательным доступом вызывает генерацию ошибки времени исполнения.

·  Move — позволяет переместиться на заданное число записей вперед или назад. При использовании статического курсора с последовательным доступом отрицательное значение аргумента вызывает генерацию ошибки времени исполнения.

·  При перемещении по набору записей важно контролировать указатель, чтобы не переместить его за границы набора. Для этого используются два свойства:

·  BOF — это свойство принимает значение True, как только указатель текущей записи оказывается перед первой записью набора;

·  EOF — принимает значение True, как только указатель текущей записи оказывается после последней записи набора или в наборе нет ни одной записи.

В листинге 5.31 показано, как организовать цикл для набора записей, созданных на базе таблицы Издательства. Записи полученного объекта Recordset используются для заполнения источника строк для поля со списком, в форме.

Листинг 5.31. Организация цикла по набору записей (DАО — вариант 1)

Dim dbCur As  Database,   rs  As  DAO.Recordset

Set  dbCur  = CurrentDb

Set rs = dbCur.OpenRecordset("SELECT Код, Название FROM "_

    &  "Издательства ORDERBY Название", dbOpenSnapshot)

While  Not rs.EOF

  cmbEdition.RowSource =  cmbEdition.RowSource & гз!Код _

  &  ";"  & rs!Название &  ";"

rs.MoveNext

Wend

rs.Close

Второй вариант организации цикла связан с использованием свойства RecordCount.

Для набора записей типа Таблица это свойство возвращает общее количество записей в наборе. Поэтому можно организовать цикл For...Next для перебора всех записей. Однако для других типов объекта Recordset с этим свойством нужно обращаться осторожно. Обычно его используют, чтобы определить, содержит ли набор хоть какие-то записи (когда набор пуст, значение свойства RecordCount равно 0). Но если вы только что создали набор записей статического или динамического типа, значение этого свойства будет равно единице. Это происходит потому, что не все записи сразу считываются из источника, однако предполагается, что набор содержит хотя бы одну запись. Чтобы узнать общее число записей в наборе статического или динамического типа, нужно перейти в конец набора с помощью метода MoveLast. При этом будут прочитаны все записи, а свойство Record-Count объекта Recordset будет содержать нужное значение. После этого нужно снова вернуться к первой записи. Пример такого цикла приведен в листинге 5.32.

Листинг 5.32. Организация цикла по набору записей (DАО — вариант 2)