Подключение данных к визуальным компонентам
Теперь к размещенным не форме визуальным компонентам будем подключать данные. Так мы имеем дело с реляционной базой данных, в качестве данных могут выступать только результаты запросов к нашим таблицам.
Нам потребуются невизуальные компоненты IBQuery со вкладки Interbase и компонент IBSource со вкладки Data Access, которые мы будем размещать непосредственно на форме «Справочники» (FormRef). Для каждого справочника потребуется свой собственный запрос IBQuery, которые мы разместим на форме и дадим им осмысленные имена. Для имен будем использовать префиксы полей соответствующих таблиц базы данных, такой способ улучшает читаемость программы и уменьшает вероятность ошибки.
Так как нам потребуется редактирование справочников, с каждым компонентом запроса IBQuery нужно использовать компонент IBUpdateSQL. Разместим компоненты IBUpdateSQL рядом с сопряженными с ними компонентами доступа к данным и дадим им имена аналогично IBQuery.
Приведем полученные названия компонент
Наименование справочника | Компонент доступа к данным (IBQuery) | Компонент модификации данных (IBUpdateSQL) |
Аэропорт | IBQueryAP | IBUpdateSQLAP |
Авиакомпания | IBQueryAС | IBUpdateSQLAС |
Город | IBQueryСT | IBUpdateSQLCT |
Роль члена экипажа | IBQueryRNC | IBUpdateSQLRNC |
Тип Самолета | IBQueryPL | IBUpdateSQLPL |
Тип Салона | IBQuerySL | IBUpdateSQLSL |
Кроме этих компонент на форме нужно разместить компонент источника данных DataSource (см. рис. 16)
Рисунок 16 Размещение компонент доступа к данным на форме
Теперь нужно настроить свойства у всех размещенных компонентов.
Для всех компонентов доступа данных IBQuery по очереди активизируем редактор свойств и редактируем следующие свойства (показываем на примере IBQueryAP):
1. Устанавливаем соединение с базой данных – компонентом TiBDatabase находящемся на форме DataModule. Для этого используют свойство Database
Database = DataModule1.IBDatabase
2. Задаем текст запроса. Для этого используется свойство SQL
SQL = 'select * from AIRPORT'
3. Для обеспечения возможности редактирования справочника все компоненты IBQuery должны быть связаны с соответствующими IBUpdateSQL (каждый со своим). Для этой связи используем свойство UpdateObject
UpdateObject = IBUpdateSQLAP
Покажем окно редактора свойств инспектора объектов для IBQueryAP (рис. 17).
Рисунок 17 Свойства IBQueryAP
Следующим шагом необходимо настроить все компоненты IBUpdateSQL, для этого нужно щелкнуть на соответствующем компоненте. В появившемся окне нужно выделить поля входящие в первичный ключ (для справочника AIRPORT это поле AP_CODE) и поля, которые пользователь желает редактировать. После этого нужно нажать на кнопку «Generate SQL», в результате будут сгенерированы запросы для модификации, вставки, удаления записи. Эти запросы можно увидеть на закладке SQL и при необходимости модифицировать их вручную (рис .18).
Рисунок 18 Настройка компонента IBUpdateSQLAP
Последним шагом настройки должно стать связывание визуальных компонент решетки и навигатора с компонентом представляющим источник данных TDataSource. Для этого у этих обоих визуальных компонентов нужно установить свойство DataSource
DataSource = DataSource1
Чтобы выстроить полную цепочку от компонентов доступа к данным до компонентов их отображения осталось связать компоненты IBQuery и DataSource. Так как нам нужно работать со всеми справочниками через одну и ту же решетку и использовать один навигатор, связь между каждым из IBQuery и DataSource будем осуществлять программным путем. Эта связь осуществляется путем присваивания свойству DataSet компонента DataSource ссылки на один из компонентов доступа к данных (IBQueryAP, IBQueryAС, IBQueryСT, IBQueryRNC, IBQueryPL, IBQuerySL).
Присваивание этой ссылки свяжем с событием OnClick для размещенной на форме группе зависимых переключателей (RadioGroup) , таким образом, выбор переключателя приведет к выполнению следующего кода.
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0: DataSource.DataSet := IBQueryAP;
1: DataSource.DataSet := IBQueryAC;
2: DataSource.DataSet := IBQueryCT;
3: DataSource.DataSet := IBQueryRNC;
4: DataSource.DataSet := IBQueryPL;
5: DataSource.DataSet := IBQuerySL;
end;
DataSource.DataSet.Open; //открываем используемый запрос
end;
Работа с полями
Теперь осталось вывести содержимое справочников в «красивом» виде, для этого нужно создать поля для каждого запроса в явном виде и настроить их свойства, заголовки полей (DisplayLabel). Сделаем двойной щелчок на каждом из компонентов запросов и в появившемся окне при помощи левой клавиши мыши вызовем контекстное меню (рис. 19).
Рисунок 19 Добавление всей полей в IBQuery
Добавим все поля (Add all fields). В появившемся списке полей выбираем нужное поле и меняем его свойства, в частности даем полям осмысленные, русскоязычные названия.
Особо обратим внимание на поле AIRPORT.AP_CT_CODE в запросе IBQueryAP. Дело в том, что код города в справочнике Аэропорт несет мало информации для пользователя – для пользователя имеет значение название города, а не его код. Название города можно получить из запроса IBQueryCT, для связи воспользуемся полем синхронного просмотра (Lookup полем).
Для создания нового Lookup поля в контекстном меню для добавления или создания полей нужно выбрать пункт New Field (Новое поле). В результате получим диалоговое окно для задания свойств нового поля (рис. 20).
Рисунок 20 |
Рисунок 20 Задание свойств для поля синхронного просмотра «Название города»
В переключателе Field Type выбираем тип поля Lookup, задаем имя поля CITY_NAME, тип - String и размер поля - 20 .
В рамке Lookup definition (определение связного поля) укажем ключевое поле - AP_CT_CODE, связываемый набор данных – IBQueryCT, ключ для связи - CT_CODE (обычно это внешний ключ в связываемом наборе данных), результирующее поле - CT_NAME. После этого устанавливаем свойство заголовка поля (DisplayLabel). Так как поле AP_CT_CODE не нужно показывать пользователю, установим свойство Visible – False. Результат показан на рисунке 21.
Рисунок 21 Результат работы с полями – справочник Аэропорт