Учись программированию на C++ Builder бесплатно!

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

Функция Locate с объявлением:

virtual bool __fastcall Locate (const AnsiString KeyFields, const System::Variant &KeyValues, TLocateOptions Options);

ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существуют, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение true, в противном случае значение false. Список полей, по которым ведется поиск, задается в параметре KeyFields, поля разделяются точкой с запятой. Параметр KeyValues указывает значения полей для поиска. Если поиск ведется по одному полю, то параметр содержит одно значение, соответствующее типу поля, заданного для поиска.

Параметр Options позволяет задать значения, которые обычно используются при поиске строк. Этот параметр принадлежит к множественному типу TLocateOptions и принимает комбинации следующих значений:

  • loCaseInsensitive (регистр букв не учитывается)
  • loPartialKey (допускается частичное совпадение значений)

Тип TLocateOptions по сути похож на тип TFilterOptions, определяющий параметры фильтрации по выражению, но значения loPartialKey и foNoPartialCompare имеют противоположное действие.

При наличии у параметра Options значения loPartialKey к нему автоматически добавляется значение loCaseInsensitive.

Пример поиска по одному полю:

void __fastcall TForm1::Buttonlclick(TObject *Sender)
{
TLocateOptions SOptions;
Table1->Locate("Товар", "Магнитофоны", SOptions<<loCaseInsensitive);
}

Поиск выполняется по полю товар и ищется первая запись, для которой значением этого поля является строка магнитофоны. В качестве параметра Поиска используется значение loCaselnsensitive.

При поиске по нескольким полям в методе Locate параметр KeyValues является массивом значений типа Variant, в котором содержится несколько элементов. Для приведения к типу вариантного массива используется функция VarArrayOf c объявлением:

extern PACKAGE Variant __fastcall VarArrayOf(constVariant * Values, const int Values_Size);

Параметр Values_size определяет индекс последнего элемента массива. Порядок следования значений должен соответствовать порядку полей параметра KeyFields. Например:

void __fastcall TForm1::Button2Click(TObjееt *Sender)
{
TLocateOptions SOptions;
Variant arrvalues[]={Edit1->Text,Edit2->Text};
Table1->Locate("Оплата/Валюта", VarArrayOf(arrvalues,1), SOptions<<loPartialKey<<loCaseInsensitive);
}

Поиск выполняется по полям оплата и валюта, ищется первая запись, для которой значение поля оплаты содержится в Edit1->Text, а значение поля валюты содержится в Edit2->Text. Регистр букв значения не имеет. 

Значение loPartialKey параметра Options должно обеспечивать возможность частичного совпадения строковых значений в ключевых полях, по которым осуществляется поиск. В действительности поиск записи происходит только при строгом совпадении значений полей.

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

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

Для поиска в наборе данных также используется метод Lookup, который работает аналогично методу Locate. Метод имеет объявление:

virtual System::Variant __fastcall Lookup(const AnsiString KeyFields, const System::Variant &KeyValues,const AnsiString ResultFields);

и осуществляет поиск записи, удовлетворяющей определенным условиям. В отличие от метода Locate, она не перемещает указатель текущей записи на найденную запись, а считывает информацию из полей записи. Метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв.

Параметры KeyFields и KeyValues имеют такое же назначение, как и в методе Locate, и используются аналогичным образом.

В параметре ResultFields через точку с запятой перечисляются названия полей, значения которых будут получены в случае успешного поиска. Эти значения считываются из первой найденной записи, удовлетворяющей условиям поиска. Порядок перечисления полей в ResultFields может отличаться от порядка полей в наборе данных.

В случае удачного поиска метод Lookup в качестве результата возвращает значение типа Variant, размерность которого зависит от списка полей ResultFields. Если список содержит одно значение, то метод возвращает значение одного поля, если в списке задано несколько полей, то метод возвращает массив Variant, число элементов которого совпадает с числом полей В списке ResultFields.

При неудачном поиске метод Lookup возвращает вариантный массив, для которого функция VarType возвращает значение varNull.

Пример использования метода Lookup приведен ниже:

void __fastcall TForm1::Button4Click(TObject *Sender)
{
int C;
AnsiString A;
Variant V;
V = Table1->Lookup("Continent;Capital", VarArrayOf(OPENARRAY(Variant, ("South America","Brasilia"))), "Name;Area");
if(!(VarType (V) == varNull))
{
A = V.GetElement(0);
С = V.GetElement(1);
ShowMessage(A + " имеет площадь = "+IntToStr(С) +" кв. км");
}
else
ShowMessage("Search unsuccessful!");
}

В примере поиск ведется по полям континента Continent и столицы Capital, а из найденной записи считываются значения полей названия государства Name и его площади Area. Значение, по которому ищется запись, вводится в редакторе edtFindName. После поиска выполняется анализ егс успешности, и при положительном результате выводится диалоговое окно с данными полей найденной записи. Если запись не найдена, то выводится соответствующее сообщение.

Поделиться