7. На полосу данных вынести компоненты QRDBText, отображающие значения определённых полей таблицы. Свойство DataSource устанавливает имя источника данных, а свойства DataField — имя выводимого поля.
8. Скорректировать размеры полос и взаимное расположение на них компонент.
Предварительный просмотр на стадии проектирования приложения осуществляется двойным щелчком мыши на объекте QuickRep1.
Макет формы печати данных таблицы stud.dbf и рассчитанной средней оценкипредставлен на рис. 3.
Рис. 3. Внешний вид формы печати
Вывод данных на печать из программы выполняется встроенным в компоненту TQuickRep методом Print.
Например, если имя компоненты TQuickRep - QuickRep1, то оператор
Form2.QuickRep1.Print;
выведет данные на печать, а
Form2:=TForm2.Create(Self);
Form2.QuickRep1.Preview;
Form2.Free;
осуществит предварительный просмотр на экране.
Необходимо предусмотреть в программе вывод в отчёт расчётных значений с использованием компоненты QRLabel.
При предварительном просмотре или выводе на печать данные будут отображены в следующем виде (рис. 4).
Рис. 4. Данные таблицы stud.dbf при предварительном просмотре
Пример реализации программы расчёта средней оценки
Постановка задачи: необходимо организовать хранение информации о студентах: № зачётной книжки, шифр группы, ФИО, год рождения, пол, предмет, среднюю оценку по предмету. Обеспечить расчёт средней оценки для любого студента.
А. Создадим таблицу соответствующей структуры и Windows-приложение для работы с БД (см. методические указанияк лабораторной работе №1).
B. Вынесем на макет формы приложения компоненту Edit с именем Edit1, компоненту Label с именем Label1 и компоненту Button с именем Button1 (см. рис. 1). Настроим свойства этих компонент в соответствии с табл. 1. Создадим обработчик события Click для компоненты Button1 и напишем в обработчике следующий код:
Var
soz : real;
n : integer;
buf : string[50];
begin
soz:=0;
n:=0;
Table1.First;
While not Table1.EOF do begin
/* проверка совпадения поля FAM и текста в Edit1*/
if (Table1[‘FAM’] = Editl.Text) then begin
soz:=soz+Table1[‘OZ’];
n:=n+1;
end;
Table1.Next;
End;
If (n<>0) then soz:=soz/n;
buf:="Средняяоценка:”+FloatToStr(soz);
Label1.Caption := buf;
QRLabel10.Caption := buf;
End;
C. Создадим вторую форму выбором меню File->New. Вынесем на форму компоненту QuickRep из вкладки QReport.. Вынесем на форму отчёта три компоненты QRBand (со свойствами BandTyperbTitle, rbDetailи rbSummary). На заголовочную полосу вынесем компоненты QRLabelи настроим свойство Caption для отображения названия отчёта и столбцов. На полосу данных вынесем компоненты QRDBText и настроим их на связь с соответствующими полями. На последнюю полосу вынесем компоненту QRLabelc именем QRLabel10. Внешний вид и расположение компонент соответствует рис. 3. Просмотр отчёта организуем добавлением компоненты Button2 и обработчиком события Click следующего содержания:
Form2:=TForm2.Create(Self);
Form2.QuickRep1.Preview;
Form2.Free;
После компиляции проекта необходимо проверить правильность работы программы.
ЛАБОРАТОРНАЯ РАБОТА №3
ОБРАБОТКА ИНФОРМАЦИИ БАЗЫ ДАННЫХ, ИМЕЮЩЕЙ СТРУКТУРУ «master-detail». ИЗУЧЕНИЕ ОСНОВ SQL.
Основные сведения о ссылочной целостности. Задание индексов.
Для выполнения задания, необходимо сформировать в DatabaseDesktop (DBD) структуры 2-х таблиц типа Paradox7, между которыми будет организована связь «один-ко-многим».
Рис. 1 Структура основной и подчиненной таблиц в Paradox7.Данные структур сохраним в папке WorkDir с именами stud.db и ozen.db.
Ссылочная целостность обеспечивает однозначное соответствие значений в поле одной таблицы значениям связанного поля в другой. Кроме обеспечения равенства значений в связанных полях при вводе, ссылочная целостность обеспечивает сохранение этого условия при внесении изменений в связанные поля подчиненной таблицы, отображая их в основной. В Paradox она также запрещает удаление записей в основной таблице, если они используют данные из подчиненной таблицы.
Итак, в организации ссылочной целостности присутствуют 2 таблицы, одна из них содержит данные (подчиненная), другая использует эти данные (основная). Осуществляется она через поля основной и подчиненной таблиц. При этом в основной таблице можно использовать только ключевые поля, а в подчиненной – индексированные, причем выбранные для связи поля автоматически становятся индексированными. Из основной таблицы можно организовывать связь с несколькими подчиненными.
Для организации связи 2-х таблиц с помощью DataDesktop в окне задания структуры, когда в нем находится структура подчиненной таблицы (в нашем случае, ozen.db), следует у списка Tableproperties (характеристики таблицы) выбрать значение ReferentialIntegrity (ссылочная целостность), после чего определить Define связь. В открывшемся окне задаем характеристики связи таблиц, выбрав в левом окне поле для организации связи, в правом – имя требуемой таблицы (двойным щелчком мыши). Естественно, что количество выбранных полей из каждой таблицы и их типы должны совпадать.
Рис. 2 Связь подчиненной и основной таблицы по ключевым полям.
Здесь же можно задать характеристики связи: 1) правило обновления (updaterule) – для определения варианта обновления значений в подчиненной таблице при изменении или удалении связанных значений в основной (каскадный, запрещенный); 2) выключатель защиты целостности (strictreferentialintegrity) – для определения невозможности изменения данных в таблицах, для которых установлена ссылочная целостность. После определения параметров связи задаем имя связи.
Идентифицируем параметры всех связей основной таблицы:
Теперь зададим вторичные индексы. Данная операция используется для ускорения поиска в таблицах необходимой информации по значениям в конкретных полях. Индексирование в Paradox приводит к созданию специальных файлов по каждому индексу, такой файл содержит записи, включающие значения индекса (одно или несколько полей) и указатель на соответствующую запись в таблице. Выбрав нужное значение индекса, можно затем по указателю найти и саму запись.
Для задания вторичных индексов с помощью DBD, следует у списка Tableproperties (характеристики таблицы) выбрать значение SecondaryIndexes (вторичные индексы), после чего определить Defineполя, используемые в индексе, их последовательность (!!!) и ряд характеристик: 1) уникальность (unique); 2) режим обновления (maintained); 3) чувствительность к регистру (casesensitive); 4) порядок сортировки (descending). По завершению формирования индекса задаем имя индекса.
Предварительно сформируем таблицу, в которой перечислим все индексы и их характерные особенности:
Имя индекса | Поля | Unique | Maintained | Case sensitive | Descending |
ind | Naim | Ö | |||
Zach | Zach Oz | Ö |
Отметим, что для задания каждого индекса следует выполнять всю последовательность выше указанных действий. Нельзя, например, переместить все поля, используемые в индексах, в правый список, а затем выполнить оставшиеся действия, так как в этом случае будет создан 1 индекс сразу по всем выделенным полям.
Рис. 3 Задание вторичного индекса.
3. Задание псевдонимов в BDEAdministrator.
Располагать все таблицы БД, а также программы СУБД желательно в отдельной папке, которой к тому же следует задать псевдоним для более простого обращения к данным (до сих пор псевдонимы нами не были использованы).
Для задания псевдонима можно воспользоваться утилитой BDEAdministrator, поставляемую в составе большинства продуктов корпорации Inprise (Borland). Утилита BDEAdministrator находится в меню "Пуск"Прогpaммы -> Borland Delphi -> BDE Administrator.
В левой части окна следует открыть страницу Databases, содержащую список псевдонимов, в правой части появятся его характеристики.Рис. 4. Окно BDE.
Для добавления псевдонима задаем либо Object.New, либо по правой кнопке мыши в дополнительном меню выбираем New. Из списка драйверов выбираем значение Standard, используемое для создания псевдонима БД в формате Paradox.
Изменив имя псевдонима, рассмотрим набор его характеристик: 1) type – название драйвера, на основе которого был создан псевдоним, 2) defaultdriver – название драйвера, который подключается к файлу БД первым, 3) enablebcd – признак перевода значений десятичных полей в двоично-десятичное представление, 4) path – путь к папке, где находятся таблицы БД.
4. Установка связей между компонентами и БД. Создание меню.
Теперь разместив на форме диалога компонент Menu с палитры компонентов Стандарт, сформируем простое меню, задавая названия пунктов меню свойству Items. Для Поиск – подменю: SQL и фильтрация, для Сортировка – по фамилии, по наименованию дисциплин и пункт Выход. Обратите внимание на порядок задания имен, в свойстве Name каждого пункта будет отображен этот номер.
Модуль пункта меню Выход будет самым информативным: Close();