Помощь в написании студенческих работ
Антистрессовый сервис

База данных «Аптека»

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Рисунок 1.2.13 — Окно проверки функционирования маски база данные серверный программа Рассмотрим свойство таблицы Referential Integrity — целостность на уровне ссылок. Речь идет о способах, позволяющих обеспечить постоянные связи между данными отдельных таблиц. Если устанавливается целостность на уровне ссылок между двумя таблицами, одна из которых — главная (родительская), а другая… Читать ещё >

База данных «Аптека» (реферат, курсовая, диплом, контрольная)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Белорусский Национальный Технический Университет Факультет информационных технологий и робототехники Кафедра «Робототехнические системы»

КУРСОВАЯ РАБОТА по дисциплине «Технологии и системы программирования»

Тема: «База данных «Аптека»

Выполнил студент группы 107 811 Черношей Д.Д.

Руководитель ст. преподаватель кафедры РТС Кононенко З.И.

Минск 2014

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Белорусский Национальный Технический Университет Факультет информационных технологий и робототехники Кафедра «Робототехнические системы»

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовой работе по дисциплине «Технологии и системы программирования»

Тема: «База данных «Аптека»

Выполнил студент группы 107 811 Черношей Д.Д.

Руководитель ст. преподаватель кафедры РТС Кононенко З.И.

Минск 2014

Белорусский национальный технический университет Факультет ИТР

«УТВЕРЖДАЮ»

Зав. кафедрой З, А Д, А Н И Е по курсовой работе студенту группы 107 819 Корженку В. В., вариант 8_

1. Тема работы БД «Отдел кадров»

2. Срок сдачи студентом законченной работы 25.05.2012

3. Исходные данные к работе Реляционная база данных Среда разработки — Delphi

Таблицы:

1. Сотрудники (Табельная номер, ФИО, Год рождения, Телефон, Адрес)

2. Подразделения (Название подразделения, Табельный номер, Номер места, Надбавка)

3. Рабочие места (Номер места, Должность, Оклад, Надбавка) Предусмотреть удаление и добавление новых данных. Также предусмотреть поиск по заданному критерию. Рассмотреть создание вычисляемых полей.

4. Содержание расчетно-пояснительной записки (перечень подлежащих разработке вопросов) Титульный лист Задание по курсовому проектированию Содержание Введение

1. Проектирование базы данных

1.1 Построение логической модели

1.2 Построение физической модели

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

2.1 Назначение

2.2 Структура приложения

2.3 Описание приложения

2.4 Тестирование приложения

2.5 Руководство пользователю Заключение Список использованных источников Приложения.

Консультант по работе (с указанием разделов работы) Кононенко З.И.

Дата выдачи задания 25.02.2012

Календарный график работы над курсовой на весь период

(с указанием трудоемкости отдельных этапов) Анализ постановки задачи и подготовка спецификаций требований к данным — 5% 03.03.2012

Проектирование базы данных — 20% 05.03.2012

Создание базы данных — 15% 17.03.2012

Разработка структуры приложения — 10% 08.04.2012

Создание и отладка приложения — 25% 29.04.2012

Тестирование приложения — 10% 01.05.2012

Подготовка расчетно-пояснительной записки — 15% 03.05.2012

Руководитель подпись, Задание принял к исполнению подпись, дата СОДЕРЖАНИЕ ВВЕДЕНИЕ

1. ПРОЕКТИРОВАНИЕ БАЗЫ ДАННЫХ

1.1 Построение логической модели

1.2 Построение физической модели

2. РАЗРАБОТКА ПРИЛОЖЕНИЯ ПРИ РАБОТЕ С БАЗОЙ ДАННЫХ

2.1 Назначение

2.2 Структура приложения

2.3 Описание приложения

2.4 Тестирование приложения

2.5 Руководство пользователю ЗАКЛЮЧЕНИЕ СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  • ПРИЛОЖЕНИЕ

Реляционная база данных — база данных, основанная на реляционной модели данных. Так что же такое реляционная база данных? Это таблица, в которой в качестве столбцов выступают имена хранимых в ней данных, а каждая строка содержит сами данные.

В зависимости от расположения программы, использующей данные, и самих данных, а также способа разделения данных между несколькими пользователями различают локальные и удаленные базы данных. Данные локальной базы данных (файлы данных) находятся на одном (локальном) устройстве, в качестве которого может выступать диск компьютера или сетевой диск. Данные (файлы) удаленной базы данных находятся на удаленном компьютере. Программа работы с удаленной базой данных состоит из двух частей: клиентской и серверной. Клиентская часть программы, работающая на компьютере пользователя, обеспечивает взаимодействие с серверной программой: посредством запросов, передаваемых на удаленный компьютер, предоставляет доступ к данным. Серверная часть программы, работающая на удаленном компьютере, принимает запросы, выполняет их и пересылает данные клиентской программе. Удалённые базы данных рассматриваться не будут в рамках данного курсового проекта.

1. ПРОЕКТИРОВАНИЕ БАЗЫ ДАННЫХ

База данных — это набор файлов (таблиц), в которых находится информация. Как правило, база данных состоит из нескольких таблиц, которые размещают в одном каталоге. Таблицу можно создать, воспользовавшись входящей в состав Delphi утилитой Borland Database Desktop или организовав SQL-запрос к серверу базы данных. Для доступа к файлам (таблицам) базы данных библиотека BDE использует не имя каталога, в котором находятся файлы, а его псевдоним. Перед тем, как приступить к созданию таблиц новой базы данных, необходимо создать псевдоним для этой базы данных. Процесс создания базы данных может быть представлен как последовательность следующих шагов:

· создание каталога;

· создание псевдонима;

· создание таблиц;

Каталог (папка) для файлов базы данных создается обычным образом, например, при помощи Проводника.

Псевдоним базы данных создается при помощи входящей в Delphi утилиты BDE Administrator, которая запускается из Windows выбором из меню Программы | Borland Delphi 7 команды BDE Administrator.

При создании псевдонима по умолчанию предлагается драйвер STANDARD (default driver), который обеспечивает доступ к таблицам в формате Paradox. После этого нужно изменить автоматически созданное администратором имя псевдонима и задать путь к файлам базы данных, для которой создается псевдоним.

Путь к файлам базы данных можно ввести на вкладке Definition в поле Path с клавиатуры или воспользоваться стандартным диалоговым окном Select Directory (Выбор каталога), которое открывается щелчком на кнопке с тремя точками, находящейся в конце поля Path.

Важным моментом при создании базы данных является распределение информации между полями записи. Очевидно, что информация может быть распределена между полями различным образом.

1.1 Построение логической модели

Логическое проектирование базы данных (также называемое построением ее логической модели) представляет собой процесс объединения данных в логически организованные группы объектов, которые можно легко поддерживать.

Создаваемая база данных «Отдел кадров» по условию курсовой работы должна содержать три таблицы: Сотрудники, Подразделения, Рабочие места. Для построения логической модели будем использовать программу ERWin. Логическая модель представлена на рисунке 1.1:

Рисунок 1.1 — Логическая модель базы данных111

1.2 Построение физической модели

На этапе построения физической модели начинается непосредственное проектирование базы данных с использованием средств Delphi. Физическая модель данных является продолжением создания нашей базы данных.

Для создания базы данных для начала необходимо создать псевдоним (Alias) — это короткое имя, поставленное в соответствие реальному, полному имени каталога базы данных. Вызов этой программы осуществляется из главного меню Delphi команде Database / Explore. Создаем свой псевдоним. Для этого в окне SQL Explorer на вкладке DataBases выбираем Object/ New. В результате данных манипуляций появится окно представленное на рисунке 1.2.1:

Рисунок 1.2.1 — Вид окна New Database Alias

Нажимаем и в окне SQL Explorer появляется новый псевдоним STANDARD1, которому присваиваем другое имя — DBCadr. Далее указываем путь к папке, где находятся таблицы базы данных используемых в нашей работе. Для этого нажимаем пиктограмму с тремя точками напротив надписи PATH и указываем путь. Щелкаем правой кнопкой мыши и в контекстном меню выбираем Apply. Псевдоним создан. Результат создания псевдонима представлен на рисунке 1.2.2:

Рисунок 1.2.2 — Создание псевдонима Итак, псевдоним создан. Далее необходимо создать непосредственно сами таблицы, в которых будут храниться наши данные. Для того, чтобы создать таблицу необходимо выбрать Меню->Tools->Database Desktop. Для создания новой таблицы выбрать File->New->Table. Появится окно выбора типа базы данных Create Table (Рисунок 1.2.3). По умолчанию уже выбран тип таблиц Paradox, поэтому нажимаем ОК.

Рисунок 1.2.3 — Вид окна Create Table

После этого на экране появится окно для создания и редактирования структуры таблицы Create Paradox 7 Table (Рисунок 1.2.4).

Рисунок 1.2.4 — Окно создания структуры таблицы Paradox

Далее в нашей работе для каждого поля таблицы необходимо зададим имя, тип и размер. Имя поля используется для доступа к данным. В качестве FieldName — идентификатора поля используется латинский алфавит до 25 символов и цифры. Затем надо выбрать тип (Туре) данных этого поля. Для этого нужно перейти в раздел Туре поля и щелкнуть правой кнопкой мыши. Появится список доступных типов, из которого можно выбрать необходимый. Также задаём размер наших полей и определяем, какие из них будут ключевыми. После нажимаем на кнопку Save As и указываем путь, куда сохранить созданную таблицу.

Имена полей таблиц для данной работы и их типы приведены на представленных ниже рисунках 1.2.5−1.2.9.

Рисунок 1.2.5 — Структура таблицы «Сотрудники»

Рисунок 1.2.6 — Структура таблицы «Рабочие места»

Рисунок 1.2.7 — Структура таблицы «Подразделения»

Для удобства заполнения таблицы можно использовать маски (шаблоны). Для этого будем использовать поле Picture, которое позволяют задать шаблон. Используя его можно контролировать правильность вводимой в поле информации. Шаблон представляет собой последовательность обычных и специальных символов. На рисунке 1.2.5 можно увидеть, что для поля адрес использована маска — г. &*~ ул. &*~ д. *# кв. *#. Для ввода фамилии и инициалов — &*~ (первая буква прописная, остальные строчные), табельного номера — #####, где (#-цифра). После ввода маски (маски можно и не вводить) нажимаем кнопку Save.

Открыв раскрывающийся список Table properties, выберем раздел Secondary Indexes. В этом разделе мы задаем индексированные поля. Индексированные поля — поля по которым чаще всего осуществляется поиск и сортировка. Из окна Fields выбираем поле Fam, для которого задается индекс, нажимаем на стрелку вправо и установим переключатель Maintained, как показано на рисунке 1.2.8.

Рисунок 1.2.8 — Окно установки вторичных индексов Затем нажимаем ОК и сохраняем под именем указанном на рисунке 1.2.9.Данные действия выполняются для сортировки по возрастанию.

Снова нажмём Define и из окна Fields выбираем поле Fam, для которого задается индекс, нажимаем на стрелку вправо и установим переключатель в Descending (для сортировки по убыванию) и сохраним под именем FamIndDes. В данной таблице создадим аналогично вторичные индексы для поля табельный номер. В результате поля стали индексированными.

Заполняем таблицу данными. Заполненную таблицу «Сотрудники» можно увидеть на рисунке 1.2.10.

Рисунок 1.2.10 — Заполненная таблица «Сотрудники»

Аналогично создаём таблицы «Рабочие места» и «Подразделения». Структуру этих таблиц и сами заполненные таблицы изображены на рисунках 1.2.11 — 1.2.12. В таблице «Рабочие места» присутствует маска в поле номер места — ###, вторичные индексы — должность и номер места. В таблице «Подразделения» маска в поле табельный номер — #####, а вторичные индексы в полях — табельный номер, название подразделения и номер места, как описано выше (аналогично предыдущим).

Рисунок 1.2.11 — Заполненная таблица «Рабочие места»

Рисунок 1.2.12 — Заполненная таблица «Подразделения»

По необходимости на значения полей можно накладывать ограничения по максимальному и минимальному значению это можно сделать в свойствах таблицы Validity Checks — проверка правильности значений.

Нажав кнопку Assist можно проверить правильность функционирования маски, к примеру, для ввода адреса в таблице «Сотрудники». Результат выполнения представлен на рисунке 1.2.13.

Рисунок 1.2.13 — Окно проверки функционирования маски база данные серверный программа Рассмотрим свойство таблицы Referential Integrity — целостность на уровне ссылок. Речь идет о способах, позволяющих обеспечить постоянные связи между данными отдельных таблиц. Если устанавливается целостность на уровне ссылок между двумя таблицами, одна из которых — главная (родительская), а другая — вспомогательная (дочерняя), то во вспомогательной таблице указывается поле (или группа полей), которые могут брать свои значения только из ключевого поля (или полей) головной таблицы. В списке fields выбирается поле связи редактируемой таблицы (дочерняя), а в списке table указываем родительскую таблицу. Результат выполнения связи для таблиц «Подразделения» и «Сотрудники» представлен на рисунке 1.2.14, аналогично и для таблицы «Рабочие места».

Рисунок 1.2.14 — Установление ссылочной целостности

2. РАЗРАБОТКА ПРИЛОЖЕНИЯ ПРИ РАБОТЕ С БАЗОЙ ДАННЫХ

Размещение компонентов на форме для работы с базами данных.

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

* Компоненты — наборы данных (data set), непосредственно связывающиеся с базой данных. Для BDE это такие компоненты, как Table, Query.

* Компонент — источник данных (data source), осуществляющий обмен информацией между компонентами первого типа и компонентами визуализации и управления данными. Таким компонентом является Data Source.

* Компоненты визуализации и управления данными, такие, как DBGrid,

DBText, DBEdit и множество других.

Компонент DataSource находится на вкладке DataAccess, компоненты Table и Query расположены на вкладке BDE, компоненты DBNavigator и DBGrid размещены на вкладке Data Controls.

2.1 Назначение

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

2.2 Структура приложения

Приложение состоит из программы для отображения, добавления, редактирования и удаления информации локальной базы данных и самой локальной базы данных, предусмотрен поиск по заданному критерию, рассмотрено создание вычисляемых полей. Тип базы данных — реляционная база данных Paradox v.7.

В приложении для работы с базами данных будем использовать две форма: первая — для отображения таблиц данных и сортировок, вторая — для поиска. На первой форме размещены три компонента DBGrid, в которых будут отображаться таблицы, созданные в DataBase Desktop, три компонента Table для набора данных, а также три компонента DataSource, которые будут являться источниками данных. Компоненты DBNavigator для упрощения работы с таблицами (удаления, добавления и так далее). Компонент Query, который понадобится для организации поиска. Также на форме расположенные компоненты RadioGroup и GroupBox, на которых находятся переключатели RadioButton, определяющие вид сортировки (то есть поля сортировки) и её направление. И кнопки, которым приписываются функции поиска, обновления данных, сортировки и выхода из приложения.

На второй форме располагаются компоненты ComboBox — выбор критерия поиска, Edit — для ввода информации и кнопка закрытия формы.

2.3 Описание приложения

Открываем приложение и переносим на форму необходимые компоненты. Три компонента Table со страницы библиотеки ВDЕ. Перенесим также на форму со страницы Data Access три компонента DataSource, которые будут являться источником данных. Оба эти компоненты невизуальные, пользователю они будут не видны, их можно разместить в любом месте формы. В качестве компонента визуализации данных возьмем компонент DBGrid со страницы Data Controls. Это визуальный компонент, в котором будут отображаться данные формы.

Теперь нам надо установить цепочку связей между этими компонентами. Главное свойство DBGrid и других компонентов визуализации и управления данными — DataSource. Выделяем на форме компонент DBGrid l и щелкаем по его свойству DataSource в Инспекторе Объектов. Появляется список, в котором перечислены все имеющиеся на форме источники данных. В нашем случае источником данных является DataSource l. Далее необходимо установить связь между источником данных и набором данных. Выделяем компонент DataSource l и найдем в Инспекторе Объектов его главное свойство — DataSet. Теперь нажмем на этом свойство и из выпадающего списка выберираем Tablel. Теперь осталось связать компонент Tablel с необходимой таблицей базы данных.

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

· Свойство DatabaseName имеет тип String и задает полный путь к каталогу базы данных. В значении этого свойства можно указать вместо пути к каталогу базы данных ее псевдоним. Укажем псевдоним — DBCadr.

· Свойство TableName имеет тип TFileName и определяет имя файла таблицы базы данных, которую инкапсулирует объект. Укажем — Sotrudniki.db.

Аналогичные действия выполняем и для оставшихся компонентов и таблиц. Теперь можно прямо в процессе проектирования соединиться с базой данных. Соединение осуществляется свойством 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.Value+Table3Oklad.Value*Table3Nadbavka.Value/100;

Теперь для того, что бы при выборе по определенному критерию в одной из таблиц, мы могли бы получить информацию из других таблиц мы свяжем таблицы прямо на форме. Для этого выбираем на форме 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 <�Список Полей>, где:

· 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:=DataSource2;

Table1.MasterFields:='TabelNumber1';

Table3.MasterSource:=DataSource2;

Table3.MasterFields:='MNumber1';

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;

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

o Close — деактивирует запрос в качестве одной из мер предосторожности;

o SQL. Clear — стирает любой предыдущий запрос;

o SQL. Add — добавляет текст SQL-запроса;

o Open — выполняет запрос и открываем набор данных Свяжем таблицы с помощью инспектора объектов, используя свойства компонента 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:='TabelNumberInd';

If (RadioButton1.Checked) and (RadioButton5.Checked) Then

Table1.IndexName:='TabelNumberIndDes';

То есть при выборе переключателей «По табельному номеру» и «По возрастанию» свойству таблицы Table1 — IndexName присваивается значение TabelNumberInd, следовательно вторичный индекс TabelNumberInd будет использоваться для сортировки таблицы Table1. В результате таблица будет отсортирована по полю Табельный номер от меньшего значения к большему.

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

Table2.MasterSource:=DataSource1;

Table2.IndexName:='TabelNumber1';

Table2.MasterFields:='TabelNumber';

with Table2 do begin

disableControls;

first;

while not EOF do

delete;

enableControls; end;

Table2.MasterSource:=nil;

Table2.IndexName:='';

Table2.MasterFields:='';

То есть связываем записи дочерней таблицы с записями главной через свойства компонента Table — MasterSource, MasterFields и через цикл while находим удаляемые записи в главной таблице и программным путем удаляем их в дочерней. Затем программно делаем независимое отображение таблиц.

2.4 Тестирование приложения

Для тестирования приложения выполним требуемые в качестве задания операции, а именно: добавление, удаление и поиск записей. В таблицу «Сотрудники» добавим запись. Результат можно увидеть на рисунке 2.4.1.

Рисунок 2.4.1 — Добавление записи Теперь удалим любую запись, например, только что созданную. Результат выполнения данной операции представлен на рисунке 2.4.2.

Рисунок 2.4.2 — Удаление записи Теперь произведём поиск по заданному критерию. Будем осуществлять поиск записи по номеру. В таблице «Подразделения» также отражена работа вычисляемых полей. Результаты поиска представлены на рисунке 2.4.3.

Рисунок 2.4.3 — Поиск по заданному критерию Теперь рассмотрим сортировки. К примеру, для таблицы «Сотрудники» отсортируем поля по возрастанию. Результат показан на рисунке 2.4.4.

Рисунок 2.4.4 — Сортировка Таким образом, мы убедились, что все функции, указанные в задании к курсовому проекту выполнены и работают корректно.

2.5 Руководство пользователю

Главное окно программы изображено на рисунке 2.5.1. В окне видны три таблицы. Для добавления и удаления новых данных в таблицы используем DBNavigator. Для обеспечения удобства работы на форме располагаются кнопки, обеспечивающие поиск данных, обновление таблиц, сортировки и закрытие приложения.

Рисунок 2.5.1 — Главное окно программы При нажатии кнопки «Поиск» появляется новая форма, представленная на рисунке 2.5.2, на которой можно выбрать критерий поиска.

Рисунок 2.5.2 — Форма для поиска Для осуществления поиска выбираем критерий в выпадающем списке. В поле для запроса вводим информацию, если данные введены неверно, появляется сообщение об ошибке. К примеру, осуществим поиск по критерию табельный номер. Способ заполнения формы и результат представлены соответственно на рисунках 2.5.3−2.5.4.

Рисунок 2.5.3 — Форма для поиска по заданному критерию Рисунок 2.5.4 — Результат поиска Также можно получить исходные данные по трём таблицам. Для этого необходимо нажать на кнопку «Обновить», расположенную на форме.

Для выполнения сортировки в таблице «Рабочие места» установим переключатели как показано на рисунке 2.5.5 и нажмём кнопку «Ок».

Рисунок 2.5.5 — Критерии сортировки Результат сортировки представлен на рисунке 2.5.6.

Рисунок 2.5.6 — Результат сортировки

ЗАКЛЮЧЕНИЕ

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

Примечание: электронный вариант программы находится на приложенном к пояснительной записке диске в папке под именем «Приложение», базы данных в папке под именем «БД Отдел кадров», а электронный вариант пояснительной записки — под именем Записка.doc. Для открытия и запуска приложения необходимо в Delphi в меню выбрать DataBase/ Explorer и в появившемся диалоге указать псевдоним DBCadr и путь к файлу с базой данных, сохранить изменения. Далее Delphi/ File/open/…и выбираем в папку под именем «Приложение» на носителе.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Кононенко З. И. Конспект лекций по дисциплине «Технологии и системы программирования».

2. Архангельский А. Я. Программирование в Delphi 7. -М.:Бином, 2003. — 1152 с.: ил.

3. Фленов М. Е. Библия Delphi. -СПб.:БХВ-Петербург, 2004. — 880 с.: ил.

ПРИЛОЖЕНИЕ

unit BD;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DB, StdCtrls, DBTables, ExtCtrls, DBCtrls, Grids, DBGrids, XPMan,

Buttons;

type

TForm1 = class (TForm)

DataSource1: TDataSource;

DBGrid1: TDBGrid;

DBNavigator1: TDBNavigator;

Table1: TTable;

Table1TabelNumber: TIntegerField;

Table1Fam: TStringField;

Table1Name: TStringField;

Table1Otc: TStringField;

Table1Birthday: TDateField;

Table1Adres: TStringField;

StaticText1: TStaticText;

StaticText2: TStaticText;

DataSource2: TDataSource;

DBGrid2: TDBGrid;

DBNavigator2: TDBNavigator;

Table2: TTable;

StaticText3: TStaticText;

Table2PodrazName: TStringField;

Table2TabelNumber1: TIntegerField;

Table2MNumber1: TIntegerField;

StaticText4: TStaticText;

StaticText5: TStaticText;

DataSource3: TDataSource;

DBGrid3: TDBGrid;

DBNavigator3: TDBNavigator;

Table3: TTable;

StaticText6: TStaticText;

StaticText7: TStaticText;

Table3MNumber: TIntegerField;

Table3Doljnost: TStringField;

Table3Oklad: TCurrencyField;

GroupBox1: TGroupBox;

RadioGroup1: TRadioGroup;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

RadioButton3: TRadioButton;

GroupBox2: TGroupBox;

RadioGroup3: TRadioGroup;

RadioButton6: TRadioButton;

RadioButton8: TRadioButton;

RadioButton7: TRadioButton;

RadioButton11: TRadioButton;

GroupBox3: TGroupBox;

RadioGroup5: TRadioGroup;

RadioButton13: TRadioButton;

RadioButton17: TRadioButton;

RadioButton12: TRadioButton;

XPManifest1: TXPManifest;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

GroupBox4: TGroupBox;

RadioButton4: TRadioButton;

RadioButton5: TRadioButton;

GroupBox5: TGroupBox;

RadioButton9: TRadioButton;

RadioButton10: TRadioButton;

GroupBox6: TGroupBox;

RadioButton14: TRadioButton;

RadioButton15: TRadioButton;

BitBtn4: TBitBtn;

BitBtn5: TBitBtn;

BitBtn6: TBitBtn;

Query1: TQuery;

Query1PodrazName: TStringField;

Query1TabelNumber1: TIntegerField;

Query1MNumber1: TIntegerField;

BitBtn7: TBitBtn;

BitBtn8: TBitBtn;

Table3Nadbavka: TFloatField;

Table3Sum: TCurrencyField;

Table2NumberPodraz: TIntegerField;

Query1NumberPodraz: TIntegerField;

Table1Tel: TStringField;

procedure FormActivate (Sender: TObject);

procedure BitBtn2Click (Sender: TObject);

procedure BitBtn1Click (Sender: TObject);

procedure BitBtn3Click (Sender: TObject);

procedure BitBtn4Click (Sender: TObject);

procedure BitBtn5Click (Sender: TObject);

procedure BitBtn6Click (Sender: TObject);

procedure RadioButton1Click (Sender: TObject);

procedure RadioButton2Click (Sender: TObject);

procedure RadioButton7Click (Sender: TObject);

procedure RadioButton6Click (Sender: TObject);

procedure RadioButton11Click (Sender: TObject);

procedure RadioButton17Click (Sender: TObject);

procedure RadioButton12Click (Sender: TObject);

procedure RadioButton3Click (Sender: TObject);

procedure RadioButton8Click (Sender: TObject);

procedure RadioButton13Click (Sender: TObject);

procedure BitBtn8Click (Sender: TObject);

procedure BitBtn7Click (Sender: TObject);

procedure Table3CalcFields (DataSet: TDataSet);

procedure Table1BeforeDelete (DataSet: TDataSet);

procedure Table3BeforeDelete (DataSet: TDataSet);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses BDFind;

{$R *.dfm}

procedure TForm1. FormActivate (Sender: TObject);

begin

RadioButton3.Checked:=True;

RadioButton8.Checked:=True;

RadioButton13.Checked:=True;

RadioButton4.Checked:=True;

RadioButton9.Checked:=True;

RadioButton14.Checked:=True;

RadioButton4.Enabled:=False;

RadioButton5.Enabled:=False;

RadioButton9.Enabled:=False;

RadioButton10.Enabled:=False;

RadioButton14.Enabled:=False;

RadioButton15.Enabled:=False;

BitBtn7.Enabled:=False;

end;

procedure TForm1. BitBtn2Click (Sender: TObject);

label l;

var SQLData: String;

begin

RadioButton3.Checked:=True;

RadioButton8.Checked:=True;

RadioButton13.Checked:=True;

RadioButton1.Enabled:=False;

RadioButton2.Enabled:=False;

RadioButton3.Enabled:=False;

RadioButton7.Enabled:=False;

RadioButton6.Enabled:=False;

RadioButton11.Enabled:=False;

RadioButton8.Enabled:=False;

RadioButton17.Enabled:=False;

RadioButton12.Enabled:=False;

RadioButton13.Enabled:=False;

l: Form2. ShowModal;

SQLData:=Form2.Edit1.Text;

If Form2. Edit1.Text = '' Then Begin

MessageDlg ('Не введены данные для поиска!', mtWarning, [mbOK], 0); Goto l; end;

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:=DataSource2;

Table1.MasterFields:='TabelNumber1';

Table3.MasterSource:=DataSource2;

Table3.MasterFields:='MNumber1';

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;

RadioButton1.Enabled:=True;

RadioButton2.Enabled:=True;

RadioButton3.Enabled:=True;

RadioButton7.Enabled:=True;

RadioButton6.Enabled:=True;

RadioButton11.Enabled:=True;

RadioButton8.Enabled:=True;

RadioButton17.Enabled:=True;

RadioButton12.Enabled:=True;

RadioButton13.Enabled:=True;

end; end;

If Form2. ComboBox1.ItemIndex = 1 Then Begin

With Query1 Do Begin

Close;

SQL.Clear;

SQL.Add ('SELECT * FROM «:DBCadr:Podrarzel.db» WHERE MNumber1 = «'+SQLData+'» Order by MNumber1');

Open; end;

If Query1. RecordCount <> 0 Then Begin

DataSource2.DataSet:=Query1;

Table1.MasterSource:=DataSource2;

Table1.MasterFields:='TabelNumber1';

Table3.MasterSource:=DataSource2;

Table3.MasterFields:='MNumber1';

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;

RadioButton1.Enabled:=True;

RadioButton2.Enabled:=True;

RadioButton3.Enabled:=True;

RadioButton7.Enabled:=True;

RadioButton6.Enabled:=True;

RadioButton11.Enabled:=True;

RadioButton8.Enabled:=True;

RadioButton17.Enabled:=True;

RadioButton12.Enabled:=True;

RadioButton13.Enabled:=True;

end; end;

end;

procedure TForm1. BitBtn1Click (Sender: TObject);

begin

DBGrid1.ReadOnly:=False;

DBGrid2.ReadOnly:=False;

DBGrid3.ReadOnly:=False;

Table1.MasterSource:=nil;

Table3.MasterSource:=nil;

DataSource2.DataSet:=Table2;

DBNavigator1.Enabled:=True;

DBNavigator3.Enabled:=True;

RadioButton1.Enabled:=True;

RadioButton2.Enabled:=True;

RadioButton3.Enabled:=True;

RadioButton7.Enabled:=True;

RadioButton6.Enabled:=True;

RadioButton11.Enabled:=True;

RadioButton8.Enabled:=True;

RadioButton17.Enabled:=True;

RadioButton12.Enabled:=True;

RadioButton13.Enabled:=True;

end;

procedure TForm1. BitBtn3Click (Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1. BitBtn4Click (Sender: TObject);

begin

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:='TabelNumberInd';

If (RadioButton1.Checked) and (RadioButton5.Checked) Then

Table1.IndexName:='TabelNumberIndDes';

end;

procedure TForm1. BitBtn5Click (Sender: TObject);

begin

If (RadioButton7.Checked) and (RadioButton9.Checked) Then

Table2.IndexName:='PodrazNameInd';

If (RadioButton7.Checked) and (RadioButton10.Checked) Then

Table2.IndexName:='PodrazNameIndDes';

If (RadioButton6.Checked) and (RadioButton9.Checked) Then

Table2.IndexName:='TabelNumber1';

If (RadioButton6.Checked) and (RadioButton10.Checked) Then

Table2.IndexName:='TabelNumber1Des';

If (RadioButton11.Checked) and (RadioButton9.Checked) Then

Table2.IndexName:='MNumber1';

If (RadioButton11.Checked) and (RadioButton10.Checked) Then

Table2.IndexName:='MNumber1Des';

end;

procedure TForm1. BitBtn6Click (Sender: TObject);

begin

If (RadioButton17.Checked) and (RadioButton14.Checked) Then

Table3.IndexName:='MNumberInd';

If (RadioButton17.Checked) and (RadioButton15.Checked) Then

Table3.IndexName:='MNumberIndDes';

If (RadioButton12.Checked) and (RadioButton14.Checked) Then

Table3.IndexName:='DoljnostInd';

If (RadioButton12.Checked) and (RadioButton15.Checked) Then

Table3.IndexName:='DoljnostIndDes';

end;

procedure TForm1. RadioButton1Click (Sender: TObject);

begin

RadioButton4.Enabled:=True;

RadioButton5.Enabled:=True;

BitBtn4.Enabled:=True;

end;

procedure TForm1. RadioButton2Click (Sender: TObject);

begin

RadioButton4.Enabled:=True;

RadioButton5.Enabled:=True;

BitBtn4.Enabled:=True;

end;

procedure TForm1. RadioButton7Click (Sender: TObject);

begin

RadioButton9.Enabled:=True;

RadioButton10.Enabled:=True;

BitBtn5.Enabled:=True;

end;

procedure TForm1. RadioButton6Click (Sender: TObject);

begin

RadioButton9.Enabled:=True;

RadioButton10.Enabled:=True;

BitBtn5.Enabled:=True;

end;

procedure TForm1. RadioButton11Click (Sender: TObject);

begin

RadioButton9.Enabled:=True;

RadioButton10.Enabled:=True;

BitBtn5.Enabled:=True;

end;

procedure TForm1. RadioButton17Click (Sender: TObject);

begin

RadioButton14.Enabled:=True;

RadioButton15.Enabled:=True;

BitBtn6.Enabled:=True;

end;

procedure TForm1. RadioButton12Click (Sender: TObject);

begin

RadioButton14.Enabled:=True;

RadioButton15.Enabled:=True;

BitBtn6.Enabled:=True;

end;

procedure TForm1. RadioButton3Click (Sender: TObject);

begin

Table1.IndexName:='';

RadioButton4.Checked:=True;

RadioButton5.Checked:=False;

RadioButton4.Enabled:=False;

RadioButton5.Enabled:=False;

BitBtn4.Enabled:=False;

end;

procedure TForm1. RadioButton8Click (Sender: TObject);

begin

Table2.IndexName:='';

RadioButton9.Checked:=True;

RadioButton10.Checked:=False;

RadioButton9.Enabled:=False;

RadioButton10.Enabled:=False;

BitBtn5.Enabled:=False;

end;

procedure TForm1. RadioButton13Click (Sender: TObject);

begin

Table3.IndexName:='';

RadioButton14.Checked:=True;

RadioButton15.Checked:=False;

RadioButton14.Enabled:=False;

RadioButton15.Enabled:=False;

BitBtn6.Enabled:=False;

end;

procedure TForm1. BitBtn8Click (Sender: TObject);

begin

Form1.Height:=571;

BitBtn7.Enabled:=True;

end;

procedure TForm1. BitBtn7Click (Sender: TObject);

begin

Form1.Height:=827;

BitBtn7.Enabled:=False;

end;

procedure TForm1. Table3CalcFields (DataSet: TDataSet);

begin

Table3Sum.Value:=Table3Oklad.Value+Table3Oklad.Value*Table3Nadbavka.Value/100;

end;

procedure TForm1. Table1BeforeDelete (DataSet: TDataSet);

begin

Table2.MasterSource:=DataSource1;

Table2.IndexName:='TabelNumber1';

Table2.MasterFields:='TabelNumber';

with Table2 do begin

disableControls;

first;

while not EOF do

delete;

enableControls; end;

Table2.MasterSource:=nil;

Table2.IndexName:='';

Table2.MasterFields:='';

end;

procedure TForm1. Table3BeforeDelete (DataSet: TDataSet);

begin

Table2.MasterSource:=DataSource3;

Table2.IndexName:='MNumber1';

Table2.MasterFields:='MNumber';

with Table2 do begin

disableControls;

first;

while not EOF do

delete;

enableControls; end;

Table2.MasterSource:=nil;

Table2.IndexName:='';

Table2.MasterFields:='';

end;

end.

unit BDFind;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons;

type

TForm2 = class (TForm)

GroupBox1: TGroupBox;

Label1: TLabel;

ComboBox1: TComboBox;

Label2: TLabel;

Edit1: TEdit;

BitBtn1: TBitBtn;

procedure FormActivate (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

uses BD;

{$R *.dfm}

procedure TForm2. FormActivate (Sender: TObject);

begin

Edit1.Clear;

Edit1.SetFocus;

end;

end.

Показать весь текст
Заполнить форму текущей работой