Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоуровневые методы информатики и программир...docx
Скачиваний:
25
Добавлен:
12.11.2019
Размер:
6.53 Mб
Скачать

3.11.4. Отчет из нескольких таблиц с группировкой данных и итогами

Рассмотрим порядок создания сложных отчетов на примере создания отчета «Итоги Олимпиады». База зарегистрирована под псевдонимом (алиасой) «Olimpiada» при помощи BDE Administrator.

База данных в формате Paradox создана средствами Database Desktop и состоит из четырех таблиц:

  1. «Страны» (Strani.db) с полями: KS (код страны), NS (название страны).

  2. «Виды спорта» (Vidi_Sporta.db) с полями: KVS (код вида спорта), NVS (название вида спорта).

  3. «Спортсмены» (Sportsmeni.db) с полями: RN (индивидуальный регистра­цион­ный номер), Fam (фамилия).

  4. «Призеры» (Prizeri.db) с полями: KS (код страны), KVS (код вида спорта), RN (индивидуальный регистрационный номер), Z (число золотых медалей), S (число серебряных медалей), B (число бронзовых медалей).

На этапе создания базы данных связи между таблицами не формируются. Рассмотрим шаги по формированию отчета.

  1. В Delphi 7 создадим новый проект и модуль данных командой File/New/Data Module (рис. 3.11.4.1).

Рис. 3.11.4.1. Окно модуля данных

На главной форме разместим две кнопки: для вызова отчета и для выхода из приложения. Добавим на форму модуля данных компонент Query. Для этого компонента создадим запрос командой SQL Builder из контекстного меню. В поле Database выберем базу данных «Olimpiada», перенесем в запрос таблицы «Призеры» (Prizeri.db), «Страны» (Strani.db), «Виды спорта» (Vidi_Sporta.db), «Спортсмены» (Sportsmeni.db). Свяжем таблицы (рис. 3.11.4.2). Результат запроса будет отображать поля NS (название страны) и NVS (название вида спорта) вместо их кодов и поле Fam (фамилию участника) вместо его регистрационного номера.

Рис. 3.11.4.2. Окно Построителя запросов

  1. Командой File/Use Unit подключим модуль данных к главной форме.

  2. Разместим на форме модуля данных компоненты RvProject, RvSystem и RvQueryConnection со страницы Rave (рис. 3.11.4.1). Свойство Engine компонента RvProject1 установим равным RvSystem1. Свяжем компонент RvQueryConnection1 с запросом Query1 (свойство Query). Двойным щелчком на компоненте RvProject1 вызовем конструктор отчетов Rave Reports 5.0 (рис. 3.11.2.1).

  3. Введем в проект объект просмотра данных. Для этого выполним команду File/New Data Object. Откроется окно выбора типа объекта. Выберем Direct Data View и нажмем кнопку Next. Появится диалоговое окно Data Connections со списком объектов доступа к данным. Выделим компонент RvQueryConnection1, щелкнем на кнопке Finish. В дереве объектов, в правой части окна конструктора, в вершине Data View Dictionary появятся источники данных DataView.

  4. Расположим компонент Region (со страницы Report) на всей площади страницы, оставив сверху место для заголовка отчета и заголовков столбцов.

  5. Разместим в компоненте Region1 шесть информационных полос: сначала две обычных полосы Band, затем - одну полосу данных DataBand, затем снова три обычных полосы Band (рис. 3.11.2.1). В полосе данных Band1 будет размещаться название страны. В полосу Band2 будет выводиться название вида спорта. Полоса DataBand1 служит для вывода фамилий призеров, а также числа золотых, серебряных и бронзовых медалей у каждого из них. Обычная полоса Band3 будет содержать итоговые данные (количество медалей разного достоинства) по виду спорта, Band4 – по каждой стране. В полосу Band5 будут выводиться итоги по отчету.

  6. Расположим в полосе Band1 компонент DataText со свойствами DataView=DataView1, DataField=NS. В свойстве ControllerBand этой по­ло­сы выберем DataBand1 (мы указали, что эта полоса будет управляться полосой DataBand1). Свойства GroupDataView=DataView1, GroupKey=NS. Установим свойство BandStyle, редактор которого вызывается кнопкой с многоточием. В диалоговом окне Band Style Editor установим флажок напротив значения Group Header.

  7. В полосе под именем Band2 будут выводиться названия видов спорта. Установим свойство BandStyle= Group Header для этой полосы. Группировка данных в этой полосе будет производиться по полю NVS источника данных DataView1 (GroupDataView=DataView1, Group­Key=NVS). Разместим в полосе компонент DataText под именем DataText2 со свойствами: DataView=DataView1, DataField=NVS.

  8. В полосе DataBand1 будут выводиться имена медалистов и число золотых, серебряных и бронзовых медалей у каждого из них. Свяжем полосу с просмотром данных DataView1. В свойстве BandStyle отметим пункт Detail. Теперь разместим в этой полосе четыре компонента DataText, свяжем их с источником данных DataView1, один из них – с полем Fam, три других – с полями Z, S, B соответственно.

  9. Полоса Band3 содержит итоговые данные по виду спорта. Свойства этой полосы: ControllerBand=DataBand1, BandStyle=Group Footer, GroupDataView=DataView1, Group­Key=NVS. Разместим в этой полосе компонент Text со страницы Standard c текстом «Итого медалей по виду спорта». Добавим на эту полосу три компонента CalcText (панель Report) со свойствами: Controller=DataBand1; CalcType=ctSum, DataField равно Z, S или B соответственно.

  10. Полоса Band4 содержит итоговые данные по стране и имеет свойства: ControllerBand=DataBand1, BandStyle=Group Footer, GroupData­View=DataView1, Group­Key=NS. Разместим в этой полосе компонент Text с текстом «Итого медалей по стране». Аналогично предыдущему пункту добавим на эту полосу три компонента CalcText со свойствами Controller=DataBand1; CalcType=ctSum, DataField равно Z, S или B

  11. В полосе Band5 расположим компонент Text с текстом «Итого медалей разыграно». Рядом расположим три компонента CalcText. Их свойства установим такими же, что и в предыдущем пункте. Свойство BandStyle этой полосы нужно установить в Body Footer.

  12. Создадим заголовок отчета. Перенесем на форму компонент Text, разместим его над компонентом Region. Внесем в него текст «Итоги Олимпиады». Чуть ниже расположим два компонента DataText. В свойство DataField одного из этих компонентов укажем Report.DateShort. В свойство DataField другого компонента внесем строку: 'Лист ' +Report.CurrentPage. Это даст нам возможность отобразить в отчете сегодняшнюю дату и номер текущего листа. Над компонентом Region разместим четыре компонента Text, занесем в них заголовки колонок отчета (Призер, Золото, Серебро, Бронза).

  13. Отформатируем отчет (установим нужные свойства шрифтов, добавим линию, отделяющую заголовки колонок отчета, выровняем компоненты в полосах). Разработка отчета завершена, его можно запустить в окне предварительного просмотра (кнопка Execute Report) и распечатать (рис. 3.11.4.3). Отчет сохраним в папке проекта под именем Project1.

Рис. 3.11.4.3. Вид отчета на бумаге

  1. Вернемся в Delphi. В свойстве ProjectFile компонента RvProject1 укажем имя файла проекта Rave, под которым мы сохранили наш отчет. Зададим FormState=wsMaximized и, при необходимости, другие значения свойствам предварительного просмотра и печати отчетов.

  2. В обработчик события OnClick кнопки Отчет добавим следующие операторы:

DataModule1.RvProject1.Open;

try

DataModule1.RvProject1.Execute;

finally

DataModule1.RvProject1.Close;

end;

В обработчик события OnDestroy формы Form1 добавим оператор:

DataModule1.RvProject1.Close;

Это обеспечит удаление отчета из памяти, если отчет запускался при выполнении приложения.

В обработчик события кнопки Выход добавим оператор Close.

Создание приложения завершено. Откомпилируем и сохраним его.