Академия Специальных Курсов по Компьютерным Технологиям
    Главная страница Послать письмо
 
AskIt.ru  
   
   
   
   
   
   
 
 
  Главная / Заказные курсы / Программирование для администраторов
 
 

Получить учебные материалы по этому курсу


<-- Назад Читать дальше -->

13.3.3 Перемещение по Recordset

Перемещение курсора по записям в ADO.Recordset, свойства AbsolutePosition, BOF, EOF, методы Move(), MoveFirst(), MoveLast(), MoveNext() MovePrevious(), Find(), Seek()

После того, как объект Recordset создан, нам необходимо выполнять с ним различные операции. Самое простое действие, с которого мы начнем - перемещение по объекту Recordset.

В Recordset - всегда ограниченное количество записей (столько, сколько мы получили с источника). Изначально курсор устанавливается на первую запись в Recordset (убедиться в этом можно при помощи свойства AbsolutePosition). Однако, если мы дадим команду MovePrevious (один раз), ошибки не произойдет (если мы попробуем выполнить команду MovePrevious второй раз, то возникнет ошибка). AbsolutePosition вернет загадочное значение (-2). Связано это с тем, в Recordset перед первой записью, полученной с источника помещается специальная запись BOF (от Begin Of File, хотя никаких файлов, конечно же, нет). Проверить, находимся ли мы на этой специальной записи, можно при помощи свойства BOF. Например, такой код:

Wscript.Echo  rs.BOF

rs.MovePrevious

Wscript.Echo rs.BOF

вернет нам вначале false, а затем true.

Точно так же после последней записи в Recordset находится специальная запись EOF (End Of File). Проверить, не находится ли курсор на ней, можно при помощи аналогичного одноименного свойства EOF.

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

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

·        Move - этот метод принимает два параметра: NumRecords - на сколько записей необходимо переместиться (это число может быть и отрицательным, что значит - переместиться назад) и второй метод - необязательный - имя закладки, с которой нужно начать перемещение. Можно использовать три встроенные закладки: для текущей, первой и последней записи. Если имя закладки не указано, то перемещение начинается с текущей позиции.

·        MoveFirst, MoveLast, MoveNext и MovePrevious - назначение этих методов понятно из названия: перемещение на первую, последнюю, следующую и предыдущую запись соответственно.

Необходимо отметить, что перемещение назад (при помощи MovePrevious или Move с отрицательным значением) для курсора, открытого как Forward-only, может привести к совершенно непредсказуемому результату (в зависимости от источника данных) - от ошибки до перехода на случайную запись.

Чаще всего для прохода по всем записям используется такой нехитрый алгоритм:

rs.MoveFirst

Do Until rs.EOF

    'что-то делаем с каждой записью, например, получаем значение нужного поля

    rs.MoveNext

Loop

Если нужно напрямую перепрыгнуть на нужную запись, можно использовать методы  Find и Seek.

·        метод Find предназначен для поиска по значению одного столбца. Он принимает в качестве параметра критерий поиска, насколько нужно отступить от исходной позиции, направление поиска и откуда нужно начать поиск. Очень удобно, что при определения критерия поиска можно использовать оператор Like с подстановочными символами. При обнаружении нужной записи метод Find переставляет курсор на найденную запись, если же запись не обнаружена, то курсор устанавливается на EOF (или BOF, если поиск был назад). Например, чтобы найти все немецкие фирмы в нашем Recordset для таблицы Customers, можно использовать код вида

rs.Find "country = 'Germany'"

Do While Not rs.EOF

            Wscript.Echo "Название фирмы: "; rs.Fields("CompanyName")

            mark = rs.Bookmark

            rs.Find "country = 'Germany'", 1, , mark

Loop

В этом примере используются еще незнакомые нам объекты Fields и Bookmark, но их назначение понятно: объект Field нужен нам, чтобы вывести название фирмы, а объект Bookmark - чтобы продолжить поиск позиции +1 от последней найденной записи.

·        метод Seek отличается от метода Find тем, что они ищет значение по индексу (объект Index для Recordset создается либо программным способом, либо автоматически - если на таблицу, на основе который был создан Recordset, было наложено ограничение Primary Key). Этот метод работает только для серверных курсоров с типом команды TableDirect, и поэтому к использованию не рекомендуется.

Теперь - о еще одном свойстве, которое может сильно помочь в перемещении по Recordset (и которое уже встречалось в наших примерах) - свойстве Bookmark. Это свойство очень простое - достаточно присвоить его значение переменной типа Variable, когда указатель стоит в нужном месте Recordset, а затем присвоить этому свойству значение этой переменной, чтобы опять на него вернуться - как в нашем примере с поиском.

Вообще говоря, значение, которое возвращает это свойство, изначально совпадает с номером записи в Recordset, однако Microsoft честно предупреждает, что таким способом пользоваться закладкой очень не рекомендуется - если курсор стоит в одном и том же месте, свойство Bookmark может возвращать разные значения.

 

   
   
   
   
   
   
   
   
   
   
 
<-- Назад Читать дальше -->

Получить учебные материалы по этому курсу


 

 
© 2004-2016, Академия Специальных Курсов
по Информационным Технологиям
.
Все права защищены.

Разработка NevaStudio
г. Санкт-Петербург, Васильевский остров,
20-я линия, д. 7
Офис 101, 2-й этаж
Телефон: 8(812)922-47-60
E-mail: info@askit.ru