База данных 3

Само задание:

Учет движения продуктов по складу горюче-смазочных материалов. Составить базу данных, полями которой являются: шифр продукта, наиме­нование продукта, объем, признак прибытие/убытие, дата, наименование (фамилия) потребителя/поставщика номер счета потребителя/поставщика, адрес, телефон и др. Вывести динамику поступления-убытия каждого кон­кретного продукта, а также общий объем движения продуктов на складе ГСМ (сколько прибыло и убыло за текущий месяц).

Что нужно проделать

ЛАБОРАТОРНАЯ РАБОТА №1

ОСНОВЫ ПОСТРОЕНИЯ БАЗЫ ДАННЫХ

В СРЕДЕ BORLAND DELPHI

Определение структуры таблицы

Например, в учебном управлении высшего учебного за­ведения необходимо хранить информацию о студентах заведения: № зачетной книжки, шифр группы, ФИО, год рождения, пол, предмет, среднюю оценку по предмету.

Таблица БД пред­ставляет собой обычную двумерную таблицу с характеристи­ками (атрибутами) какого-то множества объектов и имеющая имя – идентификатор, по которому на нее можно сослаться.

Таблица 1. Данные о студентах

№ зач. книж­киГруп­паФамилияИмяОтчествоГод рожде­нияПолПредметОценка
ZachGroupFamNamParYear_bSexPredOz
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. Свойства компонент приложения

КомпонентаСвойствоЗначение
TableNameTable1
TableNameStud. dbf
DataSourceNameDataSource1
DataSetTable1
DBGridNameDBGrid1
DataSourceDataSource1
DBNavigatorNameDBNavigator1
DataSourceDataSource1

Внешний вид макета формы приложения должен соответствовать рис. 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войствоЗначение
TableNameTable1
TableNameStud. dbf
DataSourceNameDataSource1
DataSetTable1
DBGridNameDBGrid1
DataSourceDataSource1
DBNavigatorNameDBNavigator1
DataSourceDataSource1
ShowHintTRUE (показывает подсказки к кноп­кам навигатора)
ButtonNameButton1
Caption“Расчет средней оценки студентов”
LabelNameLabel1
CaptionОпределяется в обработчике события OnClick компоненты Button1
EditNameEdit1
TextОпределяется пользователем
КомпонентCобытиеЗначение
ButtonOnClickОдинарное нажатие на кнопку

На рис. 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). По завершению формирования индекса задаем имя индекса.

Предварительно сформируем таблицу, в которой перечислим все индексы и их характерные особенности:

Имя индексаПоляUniqueMaintainedCase sensitiveDescending
IndNaimÖ
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;

Сохраните все операции и запустите приложение с различными видами запросов на выборку, на добавление, на удаление, на обновление.


1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (No Ratings Yet)
Loading...

Зараз ви читаєте: База данных 3