- •Методические указания к выполнению лабораторных работ по дисциплине
- •1. При проектировании используйте примеры программного кода непосредственно из исходных текстов программ, а не из методических описаний (*.Doc файла)
- •2. Имена отдельным модулям лучше давать по их функциональности, а не оставлять так как они даются по умолчанию (Unit1.Pas, Unit2.Pas и т.Д.)
- •3. При возникновении каких-либо ошибок в процессе выполнения работы проверьте по исходному примеру, все ли модули подключены в разделах interface и implementation, подразделе uses.
- •Теоретическое введение
- •Создание структуры таблиц бд
- •3.3 Синтез иконки прикладного приложения
- •3.4 Размеры экранных форм и их положение на экране
- •3.5 Разработка подчинённых форм
- •Создание формы
- •Размеры и положение
- •Работа приложения с бд
- •Доступ к таблицам бд. Компоненты доступа к данным. Приложение
- •AdoDataSet (Набор данных) или adoQuery (Запрос)
- •Сохранение пути к бд
- •Работа с данными
- •Обработка данных
- •Сортировка
- •Отчёты и обработки
- •Запросы, содержащие вычисления на выделенных записях таблицы (по столбцам)
- •В обработке события OnClick кнопки Button необходимо прописать следующее:
- •Разграничение прав доступа для различных пользователей
- •Организация многопользовательского режима
В обработке события OnClick кнопки Button необходимо прописать следующее:
procedure TPeriodForm.Button1Click(Sender: TObject); begin If PeriodForm.DateTimePicker2.DateTime < DateTimePicker1.DateTime then showmessage('Период введен некорректно!') else begin period1:=datetostr(DateTimePicker1.Date); period2:=datetostr(DateTimePicker2.Date); ReportForm:= TReportForm.Create(self); //создаёмформу ReportForm.ShowModal; //выводим на экран модально end; end; |
Переменные period1 и period2 необходимо сделать глобальными, чтобы они были доступны другим модулям и в разделе uses указать модуль отчета (т.к. эти значения передаются в этот модуль) и модуль главной формы (т.к. эта форма появляется при нажатии пункта меню на главной форме):
var PeriodForm: TPeriodForm; period1,period2:string; implementation uses ReportUnit, SotrudnikiUnit; |
В модулях главной формы и формы отчета также в разделе uses указать модуль этой формы – построителя периода.
Далее в форме отчета, работа с датами возможна двумя способами:
выполнение запроса с параметрами (предпочтителен);
преобразование строки, содержащей дату в тип, воспринимаемый Delphi.
Рассмотрим 1ый способ.
В этом случае в модуле DM в свойстве Parameters компонента RepADOQuery (или другого созданного компонента, соответствующего запросу создаваемого отчета) необходимо добавить два новых параметра – пусть они будут иметь те же имена, что и переменные period1 и period2, в свойстве DataType каждого параметра выбрать значение ftDateTime (см. рисунок 35).
Рисунок 35 - Настройка свойств параметров
Таким образом, каждый параметр имеет имя и индекс (индексация начинается с нуля).
Пусть, например, нам необходимо вывести увлеченность хобби тех сотрудников, дата рождения которых попадает в введенный диапазон. Тогда текст запроса примет вид:
DM.RepADOQuery.SQL.Add ('SELECT HOBBY.H_ID, HOBBY.H_Name, Count(HOBBY.H_Name) AS [Count H_Name] FROM SOTR INNER JOIN (HOBBY INNER JOIN HOBBY_SOTR ON HOBBY.H_ID = HOBBY_SOTR.H_ID) ON SOTR.S_ID = HOBBY_SOTR.S_ID WHERE (SOTR.S_DateBirth Between :period1 And :period2) GROUP BY HOBBY.H_ID, HOBBY.H_Name ORDER BY Count(HOBBY.H_Name) DESC;'); |
Таким образом, обращение к параметрам происходит с помощью “:” и указания имени параметра. Далее необходимо определить значения этих параметров:
DM.RepADOQuery.Parameters.ParamByName('period1').Value:=period1; DM.RepADOQuery.Parameters.ParamByName('period2').Value:= period2; |
Рассмотрим 2-ой способ
Необходимо преобразовать строковые переменные period1 и period2 из формата 01.01.2000 в формат 01/01/2000:
period1:=Copy(period1,1,2)+'/'+Copy(period1,4,2)+'/'+Copy(period1,7,4); period2:=Copy(period2,1,2)+'/'+Copy(period2,4,2)+'/'+Copy(period2,7,4) |
Затем текст запроса измениться следующим образом:
DM.RepADOQuery.SQL.Add ('SELECT HOBBY.H_ID, HOBBY.H_Name, Count(HOBBY.H_Name) AS [Count H_Name] FROM SOTR INNER JOIN (HOBBY INNER JOIN HOBBY_SOTR ON HOBBY.H_ID = HOBBY_SOTR.H_ID) ON SOTR.S_ID = HOBBY_SOTR.S_ID WHERE (SOTR.S_DateBirth Between #’+period1+’# And #’+period2+’#) GROUP BY HOBBY.H_ID, HOBBY.H_Name; ORDER BY Count(HOBBY.H_Name) DESC;'); |