Мегаобучалка Главная | О нас | Обратная связь


Использование дополнительных возможностей



2016-09-16 360 Обсуждений (0)
Использование дополнительных возможностей 0.00 из 5.00 0 оценок




Для навигации по таблице можно использовать также компоненту DBNavigator со страницы Data Controls(рис. 31), связав ее с необходимой компонентой TDataSource (свойство DataSource).

Рис. 31. Использование компоненты DBNavigator.

Покажем на примере формы учеников использование компоненты TDBCtrlGrid для отображения данных. Для работы с компонентом необходимо поместить его на форму, связать с компонентой TDataSource, связанной с НД, и затем разместить на нем необходимые компоненты для работы с полями БД - TDBEdit, TDBComboBox и т.п. Разметим в верхней ячейке один экземпляр компоненты TDBComboBox, свойство DataField которого установим равным CL (из выпадающего списка), два экземпляра компоненты TDBEdit, связав первый с полем FIO_PUPIL, второе - с BALL. Также поместим метки Label - подписи к полям (рис. 32 справа).

Во время выполнения приложения расположение компонентов в верхней строке (ячейке) TBDCtrlGrid и их состав будет реплицирован на все оставшиеся строки (ячейки), как это видно на рис. 32 слева.

Рис. 32. Использование компоненты TDBCtrlGrid

Покажем, как можно реализовать уточняющий поиск данных в таблице на примере данных об учителях. В форму FTeacher поместим обычный Editи очистим ее свойство Text. Событие OnChange, возникающее при изменении текста в этой компоненте, свяжем со следующим кодом:

 

procedure TFTeacher.Edit1Change(Sender: TObject);

begin

DM.IBDSTeacher.Locate('FIO_TEACHER',Edit1.Text,[loPartialKey]);

end;

 

Следует подключить модуль DB (в предложении uses).

Здесь методLocate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена, делает ее текущей. В этом случае в качестве результата возвращается True. Если запись не найдена, возвращается False. Список KeyFields указывает поле или несколько полей, по которым ведется поиск. В случае нескольких поисковых полей их названия разделяются точкой с запятой. Критерии поиска задаются в вариантном массиве KeyValues так, что i-е значение в KeyValues ставится в соответствие i-тому полю в KeyFields. Options позволяет указать режим поиска: loCaseInsentive - поиск ведется без учета высоты букв; loPartialKey - запись считается, удовлетворяющей условию поиска, если она содержит часть поискового контекста.

При использовании такого механизма необязательно вводить фамилию учителя полностью. Курсор НД будет приближаться к искомой записи по мере ввода символов в Edit1(рис. 33).

Рис. 33. Использование механизма уточняющего поиска

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

Построение отчетов

В для работы со страницей QReport в Delphi 7 следует инсталлировать пакет dclqrt70.bpl (component/install package, кнопка Add – выбрать указанный пакет из каталога BIN Delphi 7).

Нам требуется создать следующие выходные документы:

1) Список отличников школы с указанием их процента в каждом классе.

2) Суммарную нагрузку учителей с подсчетом общей нагрузки по школе.

3) Подсчитать процент учеников в выбранном классе от общего количества учеников в школе.

Для выполнения двух первых отчетов откроем модуль данных DM и добавим в него два экземпляра компоненты TIBQuery(запросы). Первую назовем IBQOtl, вторую IBQSumNagr. IBQOtl будет вызывать созданный ранее просмотр (представление) BEST_PUPIL(ученики-отличники), IBQSumNagr - TOTAL_NAGR(суммарная нагрузка учителей).

Свойство Database данных компонент установим равным IBDBShool (из выпадающего списка), свойство Transaction - IBTransaction1.

Свойство SQL компоненты IBQOtl должно содержать оператор Select для выбора полей из просмотра BEST_PUPIL:

 

SELECT NUM_CLASS,NAMECLASS,FIO_PUPIL,BALL

FROM BEST_PUPIL

ORDER BY NAMECLASS

 

Свойство SQL компоненты IBQSumNagr должно содержать оператор Select для выбора полей из хранимой процедуры TOTAL_NAGR:

 

SELECT FIO,SUMNAGR FROM TOTAL_NAGR

ORDER BY FIO

 

Для подсчета процента отличников в каждом классе (первый запрос) добавим компоненту TIBStoredProc (назовем ее IBStoredP_Best), свойство Database установим равным IBDBShool, свойство Transaction - IBTransaction1. В свойство StoredProcName следует выбрать из выпадающего списка имя хранимой на сервере процедуры, возвращающей процент отличников (PROCENT_OTL). Процедура PROCENT_OTL содержит два параметра (свойство Param, доступное при активном компоненте IBTransaction1 и IBDBSchool): входной CL (имя класса; будет задаваться программно) и выходной PROC (процент отличников в классе).

Для подсчета процента учеников в выбранном классе от общего количества учеников в школе на сервере создана процедура PROC_PUPIL. Добавим в модуль данных еще один экземпляр компоненты TIBStoredProc(назовем ее IBStoredProcP, свойствоName). Остальные свойства настраиваются аналогично ранее настроенной компоненте IBStoredP_Best. Свойство StoredProcNameустанавливается равнымPROC_PUPIL.

К этому моменту модуль данных примет следующий вид (рис. 34):

Рис. 34. Модуль данных.

Создадим новую форму, назовем ее FReport1. Проектирование отчета аналогично работе с локальной базой данных. Прежде всего, поместим на созданную форму экземпляр компоненты TQuickRep со страницы QReport и через свойство DataSetсвяжем ее с нужным запросом. Для выходного документа, связанного с информацией об отличниках классов с выдачей среднего балла каждого класса, воспользуемся созданным ранее запросом IBQOtl, который вызывает хранимую процедуру выбора.

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

Компонента QuickRepимеет ряд свойств. Свойство Bandsсостоит из множества логических значений, которые определяют присутствие или отсутствие в отчете отдельных составляющих:

HasColumnHeader – заголовка столбцов

HasDetail – детальной информации

HasPageFooter – заключительной части страницы

HasPageHeader – заголовка страницы

HasSummary – заключительной части отчета

HasTitle – заголовка отчета

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

Пункт меню главной формы Отличники свяжем с вызовом новой формой FReport1,на которой будем выводить отчет. Поставим в соответствие этому пункту следующие действия:

 

procedure TMain.N8Click(Sender: TObject);

begin

DM.IBQOtl.Open;//Открываем запрос

FReport1.QuickRep1.Preview;//Отображаем отчет

end;

 

Метод Previewкомпоненты TQuickRep выводит отчет в окно предварительного просмотра. Метод Printпечатает отчет на принтере.

После просмотра отчета, следует закрыть запрос. Для этого свяжем событие AfterPreview отчета QuickRep1 со следующим кодом:

 

procedure TFReport1.QuickRep1AfterPreview(Sender: TObject);

begin

DM.IBQOtl.Close;//Закрываем запрос

end;

 

Компоненты TQRBand являются основными составными частями отчета и используются для размещения в них визуальных компонент, таких как TQRLabel, TQRDBText, TQRExpr, TQRGroup и др.

Для отображения в разделах отчета полей на них помещаются экземпляры компоненты QRLabel(статическое поле) с определением свойства Captionи QRDBText(поле НД). Для последней определяются свойства DataSet(имя запроса, формирующего НД) и DataField(имя поля НД).

Вместо компоненты QRDBTextможно размещать компоненту QRExpr(выражение из полей НД) и определять его свойство Expression.

В заключительной части группы можно размещать выражения, содержащие итоговые (агрегатные) функции.

 

Итак, после размещения на форму компоненты QuickRep включим (положим равными True) следующие подсвойства в групповом свойстве Bands: HasColumnHeader, HasDetailи HasTitle (рис. 35):

Рис. 35. Свойства отчета

Так как в отчете требуется группировка учеников по классам, добавим в отчет по экземпляру компонент QRGroup и QRBand. Свойство BandType последней полагается равным rbGroupFooter, а свойство FooterBand компоненты QRGroupвыбирается равным имени заключительной компоненты этой группы (в нашем случае QRBand1). Отчет примет вид, подобный примеру, изображенному на рис. 36.

Рис. 36. Состав отчета с группировкой данных.

Свойство Expression области GroupHeader, при изменении которого выводится заголовок группы, установим равным IBQOtl.NUM_CLASS (для этого можно воспользоваться построителем выражения). Поскольку свойство Expression не визуализирует значения выражения, необходимо разместить в группе Group Header компоненту QRDBText и определить значение ее свойства DataSetравным DM.IBQOtl, а свойства DataField - NAMECLASS.

Поместим заголовок отчета в область Title. Для этого воспользуемся компонентой QRLabel, в свойстве Caption которой введем «Лучшие ученики школы».

В области Group Header размещаются заголовки столбцов. Разместим здесь компоненты QRLabel c текстом «ФИО» и "Средний балл" соответственно.

В области детальной информации Detail разместим два экземпляра компоненты TQRDBText под соответствующими компонентами QRLabel. Их свойство DataSet установим равным DM.IBQOtl, а в качестве значения свойства DataField выберем FIO_pupil и Ball соответственно.

В подвале группы Group Footer разметим два экземпляра компоненты QRLabel.Текст первой - «Процент отличников в классе: ". Текст второй будет формироваться при печати подвала группы. Для этого выделим область подвала Group Footer, найдем событие BeforePrint и в его обработчик вставим код, в котором осуществим выполнение хранимой процедуры IBStoredP_Best, предварительно задав значение входному параметру CL:

 

procedure TFReport1.QRBand1BeforePrint

(Sender: TQRCustomBand; var PrintBand: Boolean);

var p:real;

s:string;

begin

DM.IBStoredP_Best.UnPrepare;

//Устанавливаем входной параметр CL хранимой процедуры

DM.IBStoredP_Best.ParamByName('cl').value:=

DM.IBQOtl.FieldValues['num_class'];

DM.IBStoredP_Best.Prepare; //Подготовка к выполнению

DM.IBStoredP_Best.ExecProc; //Выполнение процедуры

//Запоминаем значение выходного параметра процедуры

p:=DM.IBStoredP_Best.ParamByName('proc').Value;

str(p:6:2,s); //преобразуем его в строку

QRLabel5.Caption:=s; //помещаем в текст QRLabel5

end;

 

Компонент IBStoredProc также можно использовать для вызова хранимых процедур выбора.

 

Отчет на этапе проектирования примет следующий вид (рис. 37):

Рис. 37. Отчет на этапе проектирования

Если для каждой группы необходимо подсчитать агрегатную функцию (например, среднее или сумму), то в область Group Footer помещается экземпляр компоненты QRExpr, для которой соответствующим образом настраивается свойство Expression. Для сброса значения предыдущей группы (чтобы итоговое значение подсчитывалось по каждой группе, а не накапливался по всем группам) следует у компоненты QRExpr установить равным True свойство ResetAfterPrint.

После запуска приложения и открытия отчета получим экран вида (рис. 38):

Рис. 38. Отчет на этапе выполнения приложения.

Рассмотрим создание второго отчета. Для выдачи документа, отображающего суммарную нагрузку учителей, создадим новую форму FReport2, в которую поместим компоненту TQuickRep, свойство DataSet которой установим равным DM.IBQSumNagr.

Далее разметим дополнительные компоненты и настроим их так, как показано на следующем рисунке (рис. 39):

Рис. 39. Конструирование отчета о суммарной нагрузке

В свойство Expression компоненты QRExp, помещенной в область Summary (итоги), с помощью построителя выражения или вручную установим функцию подсчета суммы значения поля SUMNAGR: SUM(IBQSumNagr.SUMNAGR). Пункт меню главной формы Суммарная нагрузка учителей свяжем с новой формой FReport2,на которой будем выводить отчет. Поставим в соответствие этому пункту следующие действия:

 

procedure TMain.N9Click(Sender: TObject);

begin

DM.IBQSumNagr.Open;//Открываем запрос

FReport2.QuickRep1.Preview;//Отображаем отчет

end;

 

В обработчике события AfterPreview отчета закроем запрос:

 

DM.IBQSumNagr.Close;

 

Вид отчета, отображающего информацию о нагрузке выбранного учителя по каждому предмету с подсчетом суммарной нагрузки, показан ниже (рис. 40):

Рис. 40. Суммарная нагрузка учителей

Для реализации последнего (третьего) запроса нам потребуется создание еще одной формы(назовем ее FProc), на которую поместим экземпляры компонент TComboBox(выпадающий список), TLabel со страницы Standart и две кнопки Подсчитать и Закрыть(рис. 41).

Рис. 41. Форма для подсчета процента учеников в классе.

При отображении этой формы компонент ComboBox должен содержать названия всех классов школы. Для этого с событием OnShow этой формы свяжем следующий код:

 

procedure TFProc.FormShow(Sender: TObject);

begin

DM.IBDSClass.Open;//Открываем НД

DM.IBDSClass.First;//Указатель - на первую запись

ComboBox1.Clear;//Очистка списка

while not DM.IBDSClass.eof do //Цикл до конца НД

begin

//Добавление строки в список

ComboBox1.Items.Add(

DM.IBDSClass.FieldByName('nameclass').AsString);

DM.IBDSClass.Next;//Переход к следующей записи НД

end;

DM.IBDSClass.Close;//Закрытие таблицы

ComboBox1.ItemIndex:=0;//Установка на первый элемент

end;

 

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

Обработчик события нажатия кнопки Подсчитать выглядит так:

 

procedure TFProc.Button1Click(Sender: TObject);

var p:real;

s:string;

begin

DM.IBStoredProcP.UnPrepare;

//Устанавливаем значение входного параметра процедуры

DM.IBStoredProcP.ParamByName('ncl').value:=ComboBox1.Text;

DM.IBStoredProcP.Prepare;//Подготовка к выполнению

DM.IBStoredProcP.ExecProc;//Выполнение хранимой процедуры

// Получаем значение выходного параметра процедуры

p:=DM.IBStoredProcP.ParamByName('proc_in_cl').Value;

str(p:6:2,s);//Переводим число p в строку s

MessageDlg('В '+ComboBox1.Text+' '+s+

'% от общего числа учеников', mtInformation,[mbYes],0);

end;

 

Свяжем с событием выбора пункта меню главной формы с вызовом формы FProc:

FProc.ShowModal;

Реакцией на нажатие кнопки Подсчитатьявляется вывод информационного сообщения о проценте учеников выбранного класса (рис. 42).

Рис. 42. Вывод результата.

Если необходимо выполнять параметрический запрос (в свойстве SQL компоненты TIBQuery в предложении WHERE указываются параметры, имена которых предварены двоеточием), например:

 

SELECT * FROM CLASS WHERE BALL=:p

 

(вместо имени таблицы можно указывать имя просмотра). Для установки значения этого параметра следует выполнить следующее:

 

DM.IBQuery.ParamByName('p').Value:=Значение_параметра;

DM.IBQuery.Prepare;//Подготовка запроса к выполнению

DM.IBQuery.Open;//Открываем запрос

 

Более подробно работа с параметрическими запросами описана в методических указаниях к л/р №3 "Разработка локального приложения для работы с БД".



2016-09-16 360 Обсуждений (0)
Использование дополнительных возможностей 0.00 из 5.00 0 оценок









Обсуждение в статье: Использование дополнительных возможностей

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (360)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)