Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС_проект_ИС.doc
Скачиваний:
18
Добавлен:
11.08.2019
Размер:
3.38 Mб
Скачать

6.3. Построение запроса в демонстрационной базе данных

Проиллюстрируем работу с запросами следующим примером. Допустим, что пользователь демонстрационной БД хочет получить сведения о недооплате по всем выписанным ранее накладным. При этом отдельно должны учитываться частично оплаченные ТТН и ТТН, по которым оплата не была произведена вообще, т. е. нам необходимо будет реализовать два разных запроса к БД.

Модифицируем модуль данных нашего приложения, разместив на панели Components компоненты Query1 и DataSource1. В свойстве DataSet источника данных (назовем его SourceQuery1) укажем значение Query1 (имя объекта-запроса), а в самом объекте Query1 зададим название БД (свойство DatabaseName должно получить значение ААА).

Первый запрос строится на основе трех таблиц: Naklad, Plateg и Zakazcik. Обратимся к свойству SQL компонента Query1, раскроем окно редактора текста запроса и введем следующий текст (предварительно его можно проверить с помощью утилиты SQL Explorer):

SELECT DISTINCT NNom, PZKod, ZNaim, NSumma, SUM(PSumma)

FROM Naklad, Plateg, Zakazcik

WHERE (NNom=PNNom) AND (NZKod=PZKod) AND (ZKod=PZKod)

GROUP BY NNom, PZKod, ZNaim, NSumma

Теперь остается отобразить набор нужных записей на экране. Для этого создадим новую рабочую форму командой File > New > Form. Сохраним модуль этой формы под именем fmQuery1Unit и добавим его в проект Sale командой Project > Add to Project. Изменим некоторые свойства формы:

Caption = ‘ТТН, по которым поступили ПТР’ BorderStyle = bsDialog

Name = FQuery1 BorderWidth = 2

Height = 210 Width = 416

Разместим на форме компонент Panel1 (Align = alBottom, Caption = ‘ ‘). Расположим на панели компонент DBNavigator1 и кнопку BitBtn1 (Kind = bkClose).

В оставшейся свободной части формы разместим компонент Panel2 (Align = alClient, Caption = ‘ ‘). На этой панели расположим компонент DBGrid1 (Align = alClient).

Командой File > Use Unit свяжем модуль fmQuery1Unit с модулем данных dmSaleUnit. Сохраним все сделанные изменения. Для компонента DBGrid1 раскроем список свойств DataSource и выберем DM.SourceQuery1. Для компонента DBNavigator1 в списке свойств DataSource также выберем DM.SourceQuery1.

Создадим объекты-столбцы для сетки DBGrid1 – дважды щелкнув мышью на сетке, вызовем редактор столбцов и в его контекстном меню выберем команду Add Fields. Добавим последовательно все поля, кроме PZKod.

Добавим новое вычисляемое поле Nedo командой New Field. Далее редактируем свойства каждого столбца в отдельности. Вид выравнивания значений в столбце зададим, обратившись к свойству Alignment, параметры заголовка зададим, раскрыв свойство Caption.

Для события OnCalcFields компонента Query1 напишем обработчик:

procedure TDM.Query1CalcFields(DataSet: TDataSet);

begin

Query1Nedo.Value:=Query1NSumma.Value

- Query1SUMOFPSumma.Value;

end;

В ид окна после всех сделанных изменений показан на рис. 41.

Рис. 41. Рабочее окно для запроса «ТТН, по которым поступили ПТР»

Свяжем вызов этой формы с соответствующим пунктом контекстного меню главной формы. Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для первого элемента меню (объект N1) в свойстве Caption укажем – «ТТН, по которым поступили ПТР». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFMain.N1Click(Sender: TObject);

begin

FQuery1.ShowModal;

end;

Командой File > Use Unit добавим модуль fmQuery1Unit в раздел implementation модуля fmMainUnit.

ВНИМАНИЕ! Значение свойства Active запроса Query1 во время работы приложения должно быть равным True.

Разместим на панели Components модуля данных нашего приложения компоненты Query2 и DataSource2. В свойстве DataSet источника данных (назовем его SourceQuery2) укажем значение Query2 (имя объекта-запроса), а в самом объекте Query2 зададим название БД (свойство DatabaseName получит значение ААА).

Этот запрос строится на основе таблиц Naklad и Zakazcik. Обратимся к свойству SQL компонента Query2, раскроем окно редактора текста запроса и введем следующий текст (предварительно проверив его с помощью утилиты SQL Explorer):

SELECT NNom, NZKod, ZNaim, NData, NSumma

FROM Naklad, Zakazcik

WHERE (NZKod=ZKod) AND

NOT (NNom IN (SELECT PNNom

FROM Plateg))

Чтобы отобразить набор нужных записей на экране, создадим форму командой File > New > Form. Сохраним модуль формы под именем fmQuery2Unit и добавим его в проект Sale командой Project > Add to Project. Изменим некоторые свойства:

Caption = ‘ТТН, по которым не поступили ПТР’ BorderStyle = bsDialog

Name = FQuery2 BorderWidth = 2

Height = 210 Width = 416

Разместим на форме компонент Panel1 (Align = alBottom, Caption = ‘ ‘). Расположим на панели компонент DBNavigator1 и кнопку BitBtn1 (Kind = bkClose). В оставшейся свободной части формы разместим компонент Panel2 (Align = alClient, Caption = ‘ ‘). На этой панели расположим компонент DBGrid1 (Align = alClient).

Командой File > Use Unit свяжем модуль fmQuery2Unit с модулем данных dmSaleUnit. Сохраним все сделанные изменения. Для компонента DBGrid1 раскроем список свойств DataSource и выберем DM.SourceQuery2. Для компонента DBNavigator1 в списке свойств DataSource также выберем DM.SourceQuery2.

Создадим объекты-столбцы для сетки DBGrid1 – дважды щелкнув мышью на сетке, вызовем редактор столбцов и в его контекстном меню выберем команду Add Fields. Добавим последовательно все поля кроме NZKod. Отредактируем свойства каждого столбца. Вид выравнивания значений в столбце зададим, обратившись к свойству Alignment, параметры заголовка зададим, раскрыв свойство Caption.

В ид окна после всех сделанных изменений показан на рис. 42.

Рис. 42. Рабочее окно для запроса «ТТН, по которым не поступили ПТР»

Свяжем вызов этой формы с соответствующим пунктом контекстного меню главной формы. Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для второго элемента меню (объект N2) в свойстве Caption укажем – «ТТН, по которым не поступили ПТР». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFMain.N2Click(Sender: TObject);

begin

FQuery2.ShowModal;

end;

Командой File > Use Unit добавим модуль fmQuery2Unit в раздел implementation модуля fmMainUnit.