Автор работы: Пользователь скрыл имя, 28 Декабря 2014 в 23:37, курсовая работа
База данных — это набор файлов (таблиц), в которых находится информация. Как правило, база данных состоит из нескольких таблиц, которые размещают в одном каталоге. Таблицу можно создать, воспользовавшись входящей в состав Delphi утилитой Borland Database Desktop или организовав SQL-запрос к серверу базы данных.
Рисунок 1.2.14 – Установление ссылочной целостности
Размещение компонентов на форме для работы с базами данных.
Каждое приложение, использующее базы данных, обычно имеет, по крайней мере, по одному компоненту следующих трех типов:
• Компоненты — наборы данных (data set), непосредственно связывающиеся с базой данных. Для BDE это такие компоненты, как Table, Query.
• Компонент — источник данных (data source), осуществляющий обмен информацией между компонентами первого типа и компонентами визуализации и управления данными. Таким компонентом является Data Source.
• Компоненты визуализации и управления данными, такие, как DBGrid,
DBText, DBEdit и множество других.
Компонент DataSource находится на вкладке DataAccess, компоненты Table и Query расположены на вкладке BDE, компоненты DBNavigator и DBGrid размещены на вкладке Data Controls.
Приложение по работе с базами данных необходимо для организации работы с данными, представленными в базе. Данное приложение, согласно заданию курсового проекта, предназначено для удаления и добавления новых данных, поиска по заданному критерию, а также создания вычисляемых полей.
Приложение состоит из программы для отображения, добавления, редактирования и удаления информации локальной базы данных и самой локальной базы данных, предусмотрен поиск по заданному критерию, рассмотрено создание вычисляемых полей. Тип базы данных – реляционная база данных Paradox v.7.
В приложении для работы с базами данных будем использовать две форма: первая - для отображения таблиц данных и сортировок, вторая - для поиска. На первой форме размещены три компонента DBGrid, в которых будут отображаться таблицы, созданные в DataBase Desktop, три компонента Table для набора данных, а также три компонента DataSource, которые будут являться источниками данных. Компоненты DBNavigator для упрощения работы с таблицами (удаления, добавления и так далее). Компонент Query,который понадобится для организации поиска. Также на форме расположенные компоненты RadioGroup и GroupBox, на которых находятся переключатели RadioButton, определяющие вид сортировки (то есть поля сортировки) и её направление. И кнопки, которым приписываются функции поиска, обновления данных, сортировки и выхода из приложения.
На второй форме располагаются компоненты ComboBox – выбор критерия поиска, Edit - для ввода информации и кнопка закрытия формы.
Открываем приложение и переносим на форму необходимые компоненты. Три компонента Table со страницы библиотеки ВDЕ. Перенесим также на форму со страницы Data Access три компонента DataSource, которые будут являться источником данных. Оба эти компоненты невизуальные, пользователю они будут не видны, их можно разместить в любом месте формы. В качестве компонента визуализации данных возьмем компонент DBGrid со страницы Data Controls. Это визуальный компонент, в котором будут отображаться данные формы.
Теперь нам надо установить цепочку связей между этими компонентами. Главное свойство DBGrid и других компонентов визуализации и управления данными — DataSource. Выделяем на форме компонент DBGrid l и щелкаем по его свойству DataSource в Инспекторе Объектов. Появляется список, в котором перечислены все имеющиеся на форме источники данных. В нашем случае источником данных является DataSource l. Далее необходимо установить связь между источником данных и набором данных. Выделяем компонент DataSource l и найдем в Инспекторе Объектов его главное свойство — DataSet. Теперь нажмем на этом свойство и из выпадающего списка выберираем Tablel . Теперь осталось связать компонент Tablel с необходимой таблицей базы данных.
Для компонента Table1 в инспекторе объектов необходимо изменить следующие свойства:
Аналогичные действия выполняем и для оставшихся компонентов и таблиц. Теперь можно прямо в процессе проектирования соединиться с базой данных. Соединение осуществляется свойством Active. По умолчанию оно равно false. Устанавливаем его в true и в поле компонента DBGridl стали данные из таблицы. Аналогично и для других таблиц. В спроектированное приложение добавляем еще один компонент, управляющий работой с таблицей - навигатор DBNavigator, расположенный на странице Data Cortrols и помещаем его на форму. Для компонента DBNavigator1 необходимо изменить свойство DataSource: (указывает источник данных для набора данных). Укажем – DataSource1. Компонент имеет ряд кнопок, служащих для управления данными. Назначения кнопок приведены в таблице 2.3.1.
Таблица 2.3.1 Назначение кнопок компонента DBNavigator
Кнопки |
Назначение |
nbFirst |
перемещение к первой записи |
nbPrior |
перемещение к предыдущей записи |
nhNext |
перемещение к следующей записи |
nbLast |
перемещение к последней записи |
nblnsert |
вставить новую запись перед текущей |
nbDelеte |
удалить текущую запись |
nbEdit |
редактировать текущую запись |
nbPost |
послать отредактированную информацию в базу данных |
nbCancel |
отменить результаты редактирования или добавления новой записи |
nbRefresh |
очистить буфер, связанный с набором данных |
Помещаем Query1 на форму, он необходим для функции поиска в приложении. В Инспекторе Объектов данного компонента находим свойство DataBaseName, в нём указываем используемый нами псевдоним DBCadr.
Поместим на форму кнопки «Поиск», «Обновить таблицы», «Выход», «Сортировка» и для каждой в обработчике события напишем соответствующие процедуры.
Для того, чтобы в наших таблицах название полей отображалось на русском языке выберем компонент Table. Двойной щелчок мыши по данному компоненту вызывает редактор полей. Правой кнопкой мыши вызываем контекстное меню редактора и выбираем меню «Add fields…»и в результате получаем:
Рисунок 2.3.1 – Редактор полей
Выбираем в редакторе полей поле, которое желаем переименовать, и в инспекторе объектов меняем значение свойства DisplayLabel .
Для создания вычисляемого поля также используем редактор полей. В нашем случае выбираем: Table3/ Fields Editor/New field. Появится диалоговое окно представленное на рисунке 2.3.2.
Рисунок 2.3.2 - Диалоговое окно New field
В поле Name вводим название вычисляемого поля – Sum , а также указываем его тип Currency, в разделе Field type ставим переключатель напротив Calculated, нажимаем «Ок». Далее выбираем компонент Table3 и в Инспекторе Объектов в разделе события выбираем OnCalcFields и пишем соответствующую процедуру. В ней для данных таблицы «Подразделения» будем вычислять сумма оклада и процента надбавкиа:
Table3Sum.Value:=Table3Oklad.
Теперь для того, что бы при выборе по определенному критерию в одной из таблиц, мы могли бы получить информацию из других таблиц мы свяжем таблицы прямо на форме. Для этого выбираем на форме Table3 и в Инспекторе Объектов свойство Master Source и указываем источник данных - DataSource 2, а через MasterFields указываем поля связи. Данная процедура отражена на рисунке 2.3.3. Аналогично связываем таблицу «Сотрудники» с таблицей «Подразделения».
Рисунок 2.3.3 – Процедура связи таблиц по ключевым полям
Далее опишем формирование SQL –запроса. Для доступа к запросу на первой форме поместим кнопку «Поиск», а на второй форме создадим поля для ввода данных запроса и поместим компонент ComboBox (свойство Items и ItemIndex) для выбора критерия запроса. Окно поиска представлено на рисунке 2.3.4.
Рисунок 2.3.4 – Окно поиска по заданному критерию
Выбираем Query1 и в Инспекторе объектов выбираем свойство SQL: TStrings, двойным щелчком мыши вызываем диалоговое окно, где оформляем запрос, более подробно формируется программным образом (рисунок 2.3.5).
Рисунок 2.3.5 – Формирование SQL –запроса
В общем виде запрос выглядит так:
SELECT <Список Полей> FROM <Таблица> WHERE (Критерий) ORDER BY <Список Полей> ,где:
В данной работе возможно осуществлять поиск по 2 критериям: табельный номер, номер места. К примеру, рассмотрим поиск табельному номеру, запрос будет выглядеть следующим образом:
If Form2.ComboBox1.ItemIndex = 0 Then Begin
With Query1 Do Begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM ":DBCadr:Podrarzel.db" WHERE TabelNumber1 = "'+SQLData+'" Order by TabelNumber1');
Open; end;
If Query1.RecordCount <> 0 Then Begin
DataSource2.DataSet:=Query1;
Table1.MasterSource:=
Table1.MasterFields:='
Table3.MasterSource:=
Table3.MasterFields:='
DBGrid1.ReadOnly:=True;
DBGrid2.ReadOnly:=True;
DBGrid3.ReadOnly:=True;
DBNavigator1.Enabled:=False;
DBNavigator3.Enabled:=False;
end;
If Query1.RecordCount = 0 Then Begin
DataSource2.DataSet:=Table2;
MessageDlg('Данные не найдены!', mtInformation, [mbOK], 0);
Table1.MasterSource:=nil;
Table3.MasterSource:=nil;
end; end;
Для запроса были использованы следующие методы:
Свяжем таблицы с помощью инспектора объектов, используя свойства компонента Table: MasterSource, для отображения результата поиска в других таблицах. Если данные не найдены, то:
Table1.MasterSource:=nil
Аналогично формируются запросы и по другим критериям.
Для сортировки используем переключатели RadioGroup. Первая группа переключателей определяет вид сортировки, то есть поле сортировки (например, Табельный номер и Фамилии). Вторая группа – направление сортировки, для этого при создании вторичных индексов указывался параметр – Descending.
Программно сортировка выглядит следующим образом:
If (RadioButton2.Checked) and (RadioButton4.Checked) Then
Table1.IndexName:='FamInd';
If (RadioButton2.Checked) and (RadioButton5.Checked) Then
Table1.IndexName:='FamIndDes';
If (RadioButton1.Checked) and (RadioButton4.Checked) Then
Table1.IndexName:='
If (RadioButton1.Checked) and (RadioButton5.Checked) Then
Table1.IndexName:='
То есть при выборе переключателей “По табельному номеру” и “По возрастанию” свойству таблицы Table1 – IndexName присваивается значение TabelNumberInd, следовательно вторичный индекс TabelNumberInd будет использоваться для сортировки таблицы Table1. В результате таблица будет отсортирована по полю Табельный номер от меньшего значения к большему.
Для каскадного удаления записей, то есть удаления записей из дочерней таблицы при удалении данных из главной таблицы, необходимо для компонента Table создать событие BeforeDelete в инспекторе объектов, в котором программно описываем следующие действия:
Table2.MasterSource:=
Table2.IndexName:='
Table2.MasterFields:='
with Table2 do begin
disableControls;
first;
while not EOF do
delete;
enableControls; end;
Table2.MasterSource:=nil;
Table2.IndexName:='';
Table2.MasterFields:='';
То есть связываем записи дочерней таблицы с записями главной через свойства компонента Table – MasterSource, MasterFields и через цикл while находим удаляемые записи в главной таблице и программным путем удаляем их в дочерней. Затем программно делаем независимое отображение таблиц.