- •О. Б. Малков работа с базами данных в среде delphi Учебное пособие для студентов заочной формы обучения
- •Содержание
- •1. Реализация работы с базами данных в среде delphi
- •1.1. Базы данных и системы управления базами данных
- •1.2. Технология доступа к данным bde
- •1.3. Компоненты приложений, работающих с базами данных
- •2. Демонстрационная база данных
- •2.1. Логическая модель данных предметной области
- •2.2. Физическая модель данных предметной области
- •3. Создание базы данных
- •3.1. Создание псевдонима
- •3.2. Создание структуры таблиц базы данных
- •3.3. Свойства таблиц Paradox
- •3.4. Заполнение таблиц базы данных
- •4. МодулЬ данных
- •4.1. Создание модуля данных
- •4.2. Связывание наборов данных
- •4.3. Создание объектов-полей
- •4.4. Проектирование и анализ структуры базы данных
- •4.5. Создание объектов-столбцов
- •4.6. Реализация бизнес-правил
- •5. Создание приложения, работающего с базой данных
- •5.1. Выбор типа пользовательского интерфейса
- •5.2. Создание главной формы
- •5.3. Создание рабочих форм
- •5.4. Создание форм ввода новых данных
- •6. Создание запросов
- •6.1. Компонент Query
- •6.2. Создание sql-запросов
- •6.2.1. Простая выборка данных
- •6.2.2. Выборка из связанных таблиц
- •6.2.3. Сортировка записей
- •6.2.4. Сложные критерии отбора
- •6.2.5. Псевдонимы таблиц и комментарии
- •6.2.6. Агрегатные функции и группировка записей
- •6.2.7. Создание и удаление таблиц и индексов
- •6.2.8. Вставка, удаление и редактирование записей
- •Insert into Имя_таблицы (Список_полей
- •Values (Список_значений)
- •6.3. Построение запроса в демонстрационной базе данных
- •7. Создание отчетов
- •7.1. Основы технологии Rave Reports
- •7.2. Визуальная среда Rave Designer
- •7.3. Составляющие проекта отчета
- •7.3.1. Библиотека отчетов
- •7.3.2. Каталог глобальных страниц
- •7.3.3. Каталог объектов данных
- •7.4. Типы отчетов
- •7.4.1. Отчет с единственной таблицей или запросом
- •7.4.2. Отчет главный-детальный
- •7.4.3. Группирующий отчет
- •7.5. Пример создания отчетов в приложении Sale
- •7.6. Экспорт отчета в файл
- •8. Создание СправочнОй системЫ
- •8.1. Создание файла документа справочной информации
- •8.2. Создание проекта справочной системы
- •8.3. Доступ к справочной информации
- •9. Создание установочного диска
- •9.1. Программа InstallShield Express
- •9.2. Создание проекта инсталляционной программы
- •Библиографический список
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.