База данных 3

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

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

	

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

	

	ЛАБОРАТОРНАЯ РАБОТА №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. имя поля (Field Name)  2. тип (Type)   3. размер (Size)  4. число десятичных знаков (Dec) и др. 

В dBase for Windows используются типы полей: Character(C) - символьное; Float(F) - вещественное (с высокой точностью); Number(N) - целое, вещественное (с точностью в 2 десятичных знака); Date(D) - дата; Logical(L) - логическое; Мето(М) - текстовое без ограничения длины; Binary(B) - двоичное (рисунки и другие объекты). 

Выбор типа поля осуществляется нажатием клавиши <пробел> или правой клавишей «мыши». 

Для примера БД студентов учебного заведения структура файла таблицы может быть представлена в виде (рис. 2). 















































Рис. 2 Диалог задания структуры таблицы



 Изменение кодовой страницы для поддержки русского языка осуществляется следующим образом: в окошке Table Properties из выпадающего списка выбирается пункт Table Language, после чего необходимо нажать кнопку Modify; в появившемся диалоге Table Language указывается кодовая страница dBase RUScpp866. 

После задания структуры таблицы, её сохранение производится выбором кнопки Save As. В диалоге указывается имя файла таблицы (например, stud.dbf). 

Если необходимо в дальнейшем изменить структуру таблицы,      следует   открыть таблицу в Database Desktop и выбрать в главном меню пункты Table->Restructure. 

После создания таблицы возможно её редактирование и использование в прикладных программах. 



Разработка приложения для работы с таблицей данных 



Для разработки системы управления базой данных можно воспользоваться как стандартными СУБД (Access, Paradox, dBase и т.д.), так и разработать самостоятельное приложение для работы с БД.  

Разработка самостоятельного приложения для работы с БД имеет ряд преимуществ по сравнению с использованием готовых пакетов:

 1) ресурсы ОС задействованы только для тех задач, которые будут реализованы в СУБД; 

2) полученные программные модули очень компактны; 

3) обеспечивается более высокое быстродействие вследствие использования только необходимых для решения задачи операций с БД; 

4) многообразие реализаций максимально удобного интерфейса пользователя с СУБД; 

5) возможность интегрироваться в любые программные приложения; 

6) осуществление расчётных задач сложности, которая не может быть обеспечена применением готовых СУБД. 

Для разработки системы управления базой данных воспользуемся интегрированной средой визуальной разработки Windows-приложений Borland Delphi. Одним из важнейших достоинств Delphi является наличие удобных средств быстрой визуальной разработки приложений с использованием специализированных компонент доступа и управления базами данных, генерации отчётов, запросов SQL, a так же наличие технологии Borland Database Engine (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 являются служебными и относятся к невидимым (т. е. отображаются на стадии разработки приложения и не отображаются в процессе выполнения), a Data 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. Файлы данных: файлы таблиц, индексов и т.д. 

При использовании формата dBase for Windows файлы таблиц имеют расширение *.dbf, а файлы индексов *.mdx. 

  

Пример реализации БД о студентах 



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

А. Определим структуру базы и введём условные обозначения: 

Zach – номер зачётной книжки, целое 6 знаков; 

Group – шифр группы, символьное, 4 символа; 

Fam – фамилия символьное, 20 символов; 

Nam – имя символьное, 20 символов; 

Par – отчество символьное, 20 символов; 

Year_b – год рождения, целое, 4 знака; 

Sex – пол символьное, 1 символ; 

Pred – предмет символьное, 10 символов; 

Oz – оценка целое, 4 целых знака, 2 десятичных. 

В. Разработаем таблицу с соответствующей структурой. Для этого необходимо запустить утилиту Database Desktop, выбрать опции меню File->New и заполнить соответствующие ячейки диалога задания структуры в соответствии с выбранной структурой (пункт А, рис. 2). После этого необходимо сохранить таблицу на диске в своём рабочем каталоге. 

 С. Создадим Windows-приложение для работы с данными. Для этого необходимо запустить среду Borland Delphi, выбрать опции меню 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 которого является значение Table1, то оператор 

Table1.First; 

переместит указатель на первую запись. Перечисленные методы позволяют последовательно перемещать указатель записи по таблице. Для определения последней записи таблицы используется ее свойство Eof, которое принимает значение true, когда указатель установлен на последней записи. 

Фрагмент программы 

  

Tabl1.Open;

Table1.First;//перемещение на начало таблицы          

While not Table1.EOF do//проверка на конец файла 

 Table1.Next;//перемещение на следующую запись 

Table1.Close; 

  

показывает, как организовать последовательный просмотр всех записей таблицы. 

Для программного управления записями таблицы в класс TTable инкапсулированы следующие методы управления: 

Delete - удаление текущей записи с позиционированием указателя на следующую запись; 

Insert - добавление пустой записи в таблицу; 

Edit – перевод таблицы в режим редактирования; 

Post – сохранение изменений в таблице. 

Например, фрагмент программы 

  

Table1.Last; 

Table1.Delete; 

  позволяет удалить последнюю запись таблицы. 

Перечисленные методы позволяют оперировать с целыми записями таблицы. 

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

Для создания подобных объектов нужно выполнить следующую последовательность действий: 

	-         нажать правой клавишей мыши на соответствующем объекте Table; 

	-         в выведенном меню выбрать опцию Fields Editor, в результате чего на экране появится диалог редактирования полей; 

- нажать правой клавишей мыши в области диалога редактирования полей; 

- в выведенном меню выбрать опцию Add Fields, в результате чего на экране появится соответствующий диалог; 

- добавить необходимые поля выбором кнопки Ok. В результате диалог редактирования полей должен содержать список созданных объектов, свойства которых отражены в окне Object Inspector. Каждый из созданных объектов, указывающих на соответствующие поля, имеет свойство Name. 

Например, для таблицы с именем stud.dbf, содержащей фамилии студентов и их оценки с именами полей FAM и OZ, для полей FAM и OZ будут созданы объекты с именами     Table1[‘FAM ‘]и Table1[‘OZ’]. 

Созданные объекты позволяют оперировать с таблицей на уровне полей. 

Фрагмент программы 

  

Var

  Soz : real;//переменная для средней оценки 

  N   : integer;    //счётчик записей 

begin

  Table1.First; 

  While not Table1.EOF do begin 

      soz:=soz+Table1[‘OZ’].Value;//накопление суммы 

 n:=n+1;//увеличение счётчика записей 

 Table1.Next;//переход на след. запись 

  End; 

  if (n<>0) then//проверка отсутствия записей 

     soz := soz/n;//расчёт среднего 

end;

  

показывает, как вычислить среднюю оценку всех студентов. Для отображения на экране вычисленных данных можно, например, использовать объекты Label (текстовая метка). Свойство Caption объекта Label отвечает за надпись на форме приложения. 

Например, если имя объекта Label1, то фрагмент программы 

  

var

  buf : string[50]; 

buf:="Средняя оценка:”+FloatToStr(soz); 

Label1.Caption := buf; 

  

позволяет отобразить на форме вычисленное значение средней оценки. 

Свойство Caption представляет собой данное специализированного типа AnsiString, позволяющего хранить символьные строки в формате отличном от формата хранения в символьном массиве. Для преобразования значения типа символьной строки в значение типа AnsiString используется операция присваивания, справа от которой указывается символьная строка или ее адрес. 

Для вывода разного рода списков плавающего размера используется компонента Memo. Добавление, например, фамилии студента в список будет осуществляться с помощью оператора: 

  

Memo1.lines.Add(Table1[‘FAM’]); 

  

Кроме ввода данных в таблицу, как правило, в программу требуется вводить другие исходные данные. Для ввода исходных данных в программу используются объекты Edit. Объект Edit имеет свойство Text, которое является данным типа         AnsiString и содержит значение, введенное в поле ввода на форме приложения. 

Например, если имя объекта Edit1, то фрагмент программы 

  



  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;

  позволяет рассчитать оценку не всех студентов, а конкретного студента, фамилия которого введена в поле ввода объекта Edit1. 

Ряд методов в Borland Delphi специально предусмотрен для преобразования типов: 

FloatToStr() - преобразование вещественного числа в строку; 

IntToStr() - преобразование целого числа в строку; 

StrToFloat() - преобразование строки в вещественное  число; 

StrToInt() - преобразование строки в целое число. 

Как правило, программные модули выполняются в результате определенных действий пользователя. Например, фрагмент программы по расчёту и выводу средней оценки может выполняться при нажатии кнопки «Расчет». Событие Click (одинарное нажатие) объекта Button (кнопка) позволяет определить функцию, выполняемую при нажатии на кнопку. За надпись на кнопке отвечает свойство Caption. 

Заголовок функции генерируется автоматически при выборе в закладке Events инспектора объектов соответствующего события и двойном щелчке напротив, сама функция инкапсулируется в класс Form (форма) - основной класс приложения. В Borland Delphi такие функции называются обработчиками событий, т. к. они содержат программный код, выполняющийся при наступлении соответствующего события этой компоненты. Например, если на форме с именем Form1 разместить компоненту Button с именем Button1 и создать обработчик события Click для компоненты Button1, в редакторе кода в файле Unit1.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). Вся дальнейшая работа осуществляется под управлением утилиты Rave Report Designer.

Для создания отчёта необходимо выполнить последовательность действий: 

1. Для вызова утилиты выберите в главном меню команду Tools-> Rave Designer. 

2. C помощью команды File->New Data Object вызовите окно Data Connection, в котором выберите продолжение Direct Data View, и после щелчка на кнопке Next-RvTableConnection1. Таким образом, отчет связывается с источником данных, которые он будет отображать.

3. Вызовите мастера создания отчета по данным, получаемым из единственной таблице командой Tools-> Report Wizards -> Simple Table. Этот мастер с помощью последовательно раскрывающихся окон определяет основные параметры отчета.

4. Для подготовки проекта отчета скорректируйте размеры полос и взаимное расположение на них компонент. 

5. Для указания связи приложения с проектом имя файла отчета (*.rav) помещается в свойство ProjectFile компоненты TrvProject, которую необходимо поместить на форму.

6. Напишите обработчик события щелчка на кнопке Отчет:



procedure TForm1.Button1Click (Sender: TObject);

Begin

  RvProject1.Execute;

End;



B. Существует альтернативная технология создания отчетов в Delphi Quick Report.

Этот компонент всегда помещается на пустую форму, образуя с ее помощью визуальную среду конструирования отчета.

Для создания отчёта необходимо выполнить последовательность действий: 

1. Создать дополнительную форму для отчёта, выбрав опции меню File->New Form, вынести на форму отчёта компоненту TQuickRep  из вкладки Qreport и сохраните.

2. Эта форма не будет создаваться автоматически в момент старта программы, поэтому после ее присоединения к проекту выберите команду Project-> Options и перенесите ее в список доступных форм Available forms.

3. С помощью команды File->Use unit связать новую форму с модулем данных, после чего поместить в свойство DataSet компонента QuickRep1 значение того набора данных, который будет содержать основную информацию.

4. Вынести на форму отчёта компоненты QRBand (полосы отчёта). Эта компонента является частью печатной страницы, т.е. основанием для ввода данных. В зависимости от свойств BandType различают несколько типов компоненты QRBand: заголовочная полоса (rbTitle) выводится только один раз в начале страницы (может содержать заголовок и наименования столбцов таблицы); полоса данных (rbDetail) содержит значения полей текущей записи и выводится столько раз, сколько записей в таблице; rbSummary выводится один раз в конце отчёта. 

5. Установить значение свойства BandType компоненты QRBand. Рекомендуется выносить как минимум две полосы: заголовочную и данных. 

6. На заголовочную полосу вынести компоненты QRLabel (аналогичны компонентам Label). Свойство Caption содержит выводимую на печать информацию (например, наименования столбцов, поясняющие надписи, расчётные значения и т.д.). 

7. На полосу данных вынести компоненты QRDBText, отображающие значения определённых полей таблицы. Свойство DataSource устанавливает имя источника данных, а свойства DataField — имя выводимого поля. 

8. Скорректировать размеры полос и взаимное расположение на них компонент. 

Предварительный просмотр на стадии проектирования приложения осуществляется двойным щелчком мыши на объекте QuickRep1.



Макет формы печати данных таблицы stud.dbf и рассчитанной средней оценки представлен на рис. 3. 



































Рис. 3. Внешний вид формы печати 



 Вывод данных на печать из программы выполняется встроенным в компоненту TQuickRep методом Print. 

Например, если имя компоненты TQuickRep - QuickRep1, то оператор 

Form2.QuickRep1.Print;  

выведет данные на печать, а 

Form2:=TForm2.Create(Self);

Form2.QuickRep1.Preview; 

Form2.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 и настроим их на связь с соответствующими полями. На последнюю полосу вынесем компоненту QRLabel c именем QRLabel10. Внешний вид и расположение компонент соответствует рис. 3. Просмотр отчёта организуем добавлением компоненты Button2 и обработчиком события Click следующего содержания: 

Form2:=TForm2.Create(Self);

Form2.QuickRep1.Preview; 

Form2.Free;



После компиляции проекта необходимо проверить правильность работы программы. 









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

	ОБРАБОТКА ИНФОРМАЦИИ БАЗЫ ДАННЫХ, ИМЕЮЩЕЙ СТРУКТУРУ «master-detail». ИЗУЧЕНИЕ ОСНОВ SQL.



 Основные сведения о ссылочной целостности. Задание индексов.

Для выполнения задания, необходимо сформировать в Database Desktop (DBD) структуры 2-х таблиц типа Paradox7, между которыми будет организована связь «один-ко-многим».



















Рис. 1 Структура основной и подчиненной таблиц в Paradox7.



Данные структур сохраним в папке WorkDir  с именами stud.db и ozen.db.

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

Итак, в организации ссылочной целостности присутствуют 2 таблицы, одна из них содержит данные (подчиненная), другая использует эти данные (основная). Осуществляется она через поля основной и подчиненной таблиц. При этом в основной таблице можно использовать только ключевые поля, а в подчиненной – индексированные, причем выбранные для связи поля автоматически становятся индексированными. Из основной таблицы можно организовывать связь с несколькими подчиненными.

Для организации связи 2-х таблиц с помощью Data Desktop  в окне задания структуры, когда в нем находится структура подчиненной таблицы (в нашем случае, ozen.db), следует у списка Table properties (характеристики таблицы) выбрать значение Referential Integrity (ссылочная целостность), после чего определить Define связь. В открывшемся окне задаем характеристики связи таблиц, выбрав в левом окне поле для организации связи, в правом – имя требуемой таблицы (двойным щелчком мыши). Естественно, что количество выбранных полей из каждой таблицы и их типы должны совпадать. 



































Рис. 2 Связь подчиненной и основной таблицы по ключевым полям.



Здесь же  можно задать характеристики связи: 1) правило обновления (update rule) – для определения варианта обновления значений в подчиненной таблице при изменении или удалении связанных значений в основной (каскадный, запрещенный); 2) выключатель защиты целостности (strict referential integrity) – для определения невозможности изменения данных в таблицах, для которых установлена ссылочная целостность. После определения параметров связи задаем имя связи.

Идентифицируем параметры всех связей основной таблицы:



Имя связи

Поле младшей таблицы

Старшая таблица

Update rule

Strict Referential Integrity







Cascade

Prohibit



sv

Zach

stud







…

…

…

…

…

…



Теперь зададим вторичные индексы. Данная операция используется для ускорения поиска в таблицах необходимой информации по значениям в конкретных полях. Индексирование в Paradox приводит к созданию специальных файлов по каждому индексу, такой файл содержит записи, включающие значения индекса (одно или несколько полей) и указатель на соответствующую запись в таблице. Выбрав нужное значение индекса, можно затем по указателю найти и саму запись.

Для задания вторичных индексов с помощью DBD, следует у списка Table properties (характеристики таблицы) выбрать значение Secondary Indexes (вторичные индексы), после чего определить Define поля, используемые в индексе, их последовательность (!!!) и ряд характеристик: 1) уникальность (unique); 2) режим обновления (maintained); 3) чувствительность к регистру (case sensitive); 4) порядок сортировки (descending). По завершению формирования индекса  задаем имя индекса.

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

	Имя индекса

	Поля

	Unique

	Maintained

	Case sensitive

	Descending

	ind

	Naim

	

	

	

	

	Zach

	Zach

	Oz

	

	

	

	

	



	Отметим, что для задания каждого индекса следует выполнять всю последовательность выше указанных действий. Нельзя, например, переместить все поля, используемые в индексах, в правый список, а затем выполнить оставшиеся действия, так как в этом случае будет создан 1 индекс сразу по всем выделенным полям.	





Рис. 3 Задание вторичного индекса.

3. Задание псевдонимов в BDE Administrator.



Располагать все таблицы БД, а также программы СУБД желательно в отдельной папке, которой к тому же следует задать псевдоним для более простого обращения к данным (до сих пор псевдонимы нами не были использованы). 

Для задания псевдонима можно воспользоваться утилитой BDE Administrator, поставляемую в составе большинства продуктов корпорации Inprise (Borland). Утилита BDE Administrator находится в меню "Пуск" Прогpaммы -> Borland Delphi -> BDE Administrator. 



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

Рис. 4. Окно BDE.



Для добавления псевдонима задаем либо Object.New, либо по правой кнопке мыши в дополнительном меню выбираем New. Из списка драйверов выбираем значение Standard, используемое для создания псевдонима БД в формате Paradox. 

Изменив имя псевдонима, рассмотрим набор его характеристик: 1) type – название драйвера, на основе которого был создан псевдоним, 2) default driver – название драйвера, который подключается к файлу БД первым, 3) enable bcd – признак перевода значений десятичных полей в двоично-десятичное представление, 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 Форма диалога приложения БД















Таблица БД



Набор данных: Table, Query,

StoredProc



Источник данных: DataSource



Визуализация и управление:

DBGrid, Dbtext,DBNavigator













Рис. 6 Схема взаимодействия компонентов Delphi с БД.



Далее в свойстве MasterSource компонента Table, настроенного на вспомогательную таблицу, установите имя головной таблицы. После этого щелкните на свойстве  MasterFields. Откроется окно редактора связей полей (Field Link Designer). Индексировать таблицу надо так, чтобы индекс включал ключевое поле связи Zach. После этого можете восстанавливать связь с БД (Active=true) и запустить приложение.

Теперь немного об удобстве вода данных в форму. Для полей просмотра в DBGrid можно в свойстве Columns задать значение свойства ButtonStyle поля равным cbsAuto и тогда при редактировании данных автоматически будет появляться выпадающий список, из которого пользователь может выбирать соответствующее значение (например, для поля group).

На форму можно добавить кнопки Добавить, Удалить, Сохранить, Отменить с соответствующими обработчиками событий:

  Table1.Append; \\ метод, добавляющий новую запись в БД

  Table1.DeleteRecords(arCurrent); \\ удаление записи, на которой стоит курсор текущей записи

  Table1.Post; \\ сохранение изменений в БД

  Table1.Cancel; \\отмена действий пользователя



Для корректного удаления записи, можно предварительно уточнить требование у пользователя:



If (Application.MessageDlg (

                           “Действительно хотите удалить запись?”,

                           “Подтвердите удаление записи”,

                           MB_YESNO + MB_ICONQUESTION) = IDYES) then

Table1.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. Компонент  Query1 настройте на таблицу 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;   

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





	



23