Само задание:
Учет движения продуктов по складу горюче-смазочных материалов. Составить базу данных, полями которой являются: шифр продукта, наименование продукта, объём, признак прибытие/убытие, дата, наименование (фамилия) потребителя/поставщика номер счёта потребителя/поставщика, адрес, телефон и др. Вывести динамику поступления-убытия каждого конкретного продукта, а также общий объём движения продуктов на складе ГСМ (сколько прибыло и убыло за текущий месяц).
Что нужно проделать
ЛАБОРАТОРНАЯ РАБОТА №1
ОСНОВЫ ПОСТРОЕНИЯ БАЗЫ ДАННЫХ
В СРЕДЕ BORLAND DELPHI
Определение структуры таблицы
Например, в учебном управлении высшего учебного заведения необходимо хранить информацию о студентах заведения: № зачётной книжки, шифр группы, ФИО, год рождения, пол, предмет, среднюю оценку по предмету.
Таблица
БД
представляет собой обычную двумерную таблицу с характеристиками (атрибутами) какого-то множества объектов и имеющая имя -
идентификатор, по которому на неё можно сослаться.
Таблица 1. Данные о студентах
№ зач. книжки |
Группа |
Фамилия |
Имя |
Отчество |
Год рождения |
Пол |
Предмет |
Оценка |
Zach
|
Group
|
Fam
|
Nam
|
Par
|
Year_b
|
Sex
|
Pred
|
Oz
|
115261 |
В2201 |
Иванов |
Егор |
Петрович |
1982 |
М |
Информатика |
4 |
234582 |
Э3514 |
Петров |
Иван |
Сидорович |
1984 |
М |
Информатика |
5 |
365484 |
Э3514 |
Сидоров |
Иван |
Петрович |
1983 |
М |
СПО |
3 |
498759 |
А1501 |
Егорова |
Инна |
Егоровна |
1982 |
Ж |
ТОЭ |
4 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
Например, для таблицы введём для последующих ссылок имена полей Zach
,
Group
,
Fam
,
Nam
,
Par
,
Year
_
b
,
Sex
,
Pred
,
Oz
, соответствующие указанным в ней заголовкам полей.
Тип поля
характеризует тип хранящихся в поле данных. Это могут быть строки, числа, булевы значения,большие тексты (например характеристики сотрудников),изображения (фотографии) и т.п.
Каждая строка таблицы
соответствует одному из объектов. Она называется записью
и содержит значения всех полей, характеризующих данный объект.
При построении таблиц БД важно обеспечить непротиворечивость информации. Это делается введением ключевых полей
, обеспечивающих уникальность каждой записи. Ключевым может быть одно или несколько полей. В приведённом примере можно было бы сделать ключевыми совокупность полей Fam
,
Nam
и
Par
. Но в этом случае нельзя было бы заносить в таблицу сведения о полных однофамильцах, у которых совпадают фамилия, имя и отчество. Поэтому целесообразнее использовать поле Zach
– номер зачётной книжки, которое можно сделать ключевым, поскольку номер зачётной книжки не может быть одинаковым у двух студентов.
В каждый момент времени есть некоторая текущая запись,
с которой ведётся работа. Записи в таблице БД физически могут располагаться без какого-либо порядка, просто в последовательности их ввода (появления новых студентов). Но когда данные таблицы предъявляются пользователю, они должны быть упорядочены. Для упорядочения данных в БД, так же, как и для упорядочения данных в массивах, используется понятие индекса.
Индекс показывает, в какой последовательности будет просматриваться таблица. Часто индексы хранятся отдельно от файла с данными. Для быстрой сортировки обычно индексы выносят в отдельный индексный файл с
тем же названием, но с другим расширением. В таком файле содержатся только первичные ключи и описание очередности записей. Основной же файл при этом остается неупорядоченным. Т. к. индексный файл намного меньше файла объектов, сортировка по индексу происходит гораздо быстрее, чем сортировка основного файла.
Индексы могут быть первичными
и вторичными.
Например, первичным индексом могут служить поля, отмеченные при создании таблицы как ключевые. А вторичные индексы могут создаваться для других полей как при создании таблицы, так и впоследствии. Вторичным индексам присваиваются идентификаторы, по которым их можно использовать.
Если индекс включает в себя несколько полей, то упорядочение БД сначала осуществляется по первому полю, а для записей, имеющих одинаковое значение первогополя,
по второму полю. Например, таблицу о студентах можно проиндексировать по группам, а внутри каждой группыпо алфавиту.
Создание файла таблицы данных
Для работы с базами данныхнаиболее распространённых форматов можно использовать утилиту Database
Desktop
, поставляемую в составе большинства продуктов корпорации Inprise (Borland). При установке Delphi создаётся типовая структура каталогов и меню "Пуск" Windows, а в меню "Пуск"Прог
paммы->Borland Delphi->Database Desktop
.
Создание таблицы базы данных осуществляется выбором опции меню File->New->Table
послезапускаутилитыDatabase Desktop
.
ВпоявившемсядиалогеCreate Table
выбираетсятиптаблицы (изизвестныхстандартных – например,Paradox,
Access, dBase, InterBase, Oracle ит.д.).
В этой работе используется наиболее простой тип плоских таблиц dBase
for
Windows
.
В диалоге задания структуры
указываются:
1. имя поля (FieldName) 2. тип (Type) 3. размер (Size) 4. число десятичных знаков (Dec) и др.
В dBaseforWindows используются типы полей: Character
(
C
) -
символьное; Float
(
F
) -
вещественное (с высокой точностью); Number
(
N
) -
целое, вещественное (с точностью в 2 десятичных знака); Date
(
D
) -
дата; Logical
(
L
) -
логическое; Мето(М) -
текстовое без ограничениядлины;
Binary
(
B
) -
двоичное (рисунки и другие объекты).
Выбор типа поля осуществляется нажатием клавиши <пробел> или правой клавишей «мыши».
Для примера БД студентов учебного заведения структура файла таблицы может быть представлена в виде (рис. 2).
Рис. 2 Диалог задания структуры таблицы
Изменение кодовой страницы для поддержки русского языка осуществляется следующим образом: в окошке Table
Properties
из выпадающего списка выбирается пункт Table
Language
,
после чего необходимо нажать кнопку Modify
;
в появившемся диалоге Table
Language
указывается кодовая страница dBase
RUScpp
866.
После задания структуры таблицы, её сохранение производится выбором кнопки Save
As
.
В диалоге указывается имя файла таблицы (например, stud
.
dbf
).
Если необходимо в дальнейшем изменить структуру таблицы, следует открыть таблицу в Database
Desktop
и выбрать в главном меню пункты Table
->
Restructure
.
После создания таблицы возможно её редактирование и использование в прикладных программах.
Разработка приложения для работы с таблицей данных
Для разработки системы управлениябазой данных можно воспользоваться как стандартными СУБД (Access, Paradox, dBase и т.д.), так и разработать самостоятельное приложение для работы с БД.
Разработка самостоятельного приложения для работы с БД имеет ряд преимуществ по сравнению с использованием готовых пакетов:
1) ресурсы ОС задействованы только для тех задач, которые будут реализованы в СУБД;
2) полученные программные модули очень компактны;
3) обеспечивается более высокое быстродействие вследствие использования только необходимых для решения задачи операций с БД;
4) многообразие реализаций максимально удобного интерфейса пользователя с СУБД;
5) возможность интегрироваться в любые программные приложения;
6) осуществление расчётных задач сложности, которая не может быть обеспечена применением готовых СУБД.
Для разработки системы управлениябазой данных воспользуемся интегрированной средой визуальной разработки Windows-приложений Borland Delphi. Одним из важнейших достоинств Delphi является наличие удобных средств быстрой визуальнойразработки приложений с использованием специализированных компонент доступа и управления базами данных, генерации отчётов, запросов SQL, a так же наличие технологии BorlandDatabaseEngine (BDE), обеспечивающей доступ к большинству известных баз данных с использованием их собственных драйверов.
Для программирования баз данныхиспользуются следующие вкладки палитры компонент: Data
Access
и Data
Control
(рис. 3, 4, 5).
Рис. 3. Палитра компонентов
Borland
Delphi
Рис
. 4.
Вкладка
Data
Access
Вкладка Data Access
содержит компоненты:
Table
(второй слева) - связывающий файл таблицы на диске с приложением и позволяющий оперировать с таблицей (второй компонент).
DataSource
(первый слева) - связывает компоненты отображения информации с компонентом Table (первый компонент).
Рис. 5. Вкладка
DataControl
Вкладка Data
Control
содержит компоненты:
DBGrid
-
для отображения и редактирования записей базы данных (первый компонент)
DBNavigator
-
для управления данными (удаление, добавление, перемещение и т. д.)
Компоненты переносятся на окно приложения (форму) путём выделения компоненты нажатием правой клавиши мыши на ней, а затем на форме.
Компоненты вкладки Data
Access
являются служебными и относятся к невидимым (т. е. отображаются на стадии разработки приложения и не отображаются в процессе выполнения), aData
Control
к отображаемым как в процессе разработки, так и в процессе выполнения.
После переноса компонент на форму производится настройка свойств объектов с использованием Object
Inspector
.
Основные свойства объекта
Table
:
Name
-
имя объекта используемое в программе (является указателем, заданным в соответствии с шаблоном компоненты); DatabaseName
-
имя псевдонима (alias) базы данных (выбирается из списка, если таблица и проектнаходятся в одном каталоге необязательный параметр!); TableName
-
имя файла таблицы (выбирается из списка, если указан псевдоним БД или файл с таблицей и проект находятся в одном каталоге); Active
-
позволяет отображать данные из таблицы в процессе разработки и автоматически открывает файл при выполнении (когда установлено true).
Служебная компонента DataSource выполняет роль связующего звена и имеет следующие свойства:
Name
-
имя объекта используемое в программе (является указателем, заданным в соответствии с шаблоном компоненты); DataSet
-
имя таблицы связанной с данным объектом (выбирается из списка).
Объект Table
позволяет приложению работать с таблицей, но для отображения данных на экране необходимо использовать компоненту DBGrid
.
Основные свойства объекта DBGrid:
Name
-
имя объекта используемое в программе (является указателем, заданным в соответствии с шаблоном компоненты); DataSource
–
имя источника данных, посредством которого осуществляется связь объекта DBGrid
с объектом Table
(выбирается из списка).
Объект DBGrid
позволяет не толькоотображать данные, но и управлять ими (перемещаться по записям, добавлять и редактировать записи и т.д.). Однако ряд действий эффективней выполнять с использованием объекта DBNavigator
.
Основные свойства объекта DBNavigator:
Name
–
имя объекта (указатель); DataSource
–
имя источника данных, посредством которого осуществляется управление компонентой Table
, выбирается из списка (рис. 6).
Рис. 6 Свойства компонент
Table
и
DataSource
На рис. 7 показана структурная схема взаимодействия компонент приложения для работы с базой данных.
Рис. 7. Взаимодействие компонент приложения
После размещения на форме всех необходимых компонент и настройки их свойств получим макет приложения, показанный на рис. 8.
Рис. 8 Макет формы приложения для работы с таблицей
stud
После компиляции и запуска приложения возможна работа с исходной однотабличной БД – ввод, сохранение, удаление и редактирование данных, перемещение по записям таблицы. Вводимая в поля таблицы информация должна соответствовать указанному при создании таблицы типу поля и не превышать длину поля (в этом случае ввод символов за границей длины поля будет невозможен).
Рис. 9 Внешний вид работающего приложения
Структура проекта приложения
При работе с БД можно выделить три группы файлов, которые создаются интегрированной средой и содержат программный код, необходимый для компиляции проекта:
1. проектные файлы (приводятся имена, используемые по умолчанию для первого созданного в среде проекта):
Project1 .dof - проектный файл компоновки, описывающий все файлы, входящие в проект;
Project1.dpr - файл, отвечающий за запуск приложения;
Project1.res - файл ресурсов (курсоры, пиктограммы и т.д.).
2. файлы, относящиеся к формам приложения (имена, используемые по умолчанию Delphi для первой созданной формы):
Unit1 .pas - исходные тексты программы, содержащие обработчики событий класса TForm1;
Unit1 .dfm - файл с описанием формы, её визуальных объектов и их свойств.
3. Файлы данных: файлы таблиц, индексов и т.д.
При использовании формата dBaseforWindows файлы таблиц имеют расширение *.dbf, а файлы индексов *.mdx.
Пример реализации БД о студентах
Постановка задачи: необходимо организовать хранение информации о студентах: № зачётной книжки, шифр группы, ФИО, год рождения, пол, предмет, среднюю оценку по предмету.
А. Определим структуру базы и введём условные обозначения:
Zach – номер зачётной книжки, целое 6 знаков;
Group – шифр группы, символьное, 4 символа;
Fam – фамилия символьное, 20 символов;
Nam – имя символьное, 20 символов;
Par – отчество символьное, 20 символов;
Year_b – год рождения, целое, 4 знака;
Sex – пол символьное, 1 символ;
Pred – предмет символьное, 10 символов;
Oz – оценка целое, 4 целых знака, 2 десятичных.
В. Разработаем таблицу с соответствующей структурой.
Для этого необходимо запустить утилиту DatabaseDesktop, выбрать опции меню File->New и заполнить соответствующие ячейки диалога задания структуры в соответствии с выбранной структурой (пункт А, рис. 2). После этого необходимо сохранить таблицу на диске в своём рабочем каталоге.
С. Создадим
Windows
-приложение для работы с данными.
Для этого необходимо запустить среду BorlandDelphi, выбрать опции меню File->New->Application, после чего откроется новый проект приложения. Далее следует перенести на макет формы приложения компоненты Table, DataSource, DBGrid, DBNavigator и настроить их свойства в соответствии с табл. 2.
Таблица 2. Свойства компонент приложения
Компонента |
Свойство |
Значение |
Table |
Name |
Table1 |
TableName |
Stud.dbf |
DataSource |
Name |
DataSource1 |
DataSet |
Table1 |
DBGrid |
Name |
DBGrid1 |
DataSource |
DataSource1 |
DBNavigator |
Name |
DBNavigator1 |
DataSource |
DataSource1 |
Внешний вид макета формы приложения должен соответствовать рис. 8.
После этого необходимо откомпилировать проект и осуществить ввод данных в таблицу (рис. 9).
ЛАБОРАТОРНАЯ РАБОТА №2
СОЗДАНИЕ WINDOWS-ПРИЛОЖЕНИЯ ДЛЯ РАБОТЫ С БАЗОЙ ДАННЫХ. ГЕНЕРАЦИЯ ОТЧЕТОВ.
Обработка информации однотабличной базы данных
Помимо хранения, редактирования, обновления и анализа данных в базе данных (БД), на практике часто возникает задача осуществления разного рода расчётов и вычислений с использованием хранящейся в БД информации. Например, для базы данных, хранящей информацию о студентах учебного заведения (см. методические указания к лабораторной работе №1) может возникнуть задача расчёта средней оценки студента по конкретному предмету или расчёта успеваемости группы. Поскольку требуемые расчёты могут быть довольно сложные, необходимо использование программных пакетов разработки приложений, объединяющих в себе как удобные средства доступа к БД различных форматов, так и гибкий язык программирования. С этой точки зрения наиболее удобным инструментом является среда визуальной разработки Windows-приложений Borland
Delphi
, обеспечивающая доступ к информации БД практически всех существующих форматов и возможность её обработки, используя язык Delphi
.
Визуальная навигация и управление данными в Borland
Delphi
производится с помощью компонент просмотра (
DBGrid
)
и управления (
DBNavigator
),
которые позволяют перемещаться по записям, удалять, добавлять или модифицировать их и т.д.
Программная навигация по записям таблицы возможна использованием соответствующих методов. Компонента Table
основана на базовом классе TTable
, в который инкапсулированы следующие методы навигации:
Next
-
перемещение указателя на следующую запись;
Prior
-
перемещение указателя на предыдущую запись;
First
-
перемещение указателя на первую запись таблицы;
Last
-
перемещение указателя на последнюю запись таблицы.
Например, если создан объект Table
,
свойством Name
которого является значение Table
1,
то оператор
Table
1.
First
;
переместит указатель на первую запись. Перечисленные методы позволяют последовательно перемещать указатель записи по таблице. Для определения последней записи таблицы используется ее свойство Eof
,
которое принимает значение true
,
когда указатель установлен на последней записи.
Фрагмент программы
Tabl
1.
Open
;
Table
1.
First
;
//перемещение на начало таблицы
While
not
Table
1.
EOF
do
//проверка на конец файла
Table
1.
Next
;
//перемещение на следующую запись
Table
1.
Close
;
показывает, как организовать последовательный просмотр всех записей таблицы.
Для программного управления записями таблицы в класс TTable
инкапсулированы следующие методы управления:
Delete
-
удаление текущей записи с позиционированием указателя на следующую запись;
Insert
-
добавление пустой записи в таблицу;
Edit
– перевод таблицы в режим редактирования;
Post
–
сохранение изменений в таблице.
Например, фрагмент программы
Table
1.
Last
;
Table
1.
Delete
;
Перечисленные методы позволяют оперировать с целыми записями таблицы.
При обработке данных таблицы часто требуется программно получить значение определенного поля записи или записать в него новое значение. Например, в БД студентов учебного заведения необходимо поменять оценку в одной записи, не изменяя значения остальных полей. Подобные операции с полями таблицы требуют создания объектов, указывающих на соответствующие поля.
Для создания подобных объектов нужно выполнить следующую последовательность действий:
- нажать правой клавишей мыши на соответствующем объекте Table
;
- в выведенном меню выбрать опцию Fields
Editor
,
в результате чего на экране появится диалог редактирования полей;
- нажать правой клавишей мыши в области диалога редактирования полей;
- в выведенном меню выбрать опцию Add
Fields
,
в результате чего на экране появится соответствующий диалог;
- добавить необходимые поля выбором кнопки Ok
.
В результате диалог редактирования полей должен содержать список созданных объектов, свойствакоторых отражены в окне Object
Inspector
.
Каждый из созданных объектов, указывающих на соответствующие поля, имеет свойство Name
.
Например, для таблицы с именем stud.dbf, содержащей фамилии студентов и их оценки с именами полей FAM
и OZ
,
для полей FAM
и OZ
будут созданы объекты с именами Table
1[‘
FAM
‘]и Table
1[‘
OZ
’].
Созданные объекты позволяютоперироватьс таблицей на уровне полей.
Фрагмент программы
Var
Soz
:
real
;
//переменная для средней оценки
N
:
integer
;
//счётчик записей
begin
Table1.First;
While not Table1.EOF do begin
soz:=soz+Table1[‘OZ’].Value;
//накоплениесуммы
n
:=
n
+1;
//увеличение счётчика записей
Table
1.
Next
;
//переход на след. запись
End;
if
(
n
<>0)
then
//проверка отсутствия записей
soz
:=
soz
/
n
;
//расчёт среднего
end
;
показывает, как вычислить среднюю оценку всех студентов. Для отображения на экране вычисленных данных можно, например, использовать объекты Label
(текстовая метка). Свойство Caption
объекта Label
отвечает за надпись на форме приложения.
Например, если имя объекта Label
1
, то фрагмент программы
var
buf : string[50];
buf:="
Средняя
оценка
:”+FloatToStr(soz);
Label1.Caption := buf;
позволяет отобразить на форме вычисленное значение средней оценки.
Свойство Caption
представляет собой данное специализированного типа AnsiString
,
позволяющего хранить символьные строки в формате отличном от формата хранения в символьном массиве. Для преобразования значения типа символьной строки в значение типа AnsiString
используется операция присваивания, справа от которой указывается символьная строка или ее адрес.
Для вывода разного рода списков плавающего размера используется компонента Memo. Добавление, например, фамилии студента в список будет осуществляться с помощью оператора:
Memo1.lines.Add(Table1[‘FAM’]);
Кроме ввода данных в таблицу, как правило, в программу требуется вводить другие исходные данные. Для ввода исходных данных в программу используются объекты Edit
. Объект Edit
имеет свойство Text
, которое является данным типа AnsiString
и содержит значение, введенное в поле ввода на форме приложения.
Например, если имя объекта Edit
1
, то фрагмент программы
Var
soz : real;
n : integer;
begin
soz:=0;
n:=0;
Table1.First;
While not Table1.EOF do begin
/* проверка совпадения поля FAM и текста в Edit1*/
if (Table1[‘FAM’] = Editl.Text) then begin
soz:=soz+Table1[‘OZ’];
n:=n+1;
end;
Table1.Next;
End;
If (n<>0) then soz:=soz/n;
End
;
позволяет рассчитать оценку не всех студентов, а конкретного студента, фамилия которого введена в поле ввода объекта Edit
1
.
Ряд методов в Borland Delphi специально предусмотрен для преобразования типов:
FloatToStr
() -
преобразование вещественного числа в строку;
IntToStr
() -
преобразование целого числа в строку;
StrToFloat
() -
преобразование строки в вещественное число;
StrToInt
() -
преобразование строки в целоечисло.
Как правило, программные модули выполняются в результате определенных действий пользователя. Например, фрагмент программы по расчёту и выводу средней оценки может выполняться при нажатии кнопки «Расчет».
Событие Click
(одинарное нажатие) объекта Button
(кнопка) позволяет определить функцию, выполняемую при нажатии на кнопку. За надпись на кнопке отвечает свойство Caption
.
Заголовок функции генерируется автоматическипри выборе в закладке Events
инспектора объектов соответствующего события и двойном щелчке напротив, сама функция инкапсулируется в класс Form
(форма) - основной класс приложения. В BorlandDelphi такие функции называются обработчиками событий, т. к. они содержат программный код, выполняющийся при наступлении соответствующего события этой компоненты. Например, если на форме с именем Form
1
разместить компоненту Button
с именем Button
1
и создать обработчик события Click
для компоненты Button
1
, в редакторе кода в файле Unit
1.
pas
будет создана пустая функция, которая должна содержать код, выполняемый, если произойдёт событие Click.
procedure TForm1.Button1Click(Sender: TObject);
begin
//код, выполняющийся при наступлении события OnClick //например, расчёт средней оценки студентов
end;
а в заголовочном файле unit
Unit1 в шаблоне класса TForm1 будет объявлена функция обработчика события Click.
procedure Button1Click(Sender: TObject);
Приведём вид формы приложения (рис. 9) примера работы с таблицей stud
.
dbf
, расчёта средней оценки студента, фамилия которого вводится в поле ввода и описание компонент приложения с пояснением настройки свойств и событий (табл. 1).
Рис. 1. Внешний вид формы приложения
Таблица 1. Свойства и события компонент приложения
Компонент |
Cвойство |
Значение |
Table |
Name |
Table1 |
TableName |
stud.dbf |
DataSource |
Name |
DataSource1 |
DataSet |
Table1 |
DBGrid |
Name |
DBGrid1 |
DataSource |
DataSource1 |
DBNavigator |
Name |
DBNavigator1 |
DataSource |
DataSource1 |
ShowHint |
TRUE (показывает подсказки к кнопкам навигатора) |
Button |
Name |
Button1 |
Caption |
"Расчёт средней оценки студентов" |
Label |
Name |
Label1 |
Caption |
Определяется в обработчике события OnClick компоненты Button1 |
Edit |
Name |
Edit1 |
Text |
Определяется пользователем |
Компонент |
Cобытие |
Значение |
Button |
OnClick |
Одинарное нажатие на кнопку |
На рис. 2 показан вид работающего Windows-приложения после отладки и компиляции проекта, запускаприложения,
ввода в поле ввода фамилии Петров и нажатия кнопки "Расчёт средней оценки".
Рис. 2. Внешний вид работающего приложения
3. Печать данных
A. Для осуществления печати результатов, представления данных в удобной для просмотра форме удобно использовать так называемые отчёты. В Borland Delphi имеется набор компонент для быстрой визуальной разработки отчётов. За автоматическую генерацию отчёта отвечает компонента TRVTableConnect
(вкладка Rave). Вся дальнейшая работа осуществляется под управлением утилиты RaveReportDesigner.
Для создания отчёта необходимо выполнить последовательность действий:
1. Для вызова утилиты выберите в главном меню команду Tools
->
Rave
Designer
.
2. C помощью команды File
->
New
Data
Object
вызовите окно DataConnection, в котором выберите продолжение Direct
Data
View
, и после щелчка на кнопке Next
-
RvTableConnection
1
. Таким образом, отчет связывается с источником данных, которые он будет отображать.
3. Вызовите мастера создания отчета по данным, получаемым из единственной таблице командой Tools
->
Report
Wizards
->
Simple
Table
. Этот мастер с помощью последовательно раскрывающихся окон определяет основные параметры отчета.
4. Для подготовки проекта отчета скорректируйте размеры полос и взаимное расположение на них компонент.
5. Для указания связи приложения с проектом имя файла отчета (*.rav) помещается в свойство ProjectFile
компоненты TrvProject
, которую необходимо поместить на форму.
6. Напишите обработчик события щелчка на кнопке Отчет
:
procedure TForm1.Button1Click (Sender: TObject);
Begin
RvProject1.Execute;
End
;
B. Существует альтернативная технология создания отчетов в DelphiQuick
Report
.
Этот компонент всегда помещается на пустую форму, образуя с ее помощью визуальную среду конструирования отчета.
Для создания отчёта необходимо выполнить последовательность действий:
1. Создать дополнительную форму для отчёта,выбрав опции меню File->NewForm, вынести на форму отчёта компоненту TQuickRep
из вкладки Qreport
и сохраните.
2. Эта форма не будет создаваться автоматически в момент старта программы, поэтому после ее присоединения к проекту выберите команду Project
->
Options
и перенесите ее в список доступных форм Available
forms
.
3. С помощью команды File
->
Use
unit
связать новую форму с модулем данных, после чего поместить в свойство DataSet
компонента QuickRep
1
значение того набора данных, который будет содержать основную информацию.
4. Вынести на форму отчёта компоненты QRBand
(полосы отчёта). Эта компонента является частью печатной страницы, т.е. основанием для ввода данных. В зависимости от свойств BandType
различают несколько типов компонентыQRBand
: заголовочная полоса (
rbTitle
)
выводится только один раз в начале страницы (может содержать заголовок и наименования столбцов таблицы); полоса данных (
rbDetail
)
содержит значения полей текущей записи и выводится столько раз, сколько записей в таблице; rbSummary
выводится один раз в конце отчёта.
5. Установить значение свойства BandType
компоненты QRBand
.
Рекомендуется выносить как минимум две полосы: заголовочную и данных.
6. На заголовочную полосу вынести компоненты QRLabel
(аналогичны компонентам Label). Свойство Caption
содержит выводимую на печать информацию (например, наименования столбцов, поясняющие надписи, расчётные значения и т.д.).
7. На полосу данных вынести компоненты QRDBText
,
отображающие значения определённых полей таблицы. Свойство DataSource
устанавливает имя источника данных, а свойства DataField
—
имя выводимого поля.
8. Скорректировать размеры полос и взаимное расположение на них компонент.
Предварительный просмотр на стадии проектирования приложения осуществляется двойным щелчком мыши на объекте QuickRep
1.
Макет формы печати данных таблицы stud.dbf и рассчитанной средней оценкипредставлен на рис. 3.
Рис. 3. Внешний вид формы печати
Вывод данных на печать из программы выполняется встроенным в компоненту TQuickRep
методом Print
.
Например, если имя компоненты TQuickRep
- QuickRe
p
1
, то оператор
Form2.QuickRep1.Print;
выведет данные на печать, а
Form2:=TForm2.Create(Self);
Form2.QuickRep1.Preview;
Form
2.
Free
;
осуществит предварительный просмотр на экране.
Необходимо предусмотреть в программе вывод в отчёт расчётных значений с использованием компоненты QRLabel
.
При предварительном просмотре или выводе на печать данные будут отображены в следующем виде (рис. 4).
Рис. 4. Данные таблицы
stud
.
dbf
при предварительном просмотре
Пример реализации программы расчёта средней оценки
Постановка задачи: необходимо организовать хранение информации о студентах: № зачётной книжки, шифр группы, ФИО, год рождения, пол, предмет, среднюю оценку по предмету. Обеспечить расчёт средней оценки для любого студента.
А.
Создадим таблицу соответствующей структуры и Windows-приложение для работы с БД (см. методические указанияк лабораторной работе №1).
B.
Вынесем на макет формы приложения компоненту Edit с именем Edit1, компоненту Label с именем Label1 и компоненту Button с именем Button1 (см. рис. 1). Настроим свойства этих компонент в соответствии с табл. 1. Создадим обработчик события Click для компоненты Button1 и напишем в обработчике следующий код:
Var
soz : real;
n : integer;
buf : string[50];
begin
soz:=0;
n:=0;
Table1.First;
While not Table1.EOF do begin
/* проверка совпадения поля FAM и текста в Edit1*/
if (Table1[‘FAM’] = Editl.Text) then begin
soz:=soz+Table1[‘OZ’];
n:=n+1;
end;
Table1.Next;
End;
If (n<>0) then soz:=soz/n;
buf:="
Средняя
оценка
:”+FloatToStr(soz);
Label1.Caption := buf;
QRLabel10.Caption := buf;
End
;
C.
Создадим вторую форму выбором меню File->New. Вынесем на форму компоненту QuickRep
из вкладки QReport
..
Вынесем на форму отчёта три компоненты QRBand
(со свойствами BandType
rbTitle
, rbDetail
и rbSummary
). На заголовочную полосу вынесем компоненты QRLabel
и настроим свойство Caption для отображения названия отчёта и столбцов. На полосу данных вынесем компоненты QRDBText
и настроим их на связь с соответствующими полями. На последнюю полосу вынесем компоненту QRLabelc именем QRLabel10. Внешний вид и расположение компонент соответствует рис. 3. Просмотр отчёта организуем добавлением компоненты Button2 и обработчиком события Click следующего содержания:
Form2:=TForm2.Create(Self);
Form2.QuickRep1.Preview;
Form
2.
Free
;
После компиляции проекта необходимо проверить правильность работы программы.
ЛАБОРАТОРНАЯ РАБОТА №3
ОБРАБОТКА ИНФОРМАЦИИ БАЗЫ ДАННЫХ, ИМЕЮЩЕЙ СТРУКТУРУ «
master
-
detail
». ИЗУЧЕНИЕ ОСНОВ
SQL
.
Основные сведения о ссылочной целостности. Задание индексов.
Для выполнения задания, необходимо сформировать в DatabaseDesktop (DBD) структуры 2-х таблиц типа Paradox7, между которыми будет организована связь «один-ко-многим».
Рис. 1 Структура основной и подчиненной таблиц в
Paradox
7.
Данные структур сохраним в папке WorkDir
с именами stud
.
db
и
ozen
.
db
.
Ссылочная целостность
обеспечивает однозначное соответствие значений в поле одной таблицы значениям связанного поля в другой. Кроме обеспечения равенства значений в связанных полях при вводе, ссылочная целостность обеспечивает сохранение этого условия при внесении изменений в связанные поля подчиненной таблицы, отображая их в основной. В Paradox она также запрещает удаление записей в основной таблице
, если они используют данные из подчиненной таблицы
.
Итак, в организации ссылочной целостности присутствуют 2 таблицы, одна из них содержит данные (подчиненная), другая использует эти данные (основная). Осуществляется она через поля основной и подчиненной таблиц. При этом в основной таблице можно использовать только ключевые поля, а в подчиненной – индексированные, причем выбранные для связи поля автоматически становятся индексированными. Из основной таблицы можно организовывать связь с несколькими подчиненными.
Для организации связи 2-х таблиц с помощью DataDesktop в окне задания структуры, когда в нем находится структура подчиненной таблицы
(в нашем случае, ozen
.
db
), следует у списка Table
properties
(характеристики таблицы) выбрать значение Referential
Integrity
(ссылочная целостность), после чего определить Define
связь. В открывшемся окне задаем характеристики связи таблиц, выбрав в левом окне поле для организации связи, в правом – имя требуемой таблицы (двойным щелчком мыши). Естественно, что количество выбранных полей из каждой таблицы и их типы должны совпадать
.
Рис. 2 Связь подчиненной и основной таблицы по ключевым полям.
Здесь же можно задать характеристики связи: 1) правило обновления (updaterule) – для определения варианта обновления значений в подчиненной таблице при изменении или удалении связанных значений в основной (каскадный, запрещенный); 2) выключатель защиты целостности (strictreferentialintegrity) – для определения невозможности изменения данных в таблицах, для которых установлена ссылочная целостность. После определения параметров связи задаем имя связи.
Идентифицируем параметры всех связей основной таблицы:
Теперь зададим вторичные индексы. Данная операция используется для ускорения поиска в таблицах необходимой информации по значениям в конкретных полях. Индексирование в Paradox приводит к созданию специальных файлов по каждому индексу, такой файл содержит записи, включающие значения индекса (одно или несколько полей) и указатель на соответствующую запись в таблице. Выбрав нужное значение индекса, можно затем по указателю найти и саму запись.
Для задания вторичных индексов с помощью DBD, следует у списка Table
properties
(характеристики таблицы) выбрать значение Secondary
Indexes
(вторичные индексы), после чего определить Define
поля, используемые в индексе, их последовательность (!!!) и ряд характеристик: 1) уникальность (unique); 2) режим обновления (maintained); 3) чувствительность к регистру (casesensitive); 4) порядок сортировки (descending). По завершению формирования индекса задаем имя индекса.
Предварительно сформируем таблицу, в которой перечислим все индексы и их характерные особенности:
Имя индекса
|
Поля
|
Unique
|
Maintained
|
Case sensitive
|
Descending
|
ind |
Naim |
Ö |
Zach |
Zach
Oz
|
Ö |
Отметим, что для задания каждого индекса следует выполнять всю последовательность выше указанных действий. Нельзя, например, переместить все поля, используемые в индексах, в правый список, а затем выполнить оставшиеся действия, так как в этом случае будет создан 1 индекс сразу по всем выделенным полям.
Рис. 3 Задание вторичного индекса.
3. Задание псевдонимов в
BDE
Administrator
.
Располагать все таблицы БД, а также программы СУБД желательно в отдельной папке, которой к тому же следует задать псевдоним для более простого обращения к данным (до сих пор псевдонимы нами не были использованы
).
Для задания псевдонима можно воспользоваться утилитой BDEAdministrator, поставляемую в составе большинства продуктов корпорации Inprise (Borland). Утилита BDEAdministrator находится в меню "Пуск"Прог
paммы -> Borland Delphi ->
BDE Administrator
.
В левой части окна следует открыть страницу Databases
, содержащую список псевдонимов, в правой части появятся его характеристики.
Рис. 4. Окно
BDE
.
Для добавления псевдонима задаем либо Object
.
New
, либо по правой кнопке мыши в дополнительном меню выбираем New. Из списка драйверов выбираем значение Standard
, используемое для создания псевдонима БД в формате Paradox.
Изменив имя псевдонима, рассмотрим набор его характеристик: 1) type – название драйвера, на основе которого был создан псевдоним, 2) defaultdriver – название драйвера, который подключается к файлу БД первым, 3) enablebcd – признак перевода значений десятичных полей в двоично-десятичное представление, 4) path – путь к папке, где находятся таблицы БД.
4. Установка связей между компонентами и БД. Создание меню.
Теперь разместив на форме диалога компонент Menu
с палитры компонентов Стандарт
, сформируем простое меню, задавая названия пунктов меню свойству Items
. Для Поиск
– подменю: SQL
и фильтрация
, для Сортировка
– по фамилии
, по наименованию дисциплин
и пункт Выход
. Обратите внимание на порядок задания имен, в свойстве Name
каждого пункта будет отображен этот номер.
Модуль пункта меню Выход
будет самым информативным: Close();
Предыдущие приложения (л/р№1, 2) разрабатывались для ведения данных одной таблицы. Здесь же, одна из связанных таблиц является головной (master
,
таблица stud), а другая вспомогательной, детализирующей (detail
, таблица ozen).
Итак, разместив в окне 2 комплекта Table, DataSource и средства отображения данных DBGrid, зададим их цепочку связи, которую можно представить схемой (рис.6). Связь с БД устанавливается в итоге значением true свойства Active.
Для связи в форме этих таблиц, временно разорвем связь, указав для вспомогательной таблицы ozen значение false для свойства Active.
Рис. 5 Форма диалога приложения БД
Рис. 6 Схема взаимодействия компонентов
Delphi
с БД.
Далее в свойстве MasterSource
компонента Table
, настроенного на вспомогательную таблицу, установите имя головной таблицы. После этого щелкните на свойстве MasterFields
. Откроется окно редактора связей полей (Field
Link
Designer
). Индексировать таблицу надо так, чтобы индекс включал ключевое поле связи Zach
. После этого можете восстанавливать связь с БД (Active
=
true
) и запустить приложение.
Теперь немного об удобстве вода данных в форму. Для полей просмотра в DBGrid
можно в свойстве Columns
задать значение свойства ButtonStyle
поля равным cbsAuto
и тогда при редактировании данных автоматически будет появляться выпадающий список, из которого пользователь может выбирать соответствующее значение (например, для поля group
).
На форму можно добавить кнопки Добавить, Удалить, Сохранить, Отменить
с соответствующими обработчиками событий:
Table
1.
Append
;
\\ метод, добавляющий новую запись в БД
Table
1.
DeleteRecords
(
arCurrent
);
\\ удаление записи, на которой стоит курсор текущей записи
Table
1.
Post
;
\\ сохранение изменений в БД
Table
1.
Cancel
;
\\отмена действий пользователя
Для корректного удаления записи, можно предварительно уточнить требование у пользователя:
If (Application.MessageDlg (
“Действительно хотите удалить запись?”,
“Подтвердите удаление записи”,
MB_YESNO + MB_ICONQUESTION) = IDYES) then
Table
1.
Delete
;
который после положительного ответа на вопрос программы удаляет текущую запись.
5. Поиск данных.
Одна из важнейших для пользователя операций с БД – поиск записей по некоторому ключу. Для их применения таблица должна быть предварительно проиндексирована по этому полю.
В работе мы рассмотрим только фильтрацию записей (Filter
для компонента Table
)и применение запросов к БД при помощи компонента Query
.
a) Компонент Table позволяет не только отображать, редактировать и упорядочивать данные, но и фильтровать записи по определенным критериям. Фильтрация задается свойствами Filter
, Filtered
и FilterOptions
компонента Table
. Для отображения отфильтрованных записей по вами заданному критерию, добавим на Form1 надпись и текстовой поле, установив предварительно их свойства Visible
в состояние false
. А пункту меню Фильтрация
назначим функцию:
begin
Label1.Visible:=true;
Edit1.Visible:=true;
if (Edit1.Text<>’’) then begin
Table1.Filtered:=false;
Table1.Filter:=’group=’+Edit1.Text;
Table1.Filtered:=true;
end else
ShowMessage("
Укажите
номер
группы
!!!");
end
;
б) Основное свойство Query – SQL, имеющее тип Tstrings. Это список строк, содержащих запросы SQL. Создайте для этого новую форму (рис. 7) с модулем Unit2. Пропишите в unit ее заголовок (как мы это уже делали в л/р№2) и назначьте вызов для пункта меню SQL: Form2.Show;
ПеренеситенаформукомпонентыQuery1
(вместо Table1), DataSource1
, DBGrid1
исоединитеихобычнойцепочкой: вDBGrid1
задайтесвойствоDataSource
равнымDataSource1
, авDataSource1
задайтесвойствоDataSet
равнымQuery1
. Компонент Query
1
настройте на таблицу ozen
. Для этого установите свойство DataBaseName
на псевдоним qwerty
, а в свойстве SQL
напишите оператор: select
*
from
ozen
.
Рис. 7. Форма
SQL
-запросов к БД.
Чтобы вы могли самостоятельно формировать произвольные запросы, перенесите на форму обычное (не db) поле Memo
и кнопку Выполнить
, для которой можно задать функцию:
begin
if (Query1.Active=true) then Query1.Close;
Query1.SQL.Clear;
Query1.SQL.AddStrings(Memo1.Lines);
Query1.ExecSQL;
end;
Сохраните все операции и запустите приложение с различными видами запросов на выборку, на добавление, на удаление, на обновление.
|