Закрывать каждый запрос при завершении нет необходимости, все запросы закрываются автоматически методом CloseDatasets компонента Database.
Поскольку мы изменили структуру таблицы dvd.db, об этом надо сообщить нашей программе. Проверьте, что в компоненте Database в поле AliasName записано имя алиаса DVD, иначе Delphi не сможет открыть базу. Щелкните правой кнопкой мыши на запросе DVD и выберите пункты меню Fields Editor à Add fields. В открывшемся списке появится новое поле COMPANY. Щелкните по кнопке OK для его добавления. Аналогично добавьте поля в запросе comp.
Приступаем к самому важному – связыванию главной и подчиненной таблиц. Принцип связывания таков: в главной таблице создается фиктивное поле, которого в самой таблице нет. В это фиктивное поле программа автоматически заносит значения, извлекаемые из подчиненной таблицы. Снова щелкните правой кнопкой мыши на запросе DVD и выберите пункты меню Fields Editor à New field. Открывается окно добавления фиктивного поля (Рис. 28.2) – самое важное окно во всей работе с БД
Рис. 32.2 Окно создания фиктивного поля.
В поле NAME введите придуманное имя фиктивного поля, которое не должно совпадать с именами настоящих полей в главной таблице. Можно, чтобы не запутаться, всегда начинать имена фиктивных полей с буквы V – виртуальное. В списке Type выберите тип данных, которые будут отображаться в фиктивном поле, а в поле Size введите размер этих данных. Очевидно, тип и размер фиктивного поля должны совпадать с типом и размером поля с данными в подчиненной таблице, в рассматриваемом случае это поле Name в таблице comp.db. Установите переключатель в положение Lookup – это означает, что данные в новом поле будут браться из другой таблицы.
А теперь самое важное: правильно заполнить четыре списка внизу окна:
Key Fields: имя поля в главной таблице, в котором хранятся ссылки на подчиненную таблицу. В данном случае это поле Company.
Dataset: имя подчиненной таблицы. Запрос к таблице comp.db у нас называется comp.
Lookup Keys: имя автоинкрементного поля в подчиненной таблице. В данном случае это поле ID таблицы comp.db.
Result field: имя поля в подчиненной таблице, где хранятся данные, отображаемые в фиктивном поле главной таблицы. В данном случае это поле name в базе comp.
Новое поле нужно вывести на экран. перейдите на главную форму и уже известным способом добавьте в компоненте DBGrid новую колонку, связанную с полем VCOMP. Измените обработчик события OnRezise – в таблице стало на одну колонку больше и надо поменять код на примерно следующий:
procedure TForm1.FormResize(Sender: TObject);
CONST w:ARRAY[0..5] OF REAL=(0.25,0.25,0.1,0.1,0.1,0.2);
Все! Запускаем программу и видим очень интересный результат (Рис. 28.3).
Рис. 32.3 Отображение фиктивного поля.
Мало того, что все работает правильно, так еще в фиктивном поле автоматически появляется раскрывающийся список для его удобного редактирования.
Помимо фиктивных полей, данные для которых берутся из другой таблицы, можно создать так называемое вычисляемое фиктивное поле, значение которого рассчитывается в самой программе. Например, в нашей программе некрасиво отображается поле SUBTITLES (наличие субтитров) – мы видим в нем значения 0 и 1 вместо "есть" и "нет". Заводить отдельную таблицу ради всего двух значений не хочется.
Выполните следующие действия: щелкните правой кнопкой мыши на запросе DVD в модуле данных и выберите пункты меню Fields Editor à New field. Открывается уже известное вам окно добавления фиктивного поля. Заполните его, как показано на Рис. 28.4.
Рис. 32.4 Добавление вычисляемого поля.
В запрос DVD добавлено фиктивное полеVTITLE типа String длиной 10 символов, значения в которое будет заносить сама программа. Каким образом? Выполняя обработчик события OnCalcFields запроса DVD. В этом обработчике напишите следующий код: