Подключение данных к визуальным компонентам

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

Нам потребуются невизуальные компоненты 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 Результат работы с полями – справочник Аэропорт