Поиск по произвольным полям

Для поиска по произвольной выборке полей можно использовать методы Locate и Lookup.

 

function Locate(const KeyFields: string; const KeyValues: Variant; Options; TLocateOptions): Boolean;

function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;

В метод Locate необходимо передать список полей, по которым будет идти поиск (параметр KeyFields, имена полей разделяются точкой с запятой), их требуемые значения (параметр KeyValues, значения разделяются запятой) и настройки поиска (параметр options). В настройках можно задать опцию loCaseinsensitive, которая отключает проверку на регистр символов, и опцию loPartiaiKey, которая включает поиск по части слова. Если вызов Locate возвращает True - то запись найдена и установлена как текущая.

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

 

QueryPerson.Locate('PR_NAME', 'EditName.Text', [loPartialKey, loCaseInsensitive])

 

Теперь будем искать по фамилии и имени, имя при этом вводится в редактор EditName2

 

QueryPerson.Locate('PR_NAME;PR_NAME2', VarArrayOf([EditName.Text, EditName2.Text]), [loPartialKey, loCaseInsensitive])

 

Обратите внимание на функцию VarArrayOf, при помощи которой создается массив переменных типа Variant.

 

Метод Lookup не перемещает курсор в соответствующую строку, а только возвращает её значение. Lookup возвращает массив переменных, содержащих значения из полей, указанных в разделённом точкой с запятой списке имён, значения которых должны быть возвращены из интересующей нас строки. Если соответствующих нашему запросу строк не найдено, то Lookup вернёт пустую (Null) переменную.

 

Следующий пример заполняет массив переменных LookupRes. По фамилии и имени ('PR_NAME;PR_NAME2'), которые вводятся в редакторы EditName и EditName2 соответственно, мы находим нужную запись и записываем в массив переменных LookupRes отчество и дату рождения ('PR_NAME3;PR_BIRTHDAY').

 

var LookupRes: Variant;

LookupRes := QueryPerson.Lookup('PR_NAME;PR_NAME2', VarArrayOf([EditName.Text, EditName2.Text]), 'PR_NAME3;PR_BIRTHDAY');

 

If not VarIsNull(LookupRes) then

ShowMessage(VarToStr(LookupRes[0])) //отчество

 

Функция VarIsNull возвращает истину, если массив переменных не содержит значений, в нашем случае это означает, что никто с указанными фамилией и именем не найден.

Функция VarToStr преобразует вариантный тип в строку.

Работа с записями

Номер текущей записи позволяет узнать свойство

property RecNo: Integer;

Размер записи в байтах возвращает свойство

property RecordSize: Word;

Каждая запись набора данных представляет собой совокупность значений полей таблицы. В зависимости от типа компонента и его настройки, число полей в наборе данных может изменяться. И совсем не обязательно набор данных должен содержать все поля таблицы базы данных.

 

Совокупность полей набора данных инкапсулирует свойство

property Fields: TFields;

а все необходимые параметры полей содержатся в свойстве

property FieldDefs: TFieldDefs;

Общее число полей набора данных возвращает свойство

property FieldCount: Integer;

а общее число полей типа BLOB содержится в свойстве

property BlobFieldCount: Integer;

Доступ к значениям полей текущей записи предоставляет свойство

property FieldValues[const FieldName: string]: Variant; default;

где в параметре FieldName задается имя поля.

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

fori := 0to MyTable.FieldCount - 1 do

MyTable.Fields[i].DiplayFormat := '#.###';

Иначе, если порядок следования полей и их состав меняется, можно использовать метод

function FieldByName(const FieldName: string): TField;

И делается это следующим образом:

MyTable.FieldByName('VENDORNO').Aslnteger := 1234;

Имя поля, передаваемое в параметре FieldName, не чувствительно к регистру символов.

Метод

procedure GetFieldNames(List: TStrings);

вернет в параметр List полный список имен полей набора данных.

Более подробная информация о полях и способах работы с ними содержится в разделе ….