Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛБ(ПРИС)_Файл-сервер_2016.doc
Скачиваний:
5
Добавлен:
17.06.2023
Размер:
5.49 Mб
Скачать

В обработке события 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 указать модуль этой формы – построителя периода.

Далее в форме отчета, работа с датами возможна двумя способами:

  1. выполнение запроса с параметрами (предпочтителен);

  2. преобразование строки, содержащей дату в тип, воспринимаемый 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;');