Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть неиндексированными.
Функция Locate (const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существуют, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение True, в противном случае — значение False. Список полей, по которым ведется поиск, задается в параметре KeyFields, поля разделяются точкой с запятой. Параметр KeyValues типа variant указывает значения полей для поиска. Если поиск ведется по одному полю, то параметр содержит одно значение, соответствующее типу поля, заданного для поиска.
Параметр options позволяет задать значения, которые обычно используются при поиске строк. Этот параметр принадлежит к множественному типу TLocateOptions и принимает комбинации следующих значений:
1. locaseinsensitive —регистр букв не учитывается;
При поиске по нескольким полям в методе Locate параметр KeyValues является массивом значений типа variant, в котором содержится несколько элементов.
Для приведения к типу вариантного массива используется функция varArrayOf. Значения разделяются запятыми и заключаются в квадратные скобки, порядок значений должен соответствовать порядку полей параметра KeyFieids. Обычно при разработке приложений пользователю предоставляется возможность влиять на процесс поиска с помощью управляющих элементов, расположенных на форме. При этом действия пользователя по управлению поиском в наборе данных мало чем отличаются от аналогичных действий при выполнении фильтрации.
Замечание
Если имя поля или тип значения заданы неправильно, то при попытке выполнить метод Locate генерируется исключительная ситуация.
Метод Locate позволяет вести поиск по любым полям, однако если поля индексированы или являются частью некоторого индекса, то соответствующий индекс при поиске используется автоматически. При этом также автоматически записи набора данных сортируются по указанному индексу. В результате, если условиям поиска удовлетворяет несколько записей, то будет найдена и установлена текущей первая в порядке сортировки запись. При использовании другого индекса порядок расположения записей, удовлетворяющих условиям поиска, может измениться, и будет найдена другая запись.
Для поиска в наборе данных также используется метод Lookup, который работает аналогично методу Locate. Функция Lookup (const KeyFields: String; const KeyValues: Variant; const ResultFields: String): Variant осуществляет поиск записи, удовлетворяющей определенным условиям, но, в отличие от метода Locate, не перемещает указатель текущей записи на найденную запись, а считывает информацию из полей записи. Еще одно отличие между двумя методами заключается в том, что метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв.
Параметры KeyFields и KeyValues имеют такое же назначение, как и в методе Locate, и используются аналогичным образом.
В параметре ResultFields через точку с запятой перечисляются названия полей, значения которых будут получены в случае успешного поиска. Эти значения считываются из первой найденной записи, удовлетворяющей условиям поиска. Порядок перечисления полей в ResultFields может отличаться от порядка полей в наборе данных. Например, если набор данных имеет поля Code, Name, Salary И Note, то в ResultFields можно задать Salary и Name.
В случае удачного поиска метод Lookup в качестве результата возвращает значение типа variant, размерность которого зависит от списка полей ResultFields. Если список содержит одно значение, то метод возвращает значение одного поля, если в списке задано несколько полей, то метод возвращает массив variant, число элементов которого совпадает с числом полей в списке ResultFields.
При неудачном поиске метод Lookup возвращает значение Null. Для анализа такого результата можно использовать функцию VarlsNul (const V: Variant): Boolean, возвращающую значение True при значении параметра v, равном Null.
Не следует путать Null, соответствующее пустому (нулевому) значению, и Nil, означающее отсутствие значения.