Приложения для работы с локальными базами данных 531

Первый оператор кода очищает список CBdep. Второй — устанавливает кур-
сор таблицы на первую запись. Далее следует цикл по всем записям, пока не до-
стигнута последняя, что проверяется выражением Tablel->Eof. Для каждой запи-
си в список заносится значение поля Dep, после чего методом Next курсор переме-
щается к следующей записи. После окончания цикла индекс списка и курсор таб-
лицы переводятся соответственно на первую строку и запись.

9.11.6 Поиск записей

Одна из важнейших для пользователя операций с базами данных — поиск за-
писей по некоторому ключу. Существует несколько методик поиска записей, кото-
рые можно назвать SetKey, FindKey, Lookup и Locate.

Начнем с методики SetKey. Для ее применения таблица предварительно дол-
жна быть индексирована по тому полю, по которому должен будет проводиться по-
иск. Затем таблица устанавливается в состояние поиска dsSetKey. Для этого испо-
льзуется метод SetKey. В состоянии dsSetKey набор данных воспринимает после-
дующий оператор присваивания значения полю не как присваивание, а как зада-
ние ключа поиска. Поэтому после установки состоянии dsSetKey оператором при-
сваивания устанавливается требуемое значение ключа поиска по интересующему
полю. В заключение методом GotoKey курсор переводится на запись, в которой
значение указанного поля равно ключу. Если таких записей несколько, то курсор
переводится на первую из них. Если соответствующая запись не находится, то ме-
тод GotoKey возвращает false. Для полей типа строк лучше использовать не метод
GotoKey, а метод GotoNearest. Этот метод перемещает курсор на первую запись,
значение поля в которой максимально близко к ключу. Т.е. он сработает и тогда,
когда совпадение не полное. Метод GotoNearest можно применять и к цифровым
полям. В этом случае он переместит курсор на первую запись, значение поля в ко-
торой больше или равно заданному значению ключа.

Например, если вы хотите найти первую запись, в которой год рождения (поле
Year_b) равен заданному пользователем в окне редактирования EYear, вы можете
написать операторы:

Tablel->IndexFieldNames = "Year b";

Tablel->SetKey() ;

Tablel->FieldByName("Year_b")->AsString = EYear->Text;

if (! Tablel->GotoKey())
ShowMessage("Запись не найдена");

Первый оператор индексирует набор данных по полю Year_b, второй перево-
дит набор данных в состояние dsSetKey, третий задает ключ поиска, а четвертый
осуществляет переход к соответствующей записи или сообщает об отсутствии та-
кой записи.

Если вы хотите найти в таблице сотрудника по его фамилии, заданной пользо-
вателем в окне редактирование EFam, вы можете выполнить код:

Tablel->IndexFieldNames = "Fam";

Tablel->SetKey() ;

Tablel->FieldByName("Fam")->AsString = EFam->Text;

Tablel->GotoNearest() ;

Даже если точно такой фамилии не найдется, курсор перейдет на наиболее по-
хожую (совпадающую по первым символам).

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

bool _fastcall FindKey(const System::TVarRec * KeyValues,
const int KeyValues_Size);