МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Дальневосточная государственная академия экономики и управления
Кафедра математики и моделирования
Курсовая работа
по базам данных и базы знаний
Разработка автоматизированной системы “Библиотека”
Студент
Нестеренко М.В.
131-ПИ
Руководитель
Озерова Г.П.
Владивосток, 2002
Оглавление
1. Введение
Имеется некоторая библиотека, в которой хранятся книги. Они различаются по авторам, по жанру, году издания, издательству, которое их выпустило, по месту издания. Каждый жанр книги имеет свою продолжительность держания на руках и пеню, начисляемую в случае не возврата книги вовремя.
В библиотеке записано некоторое количество читателей, данные о которых хранятся в специальной ведомости. Каждый читатель имеет возможность взять любую книгу, которая в данный момент находится в библиотеке.
После того, как человек взял книгу на руки, считается, что никакому другому читателю она не доступна до тех пор, пока взявший ее не вернет назад. Дата взятия книги заносится в ведомость и когда читатель возвращает книгу, учитывается, вернул ли он ее вовремя или же просрочил. В этом случае ему за каждый день просрочки начисляется пеня в установленном размере.
2. Функциональные возможности системы
Система “Библиотека” предоставляет следующие возможности для пользователей:
Занесение новых книг в фонд библиотеки
Просмотр информации о каждом зарегистрированном читателе
Просмотр всех книг, которые читатель брал за все время пользования библиотекой
Поиск необходимой читателю книги по нескольким параметрам
Просмотр книг, которые находятся на руках у читателя, а также тех, за которые он не заплатил пеню
Оплата пени за ту книгу, сдачу которой читатель просрочил
Просмотреть информацию обо всех читателях, которые зарегистрированы в библиотеке (ФИО, адрес, телефон)
3. Построение информационно-логической модели базы данных
3.1 Выделение информационных объектов
а) документы и их реквизиты, подлежащие хранению в базе данных
Документ | Наименование реквизита | Идентификатор | Функциональная зависимость |
Список | Код_автора | Код_автора | |
книг | Автор_книги | Автор | |
Авт_знак | Авт_знак | ||
Код_заглавия | Код_заглавия | ||
Заглавие_книги | Заглавие | ||
Код_вида_издания | Код_вида_издания | ||
Вид_издания | Вид_издания | ||
На_какой_срок | На_какой_срок | ||
Начисляемая_пеня | Начисляемая_пеня | ||
Код_издательства | Код_издательства | ||
Издательство | Издательство | ||
Место_издания Код_издания Библ_шифр Год_издания Аннотация Код_экземпляра На_руках? | Место_издания Код_издания Библ_шифр Год_издания Аннотация Код_экземпляра На_руках? | ||
Список | Код_улицы | Код_улицы | |
читателей | Улица_проживания | Улица | |
Дом | Дом | ||
Квартира | Квартира | ||
Код_адреса | Код_адреса | ||
Номер_билета | Номер_билета | ||
Фамилия_читателя | Фамилия | ||
Имя | Имя | ||
Отчество | Отчество | ||
Телефон | Телефон | ||
Код_ведомости | Код_ведомости | ||
Дата_оплаты | Дата_оплаты | ||
Заплачено | Заплачено | ||
Дата_выдачи | Дата_выдачи | ||
Когда_вернул | Когда_вернул | ||
Пеня | Пеня | ||
Заплатил_пеню? | Заплатил_пеню? |
б) зависимые реквизиты
Описательные реквизиты | Ключевые реквизиты |
Код_автора | Код_издания |
Автор | Код_автора |
Авт_знак | Код_автора |
Код_заглавия | Код_издания |
Заглавие | Код_заглавия |
Код_вида_издания | Код_издания |
Вид_издания | Код_вида_издания |
На_какой_срок | Код_вида_издания |
Исчисляемая_пеня | Код_вида_издания |
Код_издательства | Код_издания |
Издательство | Код_издательства |
Место_издания | Код_издательства |
Код_издания | Код_экземпляра |
Библ_шифр | Код_издания |
Год_издания | Код_издания |
Аннотация | Код_издания |
Код_экземпляра | Номер_билета |
На_руках? | Код_экземпляра |
Код_улицы | Код_адреса |
Улица | Код_улицы |
Дом | Код_адреса |
Квартира | Код_адреса |
Код_адреса | Номер_билета |
Номер_билета | Код_ведомости |
Фамилия | Номер_билета |
Имя | Номер_билета |
Отчество | Номер_билета |
Телефон | Номер_билета |
Код_ведомости | ------------------- |
Дата_оплаты | Код_ведомости |
Заплачено | Код_ведомости |
Дата_выдачи | Номер_билета |
Когда_вернул | Номер_билета |
Пеня | Номер_билета |
Заплатил_пеню? | Номер_билета |
в) группировка реквизитов
Реквизиты | Ключ | Имя инф. объекта | Описание |
Автор | Авторы | ||
Авт_знак | |||
Код_автора | 1 | ||
Заглавие | Заглавия | ||
Код_заглавия | 1 | ||
Вид_издания | Вид_издания | ||
На_какой_срок Начисляемая_пеня Код_вида_издания | 1 | ||
Издательство | Издательства | ||
Место_издания Код_издательства | 1 | ||
Код_вида_издания | Издание | ||
Код_автора | |||
Заглавие Библ_шифр Код_издательства Год_издания Аннотация Код_издания | 1 | ||
Код_издания | Экземпляр | ||
На_руках? | |||
Код_экземпляра | 1 | ||
Улица | Улица | ||
Код_улицы | 1 | ||
Улица | Адрес | ||
Дом | |||
Квартира | |||
Код_адреса | 1 | ||
Фамилия | Читатели | ||
Имя | |||
Отчество | |||
Код_адреса Телефон | |||
Номер_билета | 1 | ||
Номер_билета | Выдача | ||
Код_экземпляра Дата_выдачи Когда_вернул Пеня Заплатил_пеню? | |||
Код_читателя Код_экземпляра Дата_оплаты Заплачено Код_ведомости | Ведомость |
3.2 Структура информационных объектов базы данных
Авторы
№ | Название столбца | Тип | Ключ |
1 | Автор | текстовый | |
2 | Авт_знак | текстовый | |
3 | Код_автора | счетчик |
Заглавия
№ | Название столбца | Тип | Ключ |
1 | Заглавие | текстовый | |
2 | Код_заглавия | счетчик |
Вид_издания
№ | Название столбца | Тип | Ключ |
1 | Ви_издания | текстовый | |
2 | На_какой_срок | числовой | |
3 | Начисляемая_пеня | числовой | |
4 | Код_вида_издания | счетчик |
Издательства
№ | Название столбца | Тип | Ключ |
1 | Издательство | текстовый | |
2 | Место_издания | текстовый | |
3 | Код_издательства | счетчик |
Издание
№ | Название столбца | Тип | Ключ |
1 | Код_вида_издательства | числовой | |
2 | Код_автора | числовой | |
3 | Заглавие | числовой | |
4 | Библ_шифр | текстовый | |
5 | Код_издательства | числовой | |
6 | Год_издания | числовой | |
7 | Аннотация | Поле MEMO | |
8 | Код_издания | счетчик |
Экземпляр
№ | Название столбца | Тип | Ключ |
1 | Код_издания | числовой | |
2 | На_руках? | логический | |
3 | Код_экземпляра | счетчик |
Улицы
№ | Название столбца | Тип | Ключ |
1 | Улица | текстовый | |
2 | Код_улицы | счетчик |
Адрес
№ | Название столбца | Тип | Ключ |
1 | Улица | числовой | |
2 | Дом | текстовый | |
3 | Квартира | числовой | |
4 | Код_адреса | счетчик |
Читатели
№ | Название столбца | Тип | Ключ |
1 | Фамилия | текстовый | |
2 | Имя | текстовый | |
3 | Отчество | текстовый | |
4 | Код_адреса | числовой | |
5 | Телефон | текстовый | |
6 | Номер_билета | счетчик |
Ведомость
№ | Название столбца | Тип | Ключ |
1 | Код_читателя | числовой | |
2 | Код_экземпляра | числовой | |
3 | Дата_оплаты | дата/время | |
4 | Заплачено | числовой | |
5 | Код_ведомости | счетчик |
Выдача
№ | Название столбца | Тип | Ключ |
1 | Номер_билета | числовой | |
2 | Код_экземпляра | числовой | |
3 | Дата_выдачи | дата/время | |
4 | Когда_вернул | дата/время | |
5 | Пеня | числовой | |
6 | Заплатил_пеню? | логический |
3.3 Связи между информационными объектами
4. Проектирование алгоритмов обработки данных
Выбор книги | Книга на руках | Сдача книги |
Регистрация в библиотеке (если еще не зарегистрирован) Поиск книги в фонде Выбор найденной книги Занесение информации о взятой книги в карточку читателя Занесение в список информации, что книга на руках | Подсчет общей пени каждого читателя | Снятие книги с рук и отражение этого в списках Подсчет пени по данной книге (если такая имеется) Оплата пени |
Действия в течение года | ||
Формирование списка тех книг, которые на руках Добавление новых книг Списание старых книг Регистрация новых читателей |
5. Разработка запросов для корректировки и выборки данных
5.1 Запросы на выборку данных
Пеня – запрос для расчета задолженности читателей по каждой книге.
а) Данные из следующих таблиц должны быть включены в запрос: Авторы, Заглавия, Издание, Экземпляр, Вид_издания, Выдача, читатели.
б) структура связей между таблицами:
((Заглавия INNER JOIN (Вид_издания INNER JOIN (Авторы INNER JOIN Издание ON Авторы.Код_автора = Издание.Код_автора) ON Вид_издания.Код_вида_издания = Издание.Код_вида_издания) ON Заглавия.Код_заглавия = Издание.Заглавие) INNER JOIN Экземпляр ON Издание.Код_издания = Экземпляр.Код_издания) INNER JOIN (Читатели INNER JOIN Выдача ON Читатели.Номер_билета = Выдача.Номер_билета) ON Экземпляр.Код_экземпляра = Выдача.Код_экземпляра
в) поля, включаемы в запрос:
SELECT Читатели.Фамилия, Читатели.Имя, Читатели.Отчество, Авторы.Автор, Заглавия.Заглавие, Выдача.Дата_выдачи, Выдача!Дата_выдачи+ Вид_издания!На_какой_срок AS До_какого_числа, Выдача.Когда_вернул, (Выдача!Когда_вернул-(Выдача!Дата_выдачи +Вид_издания!На_какой_срок)) *Вид_издания!Начисляемая_пеня AS [Был долг], Выдача.Пеня AS Оплатить
г) групповая операция:
Читатели.Фамилия, Читатели.Имя, Читатели.Отчество, Авторы.Автор, Заглавия.Заглавие, Выдача.Дата_выдачи, Выдача!Дата_выдачи+Вид_издания!На_какой_срок, Выдача.Когда_вернул, (Выдача!Когда_вернул-(Выдача!Дата_выдачи +Вид_издания!На_какой_срок))*Вид_издания!Начисляемая_пеня, Выдача.Пеня
д) условие отбора:
((([Выдача]![Пеня])<>0) AND ((([Выдача]![Когда_вернул]-([Выдача]! [Дата_выдачи]+[Вид_издания]![На_какой_срок])) *[Вид_издания]! [Начисляемая_пеня])>0)) ORDER BY Читатели.Фамилия, Читатели.Имя
10 новых книг – перечень 10 самых новых книг.
10 самых постоянных читателей – перечень 10 тех читателей, которые брали наибольшее количество книг.
На_поиск_книги – запрос, необходимый для поиска (отбора) книги по необходимым параметрам.
5.2 Корректировка данных средствами запросов
Подсчет пени: обновление данных о сумме задолженности, обновление данных о читателях, которые оплатили свою задолженность.
Весь процесс можно описать в два шага.
Шаг 1: Выполнение запроса Подсчет пени (1)
Таблица Выдача |
Номер_билета Код_экземпляра Дата_выдачи Когда_вернул Пеня Заплатил_пеню? |
Данный запрос, описанный в SQL:
UPDATE ((Вид_издания INNER JOIN Издание ON Вид_издания.Код_вида_издания = Издание.Код_вида_издания) INNER JOIN Экземпляр ON Издание.Код_издания = Экземпляр.Код_издания) INNER JOIN Выдача ON Экземпляр.Код_экземпляра = Выдача.Код_экземпляра SET Выдача.Пеня = (Выдача!Когда_вернул-(Выдача!Дата_выдачи+Вид_издания!На_какой_срок)) *Вид_издания! Начисляемая_пеня WHERE ((([Выдача]![Когда_вернул]-([Выдача]![Дата_выдачи]+ [Вид_издания]! [На_какой_срок]))>0) AND (([Выдача]![Пеня])=0) AND (([Выдача]![Заплатил_пеню?])=False));
Шаг 2: Выполнение запроса Аннулировать пеню (2)
Таблица Выдача |
Номер_билета Код_экземпляра Дата_выдачи Когда_вернул Пеня Заплатил_пеню? |
Данный запрос, описанный в SQL:
UPDATE ((Вид_издания INNER JOIN Издание ON Вид_издания.Код_вида_издания = Издание.Код_вида_издания) INNER JOIN Экземпляр ON Издание.Код_издания = Экземпляр.Код_издания) INNER JOIN Выдача ON Экземпляр.Код_экземпляра = Выдача.Код_экземпляра SET Выдача.[Заплатил_пеню?] = True WHERE ((([Выдача]![Когда_вернул]) Is Not Null) AND (([Выдача]![Пеня])=0));
Вернуть_книгу – запрос на обновление: если читатель возвращает книгу, то данный запрос изменяет везде данные, что книга имеется в библиотеке в данный момент (не на руках).
На_руках_ли_книга? – запрос на обновление: проверяется, есть ли книга в фонде библиотеке в данный момент или она на руках.
Создать_таблицу – запрос на создание таблицы: создается временная таблица Заплатить с последним заплатившим пеню.
Оплата_пени – запрос на обновление: сведения из таблицы Заплатить заносятся в соответствующие списки об оплате пени.
6. Реализация пользовательского интерфейса средствами форм
1. Разберем подробно разработку Главной формы и ее вкладки Просроченные книги. Эта вкладка предназначена для просмотра информации о тех книгах, которые читатель просрочил и не заплатил пеню.
1.1) Подсхема данных:
1.2) Наилучший тип формы для построения:
В данной форме должна выдаваться информация в зависимости от выбора пользователем читателя, а это невозможно сделать с помощью составной формы. Такой тип формы, как связь по кнопке нерациональна, так как это составляет сложности для неопытных пользователей и весьма неудобно. Поэтому самым целесообразным является вложенный тип формы – пользователь может выбирать необходимого читателя и при этом сразу же сможет увидеть связанную с ним информацию.
1.3) Источники записей формы:
Для Главной формы источником записей являются следующие таблицы:
Улицы, Адрес и Читатели.
Для вложенной формы Просроченные_подчиненная форма форма источником записей являются следующие таблицы:
Заглавия, Вид_издания, Авторы, Издание, Экземпляр, Читатели и Выдача.
1.4) Связанные поля форм:
Вложенная форма Просроченные_подчиненная форма и Главная форма:
Подчиненные поля: Номер_билета.
Основные поля: Номер_билета.
1.5) Поля базы данных, которые отражены в форме:
Вложенная форма Просроченные_подчиненная форма:
Авт_знак
Автор
Заглавие
Год_издания
Вид_издания
Пеня
Главная форма:
Фамилия
1.6) Форма
7. Разработка отчетов
Фонд_библиотеки – отчет, в котором содержится информация обо всех книгах, рассортированная по авторам.
Подсхема данных:
1.2) Тип отчета: составной.
1.3) Источник записей: Издательства, Заглавия, Авторы, Издание.
1.4) Уровни группировки:
Поле/выражение | Заголовок группы | Примечание группы |
Автор | Да | Нет |
Код_автора | Да | Нет |
1.5) Поля:
Заголовок группы 'Автор'
Автор
Заголовок группы 'Код_автора'
Авт_знак
Область данных
Библ_шифр
Заглавие
Издательство
Место_издания
Год_издания
1.6) Сам отчет:
10 читателей – отчет, в котором представлена диаграмма с десятью читателями, которые брали в библиотеке наибольшее количество книг.
Читатели – отчет, в котором содержится информация обо всех читателях библиотеки и книгах, которые они брали: ФИО читателя, книга, которую он брал, дата выдачи).
8. Реализация алгоритмов обработки информации программными средствами
8.1 Реализация алгоритмов средствами макросов
Главная_форма. Оплата – макрос позволяет читателю заплатить пеню и не переплатить.
а) Сообщение
Сообщение: Вы ввели слишком большую сумму.
Сигнал: Да
Тип: Информационное
Заголовок: Слишком большая сумма
Макрокоманда выдает сообщение, если сумма, заплаченная пользователем, больше той, которую следует заплатить.
б) КЭлементуУправления
Имя элемента: [ОплатитьДолг]
Происходит переход ко вкладке ОплатитьДолг.
в) КЭлементуУправления
Имя элемента: [Заплачено]
Происходит переход к элементу Заплачено вкладки ОплатитьДолг.
г) ОткрытьЗапрос
Имя запроса: Создать_таблицу
Режим: Таблица
Режим данных: Изменение
Макрокоманда открывает запрос на создание таблицы о сумме, которую заплатил читатель.
При выполнении следующих макрокоманд необходимо, чтобы сумма, которую заплатил читатель, была меньше той, которую следует заплатить.
д) ОткрытьЗапрос
Имя запроса: Создать_таблицу
Режим: Таблица
Режим данных: Изменение
Макрокоманда открывает запрос на создание таблицы о сумме, которую заплатил читатель.
е) ОткрытьЗапрос
Имя запроса: Оплата_пени
Режим: Таблица
Режим данных: Изменение
Макрокоманда открывает запрос на обновление той суммы, которую внес читатель и которую ему осталось оплатить.
Главная_форма.Выбор_читателя – реагирование системы на выбор пользователем определенного читателя.
Главная_форма.Пеня, Главная_форма.Пеня_присвоение – переход на вкладку с оплатой пени и занесение данных в нужные ячейки.
Главная_форма.Переход – вспомогательный макрос для перехода на последнюю запись при оплате пени пользователем.
Главная_форма.Возврат_книги – возвращение читателем книги, снятие ее с рук, подсчет пени для читателя и убирание тех, кто заплатил.
Главная_форма.На_руках_ли – открытие запроса На_руках_ли?, что позволяет проверить, какие книги на руках.
Главная_форма.Закрытие_формы – закрытие формы Главная форма и применение запроса Аннулировать_долг(2), что позволяет изменить в таблицах долг читателя, если он оплатил его.
Адреса_клиентов.Кнопки – макрос по выбору читателей по заданной первой букве фамилии.
Сумма_оплаченная – переход к выбранному читателю из возможных
Поиск_книги.Фильтр – применение фильтра на основании заданных параметров.
Поиск_книги.Ошибка – выдается сообщение, если читатель пытается взять книгу, которая на руках у другого человека.
Поиск_книги.Взять – вспомогательный макрос для поиска книги.
Поиск_книги.Взял – закрывает форму Поиск_книги и записывает выбранную книгу за читателем.
Поиск_книги.Error – выдает сообщение, если при поиске книги по критериям читатель указал более или менее пяти критериев.
8.2 Реализация алгоритмов средствами Visual Basic
Следующий алгоритм предназначен для перехода на форму Адреса_клиентов после нажатия кнопки Просмотр всех читателей на главной форме:
Private Sub ВсеЧитатели_Click()
On Error GoTo Err_ВсеЧитатели_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = ChrW(1040) & ChrW(1076) & ChrW(1088) & ChrW(1077) & ChrW(1089) & ChrW(1072) & ChrW(95) & ChrW(1082) & ChrW(1083) & ChrW(1080) & ChrW(1077) & ChrW(1085) & ChrW(1090) & ChrW(1086) & ChrW(1074)
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_ВсеЧитатели_Click:
Exit Sub
Err_ВсеЧитатели_Click:
MsgBox Err.Description
Resume Exit_ВсеЧитатели_Click
End Sub
Кроме того, в автоматизированной системе “Библиотека” присутствуют и другие события, написанные средствами Visual Basic:
Событие, позволяющее подсчитать пеню читателя.
Событие, предназначенное для открытия формы Поиск_книги после нажатия кнопки Поиск_книги.
Событие, которое происходит после выбора читателем пяти критериев при поиске книги. Оно позволяет вывести на экран только те критерии, которые выбрал пользователь и после производить действия с ними.
Событие, которое происходит при нажатии читателем при выборе понравившейся ему книги.
Событие, которое скрывает все поля для ввода критериев при запуске формы Поиск_книги или повторном поиске книги.
9. Разработка приложения пользователя
Главной формой базы данных “Библиотека” является Главная форма, содержащая в себе 6 вкладок.
Вкладка Сведения о книгах.
На данной вкладке представлена информация обо всех тех книгах, которые брал тот читатель, чья фамилия выбрана в заголовке формы.
Вкладка Просроченные книги содержит информацию о просроченных книгах и о той сумме, которую следует заплатить (поле Пеня). При двойном нажатии на данное поле происходит переход на вкладку Оплатить долг.
Курсор автоматически устанавливается в последнее поле, счетчик увеличивается на единицу, датой оплаты ставится текущее число, а вверху формы автоматически проставляется текущая сумма задолженности. После того, как пользователь введет сумму, которую он хочет оплатить, ему следует нажать кнопку Рассчитать.
Вкладка Какие книги на руках отвечает за информацию о тех книгах, которые находятся на руках у читателя (если таковые имеются).
Вкладка Сведения о читателе содержит информацию о выбранном читателе. При нажатии кнопки Просмотр всех читателей открывается форма Адреса_клиентов, в которой представлена информация обо всех читателях с их адресами и телефонами.
И последняя вкладка, Найти и взять книгу, содержит данные о тех книгах, которые читатель брал. При нажатии на кнопку Поиск книги откроется форма Поиск_книги, на которой читатель может найти книгу по заданным параметрам и взять ее.
Приложения
1. Формы
2. Отчеты