Дополнительные способы перемещения по набору записей
Область применения: Access 2013, Office 2013
Для перемещения или прокрутки в наборе записей используются следующие четыре метода: MoveFirst, MoveLast, MoveNext и MovePrevious. (Некоторые из этих методов недоступны для курсоров только для пересылки.)
MoveFirst изменяет текущую позицию записи на первую запись в наборе записей. MoveLast изменяет текущую позицию записи на последнюю запись в наборе записей. Чтобы использовать MoveFirst или MoveLast, объект Recordset должен поддерживать закладки или перемещение курсора назад. В противном случае вызов метода вызовет ошибку.
MoveNext перемещает текущую позицию записи на одно место вперед. Если вы используете последнюю запись при вызове MoveNext, EOF будет иметь значение True. MovePrevious перемещает текущую позицию записи на одно место назад. Если вы используете первую запись при вызове MovePrevious, boF будет иметь значение True. Разумно проверка свойства EOF и BOF при использовании этих методов, а также переместить курсор обратно в допустимую текущую позицию записи, если вы отойдете с любого конца набора записей, как показано ниже:
. . .
oRs.MoveNext
If oRs.EOF Then oRs.MoveLast
. . .
Или в случае метода MovePrevious :
. . .
oRs.MovePrevious
If oRs.BOF Then oRs.MoveFirst
. . .
В случаях, когда набор записей был отфильтрован или отсортирован, а данные текущей записи изменены, позиция также может измениться. В таких случаях метод MoveNext работает нормально, но имейте в виду, что позиция перемещается на одну запись вперед из новой позиции, а не из старой позиции. Например, изменение данных в текущей записи таким образом, чтобы запись была перемещена в конец отсортированного набора записей, приведет к тому, что вызов MoveNext приведет к тому, что ADO установит текущую запись в положение после последней записи в наборе записей (EOF = True).
Поведение различных методов Move объекта Recordset зависит в некоторой степени от данных в наборе записей. Новые записи, добавленные в набор записей , изначально добавляются в определенном порядке, который определяется источником данных и может зависеть неявно или явно от данных в новой записи. Например, если сортировка или соединение выполняется в запросе, который заполняет набор записей, новая запись будет вставлена в соответствующее место в наборе записей. Если при создании набора записей явно не указано упорядочение, изменения в реализации источника данных могут привести к случайному изменению порядка возвращаемых строк. Кроме того, функции сортировки, фильтрации и редактирования набора записей могут влиять на порядок и, возможно, на то, какие строки в наборе записей будут видны.
Таким образом, MoveNext, MovePrevious, MoveFirst, MoveLast и Move чувствительны к другим операциям, выполняемым в одном наборе записей. ADO всегда будет пытаться сохранить текущее положение, пока вы явно не переместите его, но иногда промежуточные изменения затрудняют понимание последствий последующего перемещения. Например, если вы вызываете Метод MoveFirst для позиции в первой строке отсортированного набора записей и изменяете сортировку с возрастающего на убывания, вы по-прежнему находитесь в той же строке, но теперь это последняя строка в наборе записей. MoveFirst приведет вас к другой строке (новая первая строка).
В качестве другого примера, если вы располагаетесь в определенной строке в середине набора записей , а затем вызываете Delete , а затем вызываете MoveNext, вы сразу после удаленной записи будете на записи. Но вызов Метода MovePrevious делает запись, предшествующей текущей записи, так как удаленная запись больше не учитывается в активном членстве в наборе записей.
Особенно трудно определить согласованную семантику перемещения во всех поставщиках для методов, которые перемещаются относительно текущей записи ( MovePrevious, MoveNext и Move ) в условиях изменения данных в текущей записи. Например, если вы работаете с отсортированный отфильтрованным набором записей и изменяете данные в текущей записи так, чтобы они предшествовали всем остальным записям, но измененные данные также больше не соответствуют фильтру, неясно, куда должна выполняться операция MoveNext . Самый безопасный вывод заключается в том, что относительное перемещение внутри набора записей является более рискованным, чем абсолютное перемещение (например, с помощью MoveFirst или MoveLast), когда данные изменяются во время редактирования, добавления или удаления записей. Сортировка и фильтрация должны основываться на первичном ключе или идентификаторе, так как этот тип значения не должен изменяться.