Шаг 127 - Метод Seek

Описание
Находит в индексированном объекте Recordset типа таблицы запись, удовлетворяющую заданным условиям для текущего индекса, и делает эту запись текущей записьюрабочей области ядра Microsoft Jet

наборЗаписей.Seek сравнение, ключ1, ключ2...ключ13

Параметры
наборЗаписей
Объектная переменная, представляющая существующий табличный объект Recordset, имеющий индекс, определенный с помощью свойства Index объекта Recordset.
сравнение
Одно из следующих строковых выражений: "<", "<=", "=", ">=" или ">".
ключ1, ключ2...ключ13
Одно или несколько значений ключевых полей в текущем индексе объекта Recordset, определенных с помощью свойства Index. Допускается указание до 13 аргументов ключ.

Замечания
Перед вызовом метода Seek следует обязательно с помощью свойства Index указать текущий индекс. Если в индексе используется ключевое поле с повторяющимися значениями, то метод Seek найдет первую из записей, удовлетворяющую заданным условиям.
Метод Seek проводит поиск по указанным ключевым полям и находит первую запись, удовлетворяющую условиям, которые заданы с помощью аргументов сравнение и ключ1. Найденная запись становится текущей записью, а свойство NoMatch получает значение False. Если в методе Seek не найдена запись, удовлетворяющая указанным условиям, свойство NoMatch получает значение True, а положение текущей записи становится неопределенным.
Если в аргументе сравнение задано условие "равняется" (=), "больше или равняется" (>=) или "больше" (>), то поиск по направлению вперед начинается с начала индекса.
Если в аргументе сравнение задано условие "меньше" (<) или "меньше или равняется" (<=), то поиск проводится в обратном порядке и начинается с конца индекса, за исключением случая наличия в конце индекса одинаковых значений. В последнем случае метод Seek начнет поиск с одной произвольной записи из имеющих одинаковые значения в конце индекса.
Необходимо указать значения для всех полей индекса. Если метод Seek применяется к составному индексу, и не указано точное значение для каждого поля, то использование оператора "равняется" (=) становится невозможным. Причиной этого станут значения Null, задающиеся по умолчанию для некоторых из полей (ключ2, ключ3 и т.д.). В таком случае оператор "равняется" сможет обнаружить только запись, имеющую пустые значения во всех полях индекса, за исключением тех, для которых заданы значения аргументов метода Seek. Рекомендуется в подобных случаях использовать операторы "больше или равняется" или "меньше или равняется".
Аргумент ключ1 должен иметь тот же самый тип данных поля, что и соответствующее поле текущего индекса. Например, если в текущий индекс включено числовое поле (такое как поле "КодСотрудника"), то значение аргумента ключ1 должно быть числом. Аналогично, если текущий индекс описывает текстовое поле (такое как "Фамилия"), то аргумент ключ1 должен иметь строковое значение.
При вызове метода Seek не требуется предварительного определения текущей записи
Для перечисления существующих индексов можно воспользоваться семейством Indexes.
Для поиска нужной записи в объекте Recordset типа динамического или статического набора записей следует использовать методы группы Find. Для включения в поиск всех записей, а не только записей, удовлетворяющих определенным условиям, следует использовать методы группы Move.
Метод Seek нельзя применять к присоединенной таблице, поскольку присоединенные таблицы не могут быть открыты как табличные объекты Recordset. Однако при использовании метода OpenDatabase для прямого открытия базы данных с устанавливаемым драйвером ISAM (не являющейся базой данных ODBC) становится возможным применение метода Seek к таблицам этой базы данных.
В рабочей области ODBCDirect методы Find и Seek нельзя применять к объектам Recordset любых типов, поскольку выполнение методов Find или Seek через сетевое подключение ODBC является неэффективным. Вместо этого следует создать запрос (т.е. использовать аргумент источник в методе OpenRecordset) с соответствующим предложением WHERE, ограничивающим возвращаемые записи теми, которые удовлетворяют условиям, задаваемым при поиске с использованием методов Find или Seek.

Пример
В следующем примере метод Seek используется для поиска товара по коду товара.

Sub SeekX()

	Dim dbsNorthwind As Database
	Dim rstProducts As Recordset
	Dim intFirst As Integer
	Dim intLast As Integer
	Dim strMessage As String
	Dim strSeek As String
	Dim varBookmark As Variant

	Set dbsNorthwind = OpenDatabase("Борей.mdb")
	' Чтобы использовать индекс в методе Seek, необходимо 
	' открыть табличный объект Recordset.
	Set rstProducts = dbsNorthwind.OpenRecordset("Товары", dbOpenTable)

	With rstProducts
	' Задает индекс.
	.Index = "PrimaryKey"
		' Определяет минимальный и максимальный код товара.
		.MoveLast
		intLast = !КодТовара
		.MoveFirst
		intFirst = !КодТовара
		Do While True
			' Отображает сведения о текущей записи
			' и выводит приглашение задать код.
			strMessage = "Код товара: " & !КодТовара & vbCr & 	"Марка: " & !Марка & vbCr & vbCr & _
				"Введите код товара в интервале от " & intFirst & " до " & intLast & "."
			strSeek = InputBox(strMessage)
			If strSeek = "" Then Exit Do
			' Сохраняет текущую закладку на случай ошибки метода Seek.
			varBookmark = .Bookmark
			.Seek "=", Val(strSeek)
			' Возвращается на текущую запись при ошибке в методе Seek.
			If .NoMatch Then
				MsgBox "Код не найден!"
				.Bookmark = varBookmark
			End If
		Loop
		.Close
	End With
	dbsNorthwind.Close
End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 24.03.2002