Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоуровневые методы программирования..pdf
Скачиваний:
8
Добавлен:
15.11.2022
Размер:
10.32 Mб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 3. ГЕНЕРИРОВАНИЕ ОТЧЕТОВ

Задание:

С помощью Microsoft Visual Basic разработайте программу, которая позволяет корректно работать с БД Microsoft Access предыдущего занятия. Программа должна подключаться к локальной БД и давать возможность пользователю генерировать определенные формы отчетности.

Порядок работы:

1. Перейдите к окну окружения данных и в рамках подключения Con­ nection 1 создайте еще одну команду. Назовите команду CmdJSelect и заполните SQL Statement приведенным ниже оператором:

Дата работы, Заказчик, Неполадка

Создайте форму FrmTable и добавьте к ней объект DBGrid, после чего установите свойство DataMember этого объекта в Cmd_Select. Это выполнить удалось, но структура запроса в таблице еще не отразилась. С помощью пункта Retrieve Fields обновите структуру таблицы и запустите проект.

2.Измените SQL-оператор команды Cmd Select, записав следующий код:

Заказчик, Количество Заявок

Обновите структуру DBGrid и запустите проект.

3.После несложных экспериментов с возможностями SQL-команд восстановите свойство DataMember таблицы DBGrid в Cmd Table, и обновите ее структуру. Разработаем несложный отчет следующего вида:

Для этого выберите Project Add Data Report и в свойстве DataSource объекта выберите DataEnvironmentl. После этого в свойство DataMember следует внести имя команды Cmd_Table. После чего расположите в разделах отчета элементы в следующем порядке.

Журнал заявок

 

 

Следует изменить:

I Дата||Диспетчер!! Заказчик|| Неполадка! <------------ 4

RptLabelметки

 

 

%

Caption

I Дата||Диспетчер! Заказчик||Неполадка|

 

RptTextBox-поля

 

 

 

DataField

 

 

At.

RptFunction-функция

|Всего заявок:|| | |Отчет составил: |

**

FunctionType

 

 

(iptFuncRCnt)

4. В процедуре, обрабатывающей выбор пункта меню «Весь журнал», наберите следующий фрагмент кода, вызывающий просмотр отчета:

DataReportl.Show

Запустите проект и оцените результат. Для формирования рамки таблицы отчета следует использовать элементы RptLine и RptShape.

5. Модифицируйте отчет и преобразуйте его к другому виду:

Ж ур н ал обгьеххов р а б о т

Дата Диспетчер Заказчик Неполадка Человекочасов

Всего неполадок:

 

Всего Ч/Ч:

Отчет составил:

Для этого придется создать новую команду, основанную на SQL-запросе, возвращающем не только информационные поля таблицы, но и вычисляемое поле в следующем виде “ . . . (К ол_человек*К ол_часов) As ЧЧ. . . ”

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

Н а г р у зк а

д и с п е т ч е р о в

Статистика заявок

Диспетчер

Дата

Всего заявок

Дата

Неполадка

Сколько

раз

1

1

1

I

1

!1

1

1

В среднем

за день:

Всего неполадок:

 

 

 

 

 

 

 

Отчет

составил:

 

Отчет составил:

7. Подключите созданные

отчеты к меню главной формы проекта

и разработайте форму,

показывающую информацию об авторе

программы.

 

8. Протестируйте программу и защитите работу.

ЛАБОРАТОРНАЯ РАБОТА № 4. УДАЛЕННОЕ СОЕДИНЕНИЕ С БД INTERBASE НА ОСНОВЕ BDE

Задание:

С помощью Borland Delphi разработайте программу, которая позволяет работать с существующей БД. В БД хранятся анкетные данные работников предприятия с точки зрения условий их проживания. По результатам обработ­ ки этих данных (с помощью вашей программы) начальник отдела социальной помощи выявит первоочередных претендентов на получение нового жилья. В БД не хранится информация о самих работниках (там имеется только ин­ формация об их квартирах), и ответственное лицо при выборе претендентов проявит меньший уровень предвзятости.

Программа должна предусматривать возможность корректировки ранее внесенных данных, добавление новой и удаление устаревшей (неактуальной) информации. Кроме этого, программа должна позволять пользователю выпол­ нять типовые запросы к БД и генерировать указанный в тексте задания набор форм периодической отчетности.

Прежде чем приступать к работе, уточните у преподавателя расположение файла БД Interbase DB Houses.gdb и скопируйте этот файл в папку, соответст­ вующую последнему практическому занятию курса.

Структура БД:

(--------------------------------------

Главная таблица

^

 

^

4---

«Жилищные условия»---'1

Порядокработы:

T F la ts

 

ID *

In teger

Address

V archar(25)

Nun f la t

In teger

Num_floor

In teger

A ll rooms

In teger

A ll_people

In teger

All__size

In teger

Types_ID

In teger

T_Types

ID* Integer

Name Varchar(20)

Справочная таблица «Тип здания»

1.Запустите программу BDE Administrator, которая входит в состав стандартных компонентов Delphi. На экране появился список «масок» (или псевдонимов) БД. Последовательно перемещайтесь по списку, выделяя маски по одной, и в правой части окна просматривайте описание этой маски. В разделе описания масок можно заметить тип БД, драйвер русификации, путь к файлу БД и множество другой системной информации.

Если в открытом списке уже имеется маска, названная AJHouses, смело удалите ее, выбрав пункт меню Object Delete.

ДалееcoздaйтeнoвыйпceвдoнимБД(ObjectNew),yкaжитeв появившемся окне INTRBASE, нажмите кнопку ОК и назовите созданную маску А_ Houses. Перейдите курсором в область описания маски и заполните путь к файлу БД (кнопка... в свойстве SERVERNAME). После этого в свойстве USER NAME наберите SYSDBA - это имя пользователя, которое будет устанавливаться по умолчанию в окне подключения к БД.

Для того чтобы изменения вступили в силу, нажмите кнопку Apply на панели инструментов или выберите пункт меню Object Apply. Только после этого можно закрыть BDE Administrator.

2. Запустите Borland Delphi и назовите главную форму проекта FrmMain. С помощью кнопки New form панели инструментов добавьте к проекту еще две формы, назвав их соответственно FrmLine и FrmTable. Аналогичным образом создайте форму FrmTypes.

3.РазработайтенаформеFrmMainглавноеменюпрограммы (егоструктуру смотрите ниже) и опишите модальный вызов форм FrmLine, FrmTable и FrmTypes из пунктов главного меню проекта (метод ShowModal).

Заявки

Запросы

 

Отчеты

По одной

По номеру

квартиры

Все заявки

Таблица

Количество

комнат

Средняя площадь

 

Количество

жильцов

 

Типы зданий

Диапазон этажей

 

Выход

Запустите проект и проверьте его работоспособность.

4.Создайте модуль данных (пункт меню File New Data Module) и назовите его MyDM. Перейдите на закладку Data Access панели инструментов и расположите в модуле данных объект Database. Назовите его MyDataBase, а в поле Database Name внесите MyDB. После этого в свойстве AliasName выберите из списка A Houses. Попытайтесь подключиться

к БД, установив в свойстве Connected значение True. Разумеется, это можно сделать только в том случае, если: а) . Программа InterBase Server уже запущена.

б). Корректно введен пароль доступа к данным (наш пароль - masterkey).

После того как соединение установлено, можно приступать работе. 5. Расположите в модуле данных объект Table, заполнив его свойства:

DatabaseName

MyDB

TableName

T_Types

Name

Table_Types

Active

True

Добавьте в модуль данных объект DataSource, установив в его свойства:

Name

DS_Types

DataSet

Table_Types

Только после создания объекта DataSource можно отлаживать элементы объектного интерфейса БД.

6.Перейдите к форме FrmTypes и откройте закладку Data Controls панели инструментов. Расположите на форме объект DBGrid и установите его свойство DataSource в D STypes. Чтобы это стало возможным, подключите модуль данных к форме (строка USES). Запустите проект

ипросмотрите содержимое справочника типов зданий.

7.Добавьте на форму объект DBNavigator и установите его свойство Data­ Source в DS Types. Теперь вы сможете более эффективно перемещаться по набору данных, добавлять в него новые строки или удалять их. Создайте на активной форме кнопку с надписью «Выход» и напишите код закрытия формы в обработчике события OnClick этой кнопки. Такие же кнопки создайте на двух других формах проекта и напишите

им соответствующий код закрытия форм.

8. Подключите модуль данных ко всем формам проекта (строки USES). В модуле данных создайте еще один объект Table_Flats, основанный на таблице T_Flats и соответствующий ему элемент DS_Flats.

9.Перейдите к форме FrmTable и расположите на ней другой объект DB­ Grid, основанный на ресурсе D S F lats. Установите ширину столбцов таблицы так, чтобы все они умещались в форме и таблица не нуждалась в полосе горизонтальной прокрутки. Для этого очень точно захватите мышью границу разделения столбцов в шапке таблицы. Очевидно, что последний столбец таблицы отражает значение поля внешнего ключа, а не результат его подстановки из таблицы T_Types. Кроме этого, пользователю будет очень полезно узнать, какая площадь

приходится на одного жителя квартиры.

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

а) создадим подставляемое (Lookup) поле L_Types, значения которого берутся из справочной таблицы T_Types;

б) Создадим вычисляемое (Calculated) поле C_Avg, которое будет отражать результат деления общей площади квартиры на количество жителей.

Для этого в контекстном меню таблицы Table_Flats (в модуле данных) вы­ берите Fields Editor. Добавьте все поля (в контекстном меню Add Fields) физи­ ческой таблицы. После этого создайте новое поле (в контекстном меню редактора полей New Field).

f

Ключевое поле:

\

 

 

 

 

 

 

TYPESID

'

|l_Typet

Component |ТвЫеПаЫч.Туре*

 

 

 

J **

1

 

 

Из набора данных:

1я ж

|Strir>g

 

 

 

 

 

 

 

TableTypes

-fid d fo w

:-------- =-

CaJoiated

Lookup

 

 

Связанное поле:

Г

Г

 

(•;

 

 

ftookupdefW torr-----------

3 Datwet

|ТаЫе_Тур©*

 

 

 

 

 

 

 

п>

fry/R dd*

JTVPESJD

 

 

г ,

LookupKe^r JID

3

[NAW E

3

 

Возвращаемое поле:

J

 

| OK |

 

 

V

 

NAME

 

Cancel | Д а *

|

Создайте новое поле C Avg (в контекстном меню New Field) типа Float. Установите атрибут Calculated (вычисляемое) и перейдите к обработчику со­ бытия OnCalcFields таблицы TableFlats (в модуле данных). Наберите в нем следующий код:

If (Table_Flats.FieldByName(‘ALL_PEOPLE’).Value>0) then

Table_Flats.FieldByName(‘C_Avg’).AsFloat:=

Table_Flats.FieldByName(‘ALL_SIZE’).Value/ Table_Flats.FieldByName(‘ALL_PEOPLE’).Value else

Table_Flats.FieldByName(‘C_Avg’).AsFloat :=0;

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

10.На первый взгляд кажется, что в столбце T ypes© надобности больше нет. Поэтому удалим его из объекта Table Flats с помощью Fields Editor Delete. Появилось сообщение о неочевидной ошибке - ведь этот столбец используется полем L_Types. Поэтому самостоятельно добавьте его к Table_Flats и добейтесь того, чтобы данные таблицы отражались на форме.

Можно сделать вывод, что если возникает необходимость скрытия стол­ бцов таблицы, нужно пользоваться возможностями объекта DBGrid (пункт Colums Editor контекстного меню). Скройте столбец Types © .

11.Расположите на форме FrmTable объект DBNavigator, подключив его

ксоответствующему ресурсу. Запустите проект и попробуйте добавить

ктаблице одну новую строку (содержимое произвольно). Подсчитайте

количество возникших исключительных ситуаций.

Можно сделать очень важный вывод - добавление информации в слож­ ные таблицы БД с помощью DBGrid затруднительно, так как заполнение по­ лей записи содержимым происходит не синхронно. Это приводит к множест­ ву ошибок, связанных с заполнением ключей таблицы, работой вычисляемых

иподставляемых полей.

12.Попытаемся корректно решить эту проблему. Переключитесь на форму FrmLine и расположите на ней DBGrid (основана на DS_Types, а свойство Readonly установлено в True) и стандартный элемент Edit. Создайте на форме кнопку «Добавить», в коде обработчика нажатия которой запишите:

MyDM.Table_types.lnsert;

MyDM.Table_types.FieldByName(‘Name’).Value := Editl .Text;

MyDM.Table_types.FieldByName(‘ID’).Value := 0;

MyDM.Table_types.Post;

MyDM.Table_types.Refresh;

При добавлении записи в таблицу поле первичного ключа должно быть обязательно заполнено, в противном случае произойдет сбой. Само числовое значение поля неважно - оно будет изменено триггером, срабатывающим при вставке новой записи в таблицу. Методом Post данные заносятся в БД, после чего методом Refresh происходит обновление содержимого таблицы. Если таб­ лицу не обновлять, изменения поля первичного ключа не будут заметны, как

ивсе действия, выполненные другими пользователями БД. Запустите проект

идобавьте новый тип здания «Коттедж».

Добавьте к форме кнопку «Удалить”, для которой наберите код:

МуDМ.Table_types.Delete; МуDM .Tabie_types.Refresh;

Затем создайте кнопку «Найти», для которой напишите текст: a:=false; {конечно, а нужно прежде объявить!} MyDM.Table_types. First;

While Not(MyDM.Table_types.EOF)and (a=false) do begin

If (MyDM.Table_types.FieldByName(‘Name’).Value = Editl .Text) then a:= Not (a)

else MyDM.Table_types.Next; end;

Запустите программу, в текстовом поле Editl наберите «Коттедж» и нажмите кнопку «Найти». После того как активной записью таблицы стала запись с типом здания «Коттедж», нажмите кнопку «Удалить» и оцените ре­ зультат.

13.Добавьте к проекту новую форму Frm_Ql и расположите на ней элемент DBGrid, основанный на ресурсе DS_Q1. В форме отражены

данные только о квартирах с номером 1. Преобразуем SQL-запрос к следующему виду:

Select Address, Num_floor, AII_rooms, AILpeople, AII_Size From T_Flats

Where Num_flat = :pN

После записи SQL-оператора с подставляемым внешним параметром (:pN) необходимо определить его тип. Поэтому в свойстве Params объекта Query 1 установите тип параметра pN в Integer, а значение по умолчанию установите 0 (ноль).

14.На форме создайте текстовое поле Editl и кнопку «Выбрать», для которой напишите следующий код:

MyDM.queryl .Active := false;

MyDM.queryl .ParamByName(‘pN’).Value := StrTolnt(Edit1 .Text);

MyDM.queryl .Active := true;

Запустите программу и убедитесь, что запрос с внешним параметром, подставляемым из текстового поля, гораздо более гибок. Подсчитайте коли­

чество квартир с номерами 1, И и 13.

15 Самостоятельно разработайте и подключите к проекту формы,

отображающие результат работы следующих параметрических запросов:

-для указанного количества комнат (параметр pRooms) выбрать:

ГО, ADDRESS, NUMJFLAT, NUMFLOOR

-для указанного количества жильцов (параметр pPeople) выбрать: ADDRESS, NUM_FLAT, NUMJFLOOR, NAME

-для указанного диапазона этажей (параметры pMin и рМах) выбрать: ADDRESS, NUM_FLAT, NUMFLOOR, ALL_SIZE, NAME

16. Наделите кнопку “Выбрать” формы FrmQl другим кодом:

MyDM.queryl .Active := false; MyDM.queryl .SQL.Clear;

MyDM.queryl .SQL.Add(‘Select * from T_Flats, TJypes’); MyDM.queryl .Active := true;

Запустите программу и выявите концептуальную ошибку запроса.

17.Разработайте отчет, отображающий содержимое таблицы Table_Flats. Для этого выберите пункт меню File New... и в появившемся окне

выберите Report. Назовите отчет QR_1 и, распахнув свойство Bands в окне Object Inspector, включите все разделы отчета, установив против наименования каждого раздела True. Отчет основан на таблице ТаЫе_ Flats, поэтому выберем ее в свойстве DataSet отчета QR_1.

Page Header

Отчет: "Условия проживания работников"

T i t l e

 

 

 

Column Header

 

 

Адрес

Квартира

Этаж

Комнат Жильцов Площадь

D e ta il

 

 

 

| ADDRESSH | NUM_ELMH [NUMJPLOOR| [M ,L_ROOMS[|M,L PEOPLE 1r~MiL_SIZE [

Summary

В с е г о а д р е с о в : Г соинт 1

Page F ooter

Замечание: в разделах отчета Page Header и Column Header используют­ ся только объекты QRLabel, для которых изменено свойство Caption и размер шрифта. В разделе Detail находятся элементы QRDBText, у которых в свойства

DataSet занесено TableFlats, а в DataField - соответствующее поле таблицы. В итоговом разделе отчета Summary кроме текстовой метки находится объект QRExpr, внутрь которого с помощью конструктора Expression Builder (кноп­ ка «...» против свойства Expression) внесена функция COUNT. Линии в шапке таблицы проведены с помощью элементов отчета QRShape.

Для запуска отчета достаточно выполнить: QR_1 .Preview;

18. Разработайте и подключите к проекту отчет следующей структуры (только заявки, где площадь, приходящаяся на 1 человека, превышает 18 м2):

Отклоненные заявки

в в и ду

излиш ков жилой площ ади

(б о л е е

18 к в . м етр ов

н а ч е л о в е к а )

Адрес Квартира

Площадь Жителей

На человека Тип здания

Всего отклонено заявок:

Очет составил

19. Сделайте выводы и защитите работу.