Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Самостоятельная работа 15: Создание СУБД средствами BDE (на примере протокола экзамена кандидатов в водители)
СУБД - система управления базой данных (БД). Создадим приложение, обеспечивающее управление данными кандидатов в водители при сдаче экзаменов в ГИБДД, используя механизм BDE (Borland Database Engine) - процессор баз данных.
BDE должен быть поставлен на компьютер пользователя вместе с приложением, работающем на его основе. Иначе приложение не сможет связаться с базой данных и не будет работать. BDE реализован в виде динамически присоединяемых библиотек, которые представлены файлами idapi32.dll и другими, находящимися в каталоге C:\Program Files\Common Files\Borland Shared\BDE. Но просто перенести эти файлы в системный каталог System32 компьютера мало, нужно либо установить на клиентской машине BDE - пакет, поскольку он еще создаст необходимые ключи в системном реестре, либо установить IDE C++Builder, который заодно установит и BDE.
Пользователем этого приложения должен быть оператор, в обязанность которого входит:
- Первичное заполнение БД сведениями о лицах, сдающих экзамен
- Оперативное занесение текущих оценок за экзамен по теории и вождению
- Генерация и печать экзаменационных листов и общего отчета по результатам за текущий день с возможность предварительного просмотра печати.
- Ведение архива, которая включает в себя
- пересылку таблицы с результатами экзамена в архив в режиме добавления данных
- просмотр данных архива с возможностью выборки по дате сдачи экзамена
Наша задача, как разработчиков, проанализировать задачу с привлечением представителей заказчика, а затем реализовать ее по следующему плану:
- Спроектировать базу данных, включающую в себя набор взаимосвязанных таблиц заданной структуры (имена полей, типы полей, размер полей)
- Создать базу данных как совокупность пустых таблиц по разработанной структуре
- Спроектировать приложение для управления данными (редактирование, сохранение, выборка данных, хранящихся в таблицах)
Поскольку речь идет о таблицах, то примем за основу реляционную модель БД как наиболее простую и удобную для наших целей. Выберем структуру таблиц формата dbf, которая использовалась еще в dBaseII, dBaseIII, dBaseIV, FoxPro, Clipper - СУБД времен DOS. Дело в том, что эта база уже существует и используется другими программами. Мы же хотим заменить только одну из программ на более современную - работающую под Windows. Так что выбора по структуре и формату таблиц данных у нас фактически нет.
Здесь я немножко схитрю и буду употреблять слово "будущее приложение", в то время как это приложение я уже разработал и оно реальное (хоть и не очень сложное). Но мой долг доцента обязывает описать процесс создания, надеясь, что Вы - мои любимые студенты, не менее страстно вынуждены будете это прочитать (для своей же пользы!) и, самое главное, повторить. Вот с такими оговорками и приступим к делу.
Проектирование базы данных
База данных в C++Builder ассоциируется с каталогом, содержащим набор взаимосвязанных файлов, каждый из которых представляет собой таблицу с реляционными данными. Предположим, что в результате бесед с представителями заказчика мы определили состав таблиц базы данных, которые размещаются в каталоге Dbf в файлах
- DBF\Base0.dbf
- DBF\Base1.dbf
- DBF\Archive0.dbf
- DBF\Archive1.dbf
- tmp_base.dbf
Таблица tmp_base.dbf является вспомогательной и служит для обмена данными между приложением - экзаменом, с которым взаимодействует кандидат в водители, и нашим будущим приложением - протоколом, с которым будет работать оператор на центральной машине, управляя результатами экзамена. Как в эту базу записываются данные, нам безразлично, главное - чтобы нам была известна структура этой промежуточной базы, из которой будет брать данные наше будущее приложение. Таблица tmp_base.dbf должна размещаться в том же каталоге, где будет находиться наше приложение.
Примем, что каталог Dbf должен являться ближайшим подкаталогом места размещения нашего будущего приложения. Для механизма BDE это делать совершенно необязательно, поскольку можно использовать так называемые псевдонимы ( alias ) баз данных. Псевдонимы представляют собой метки, хранящиеся в общедостопном для BDE месте ( C:\Program Files\Common Files\Borland Shared\BDE\IDAPI32.CFG ), в которых содержится вся необходимая информация о таблицах БД, включая каталог их размещения, формат, используемые драйверы и т.д. Если база данных располагается в подчиненном по отношению к приложению каталоге, то в приложении достаточно указать имя этого каталога. Если же приложение должно располагаться в произвольном месте дерева каталогов (равно, как и БД), тогда нужно использовать псевдоним, который предварительно настраивается для каждого отдельного компьютера.
Пусть мы определили структуру каждой из этих таблиц, которая включает в себя наименования, типы и размеры полей. Структура таблиц приведена ниже.
Структура таблицы DBF\Base0.dbf | ||||
---|---|---|---|---|
Field Name | Type | Size | Dec | Пояснения |
Number | Numeric | 5 | 0 | Идентификатор экзаменуемого (первичный ключ) |
NAME | Character | 30 | ФИО экзаменуемого | |
Birth | Numeric | 2 | 0 | Год рождения |
Kategor | Character | 5 | Сдаваемые категории транспортных средств | |
School | Character | 12 | Учебная организация экзаменуемого | |
First_PDD | Character | 1 | Какой раз сдает теорию | |
Passed_PDD | Character | 1 | Результат сдачи теории (С - сдал, П - плохо) | |
First_DRV | Character | 1 | Флаг первой сдачи вождения | |
Passed_DRV | Character | 1 | Результат сдачи вождения | |
F1_DRV | Character | 1 | Флаг повторной сдачи вождения | |
P1_DRV | Character | 1 | Результат сдачи вождения | |
Decision | Character | 5 | Решение | |
NNN | Numeric | 6 | Идентификатор результатов (вторичный ключ) | |
Exam_Date | Date | 6 | Дата экзамена | |
Supper | Character | 1 | Рудимент |
Структура таблицы DBF\Base1.dbf | ||||
---|---|---|---|---|
Field Name | Type | Size | Dec | Пояснения |
Question | Character | 8 | Билет/Вопрос | |
Answer | Numeric | 1 | 0 | № ответа |
Correct | Numeric | 1 | 0 | № правильного ответа |
Result | Character | 1 | 0 | Да/Нет (Верно/Неверно) |
Time | Numeric | 2 | 0 | Время в секундах, затраченное на ответ (не используется) |
NNN | Numeric | 6 | 0 | Идентификатор результатов (первичный ключ) |
Структура таблицы DBF\Archive0.dbf | ||||
---|---|---|---|---|
Field Name | Type | Size | Dec | Пояснения |
Number | Numeric | 5 | 0 | Идентификатор экзаменуемого (первичный ключ) |
NAME | Character | 30 | ФИО экзаменуемого | |
Birth | Numeric | 2 | 0 | Год рождения |
Kategor | Character | 5 | Сдаваемые категории транспортных средств | |
School | Character | 12 | Учебная организация экзаменуемого | |
First_PDD | Character | 1 | Какой раз сдает теорию | |
Passed_PDD | Character | 1 | Результат сдачи теории (С - сдал, П - плохо) | |
First_DRV | Character | 1 | Флаг первой сдачи вождения | |
Passed_DRV | Character | 1 | Результат сдачи вождения | |
F1_DRV | Character | 1 | Флаг повторной сдачи вождения | |
P1_DRV | Character | 1 | Результат сдачи вождения | |
Decision | Character | 5 | Решение | |
NNN | Numeric | 6 | Идентификатор результатов (вторичный ключ) | |
Exam_Date | Date | 8 | Дата экзамена | |
Supper | Character | 1 | Рудимент |
Структура таблицы DBF\Archive1.dbf | ||||
---|---|---|---|---|
Field Name | Type | Size | Dec | Пояснения |
Question | Character | 8 | Билет/Вопрос | |
Answer | Numeric | 1 | 0 | № ответа |
Correct | Numeric | 1 | 0 | № правильного ответа |
Result | Character | 3 | Да/Нет (Верно/Неверно) | |
Time | Numeric | 2 | 0 | Время в секундах, затраченное на ответ (не используется ) |
NNN | Numeric | 6 | 0 | Идентификатор результатов (первичный ключ) |
Структура таблицы tmp_base.dbf | ||||
---|---|---|---|---|
Field Name | Type | Size | Dec | Пояснения |
Name | Numeric | 3 | 0 | Текущий регистрационный номер экзаменуемого |
Question | Numeric | 3 | 0 | Номер записи в таблице вопросов Exam_w.dbf |
Answer | Numeric | 1 | 0 | № ответа экзаменуемого |
Result | Logical | 1 | Да/Нет (Верно/Неверно) | |
Time | Numeric | 2 | 0 | Содержит номер правильного ответа |
Структура таблиц Archive0.dbf и Archive1.dbf полностью повторяет структуру таблиц Base0.dbf и Base1.dbf соответственно.