572_____________________________________________Глава 10

щем списке CBdep строки «все отделы» и с необходимостью по-разному упорядо-
чивать таблицу при выборе этой и любой другой строки из списка.

Второй вариант заключается в связывании таблиц чисто программно. В этом
случае не надо задавать в Query2 свойство DataSource, а запрос в свойстве SQL
компонента Query2 формируется программно в обработчике события OnChange
компонента CBdep кодом:

String s = "Select * from pers ";

Query2->Close () ;

Query2->SQL->Clear () ;

if (CBdep->ItemIndex == CBdep->Items->Count - 1)
Query2->SQL->Add(s+" order by Fam,Nam,Par");

else
(
Query2->SQL->Add(s+"where Dep = :Dep order by Dep,Fam,Nam,Par");

Query2->ParamByName("Dep")->AsString = CBdep->Text;

)
Query2->0pen() ;

Если в CBdep выбрана последняя строка «все отделы», то формируется за-
прос: «Select * from pers order by Fam,Nam,Par», обеспечивающий упорядочива-
ние записей по алфавиту. А при любом другом выборе в CBdep формируется за-
прос: «Select * from pers where Dep = :Dep order by Dep,Fam,Nam,Par», который
использует отбор по значению параметра Dep. Следующей строкой кода значение
этого параметра — Query2->ParamByName("Dep")->AsString задается равным
тексту в CBdep.

Для того, чтобы это срабатывало в момент открытия приложения, в параметр
SQL компонента Query2 надо записать запрос «Select * from Pers where Dep = :Dep
order by Dep,Fam,Nam,Par» и в обработчик события формы OnCreate вставить опе-
раторы:

Query2->ParamByName("Dep")->AsString = CBdep->Text;

Query2->Active = true;

Таким образом, три компонента Table заменены компонентами Query. Оста-
лись вопросы, связанные с быстрым поиском записи по фамилии с помощью окна
в правом нижнем углу формы. В предыдущем приложении этот поиск при выборе
пользователем всех отделов осуществлялся методом FindNearest, а при просмотре
сотрудников заданного отдела — методом Locate. Но компонент Query не имеет
метода FindNearest. Поэтому в данном случае надо воспользоваться методом Loca-
te, что, впрочем, для компонента Query осуществляется даже проще, чем для Tab-
le: обработка события OnChange окна редактирования, в котором вводятся симво-
лы, сводится к операторам:

TLocateOptions SearchOptions;

Query2->Locate ( "Fam" , Edit l->Text, SearchOptions«loPartialKey«loCa-
selnsensitive);

Эти операторы обеспечивают переход к записи, в которой значение поля Fam
наиболее близко к тексту в окне Editl. Опция loCaselnsensitive обеспечивает по-
иск вне зависимости от регистра, в котором набираются символы, а опция loParti-
alKey обеспечивает переход при неполном совпадении значения поля и введенного
текста.

Это все исправления, которые надо сделать в приложении для режима Отбор.
Но исправления надо сделать и для режима Правка. Вид приложения в этом режи-
ме показан на рис. 10.6.

Загрузка данных в окна редактирования ничем не отличается от того, что
было сделано в приложении с Table (см. раздел 9.12). Код загрузки помещается в
обработчик события OnAfterScroll компонента Query2. А вот реакция на щелчок
кнопки Записать должна быть новой. При записи необходимо выполнить оператор