Создание автоматизированных информационных систем
Разработка системы, автоматизирующей ведение базы данных библиотеки. Основные требования к программному обеспечению. Модели локальных представлений. Архитектура информационной системы. Хранимые процедуры. SQL-скрипт создания базы данных. Текст программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 28.01.2014 |
Размер файла | 2,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Содержание
Введение
1. Техническое задание
1.1 Описание предметной области
1.2 Модели вариантов использования
1.3 Требования к информационному и программному обеспечению
2. Технический проект
2.1 Модели локальных представлений
2.2 Инфологическая модель предметной области
2.3 Физическая модель базы данных
2.4 Основные запросы к базе данных
2.5 Хранимые процедуры
2.6 Архитектура информационной системы
3. Рабочий проект
3.1 SQL-скрипт создания базы данных
3.2 SQL-скрипт хранимых процедур
3.3 Текст программы
3.4 Руководство пользователя
Заключение
Список источников
Приложения
Введение
библиотека программа информационный
В настоящее время, в связи с распространением информационных технологий во всех сферах жизни, создание автоматизированных информационных систем становится все более актуальным.
Целью данной работы является разработка системы, автоматизирующей ведение базы данных библиотеки. Данная система упрощает процесс учета книг, связанный с обработкой больших объемов информации, а также позволяет читателям осуществлять в интерактивном режиме поиск и выбор интересующих книг.
Для достижения поставленной цели предполагается составление технического задания в соответствии с требованиями предметной области, разработка инфологической и физической модели базы данных на платформе Oracle, написание информационной системы на язык программирования C.
1. Техническое задание
1.1 Описание предметной области
Имеющиеся в библиотеке книги распределены в каталоге по разделам согласно тематике. Каждый раздел содержит множество книг, одна книга может относиться к нескольким разделам. Каждая книга может присутствовать в нескольких экземплярах.
Данные о читателях хранятся в картотеке. Каждый читатель может одновременно держать на руках не более пяти библиотечных книг и не более одного экземпляра каждой книги.
1.2 Модели вариантов использования
Читатель должен иметь возможность:
- просматривать каталог библиотеки и получать полный список имеющихся книг из выбранного раздела;
- после выбора книги, при наличии свободного экземпляра, получить его номер и расположение; в противном случае, иметь возможность узнать о ближайшем времени возврата экземпляра.
Библиотекарь должен:
- регистрировать новые книги в каталоге, распределяя их по разделам;
- сохранять месторасположение каждого экземпляра;
- списывать не пользующиеся спросом книги;
- выдавать читателю книги, с фиксированием номера выданного экземпляра и срока возврата книги;
- принимать книги, возвращаемые читателем, с проверкой соответствия возвращаемого номера книги выданному номеру;
- проводить списание утерянных книг или регистрацию замены.
Администрация библиотеки должна:
- иметь возможность получать сведения о должниках;
- получать сведения о популярных и непопулярных среди читателей книгах, исходя из количества взятых экземпляров;
- получать сведения о стоимости книги, чтобы установить возможность возмещения или замены утерянной книги.
1.3 Требования к информационному и программному обеспечению
Программное обеспечение должно включать в себя модули, реализующие функции каждого из пользователей, указанные в пункте 1.2.
Программные модули реализуются в виде приложения C# Windows Forms на платформе.NET Framework 4.5. Для генерации и отображения отчетов используется интегрированный в.NET Framework компонент Report Viewer.
Для управления базой данных используется СУБД Oracle 11g Express Edition.
Используемая операционная система - Windows 7.
2. Технический проект
2.1 Модели локальных представлений
Пользователями информационной системы являются читатели, библиотекари и администрация библиотеки. Локальные ER-диаграммы для указанных групп пользователей приведены на рисунках 1, 2 и 3 соответственно.
Рисунок 1. Локальная ER-диаграмма читателя
Рисунок 2. Локальная ER-диаграмма библиотекаря
Рисунок 3. Локальная ER-диаграмма администрации
Основные запросы
Запросы для пользователей группы «Администрация»:
- получить список недобросовестных читателей с указанием количества невозвратов в срок за указанный период;
- получить список самых популярных книг с указанием количества выдач за указанный период;
- получить цену утерянных книг.
Запросы для пользователей группы «Библиотекари»:
- получить список книг, находящихся на руках у читателя;
- получить список экземпляров книги, с указанием места расположения и дат выдачи и возврата.
Запросы для пользователей группы «Читатели»:
- получить номер свободного экземпляра и место расположения выбранной книги;
- при отсутствии свободного экземпляра получить ближайшую дату ожидаемого возврата.
2.2 Инфологическая модель предметной области
ER-диаграмма инфологической модели представлена на рисунке 4.
Рисунок 4. Обобщенная ER-диаграмма
Спецификация сущностей представлена в таблице 1.
Таблица 1. Спецификация сущностей
Название |
Код |
Тип |
Длина |
Обяз. |
Первич. |
|
Раздел каталога (Section) |
||||||
Код раздела |
sCode |
Integer |
X |
X |
||
Название раздела |
sName |
Variable characters(50) |
50 |
X |
||
Книга (Book) |
||||||
ISBN |
ISBN |
Characters(13) |
13 |
X |
X |
|
Название книги |
bName |
Variable characters(50) |
50 |
X |
||
Автор(ы) |
bAuthor |
Variable characters(50) |
50 |
X |
||
Место издания |
bPlace |
Variable characters(20) |
20 |
X |
||
Издательство |
bPublish |
Variable characters(20) |
20 |
X |
||
Год издания |
bYear |
Integer |
X |
|||
Количество страниц |
bPages |
Integer |
X |
|||
Экземпляр книги (Copy) |
||||||
Номер экземпляра |
cNumber |
Integer |
X |
X |
||
Стоимость экземпляра |
cCost |
Money |
X |
|||
Дата поставки |
cDate |
Date |
X |
|||
Утерян |
cLost |
Boolean |
||||
Место размещения (Place) |
||||||
Код места |
plCode |
Integer |
X |
X |
||
Отдел |
plSection |
Variable characters(50) |
50 |
X |
||
Стеллаж |
plRack |
Integer |
X |
|||
Полка |
plShelf |
Integer |
X |
|||
Сектор |
plSector |
Variable characters(2) |
2 |
X |
||
Название |
Код |
Тип |
Длина |
Обяз. |
Первич. |
|
Выдача (Issuance) |
||||||
Номер выдачи |
iNumber |
Integer |
X |
X |
||
Дата выдачи |
iIssuance |
Date |
X |
|||
Дата ожидаемого возврата |
iExpReturn |
Date |
X |
|||
Дата фактического возврата |
iFactReturn |
Date |
||||
Выбор книги читателем |
ICHOICE |
Boolean |
||||
Читатель (Reader) |
||||||
Номер читательского билета |
rNumber |
Number(6) |
6 |
X |
X |
|
ФИО |
rFullName |
Variable characters(50) |
50 |
X |
||
Адрес |
rAddress |
Variable characters(100) |
100 |
X |
||
Телефон |
rPhone |
Number(11) |
11 |
X |
||
Дата рождения |
rDate |
Date |
X |
|||
Замена (Replacement) |
||||||
Код замены |
repCode |
Integer |
X |
X |
||
Дата замены |
repDate |
Date |
X |
|||
Списание (Writeoff) |
||||||
Код списания |
woCode |
Integer |
X |
X |
||
Дата списания |
woDate |
Date |
X |
Спецификация связей представлена в таблице 2.
Таблица 2. Спецификация связей
Связь |
Тип связи |
От сущности |
К сущности |
По атрибуту |
|
хранится |
М:М |
Книга |
Раздел каталога |
ISBN / Код раздела |
|
имеется |
1:М |
Книга |
Экземпляр книги |
ISBN |
|
расположен |
1:М |
Место размещения |
Экземпляр книги |
Код места |
|
выдается |
1:М |
Экземпляр книги |
Выдача |
Номер экземпляра |
|
берет |
1:М |
Читатель |
Выдача |
Номер читательского билета |
|
заменяется |
1:М |
Замена |
Экземпляр книги |
Код замены |
|
списывается |
1:М |
Списание |
Экземпляр книги |
Код списания |
2.3 Физическая модель базы данных
Диаграмма физической модели представлена на рисунке 5.
Рисунок 5. Диаграмма физической модели базы данных
Спецификация таблиц базы данных представлена в таблице 3.
Таблица 3. Спецификация таблиц
Название |
Код |
Тип |
Длина |
Первич. |
Внеш. |
Обяз. |
|
Раздел каталога (Section) |
|||||||
Код раздела |
sCode |
INTEGER |
X |
X |
|||
Название раздела |
sName |
VARCHAR2(100) |
100 |
X |
|||
хранится (saved) |
|||||||
Код раздела |
sCode |
INTEGER |
X |
X |
|||
ISBN |
ISBN |
CHAR(13) |
13 |
X |
X |
||
Книга (Book) |
|||||||
ISBN |
ISBN |
CHAR(13) |
13 |
X |
X |
||
Название книги |
bName |
VARCHAR2(100) |
100 |
X |
|||
Автор(ы) |
bAuthor |
VARCHAR2(100) |
100 |
X |
|||
Место издания |
bPlace |
VARCHAR2(40) |
40 |
X |
|||
Издательство |
bPublish |
VARCHAR2(40) |
40 |
X |
|||
Год издания |
bYear |
INTEGER |
X |
||||
Количество страниц |
bPages |
INTEGER |
X |
||||
Экземпляр книги (Copy) |
|||||||
Номер экземпляра |
cNumber |
INTEGER |
X |
X |
|||
Код списания |
woCode |
INTEGER |
X |
X |
|||
ISBN |
ISBN |
CHAR(13) |
13 |
X |
X |
||
Код замены |
repCode |
INTEGER |
X |
X |
|||
Код места |
plCode |
INTEGER |
X |
X |
|||
Стоимость экземпляра |
cCost |
NUMBER(8, 2) |
8 |
X |
|||
Дата поставки |
cDate |
DATE |
X |
||||
Утерян |
cLost |
SMALLINT |
|||||
Место размещения (Place) |
|||||||
Код места |
plCode |
INTEGER |
X |
X |
|||
Отдел |
plSection |
VARCHAR2(100) |
100 |
X |
|||
Стеллаж |
plRack |
INTEGER |
X |
||||
Полка |
plShelf |
INTEGER |
X |
||||
Сектор |
plSector |
VARCHAR2(4) |
4 |
X |
|||
Название |
Код |
Тип |
Длина |
Первич. |
Внеш. |
Обяз. |
|
Выдача (Issuance) |
|||||||
Номер выдачи |
iNumber |
INTEGER |
X |
X |
|||
Номер экземпляра |
cNumber |
INTEGER |
X |
X |
|||
Номер читательского билета |
rNumber |
NUMBER(6) |
6 |
X |
X |
||
Дата выдачи |
iIssuance |
DATE |
X |
||||
Дата ожидаемого возврата |
iExpReturn |
DATE |
X |
||||
Дата фактического возврата |
iFactReturn |
DATE |
|||||
Выбор книги читателем |
ICHOICE |
SMALLINT |
|||||
Читатель |
|||||||
Номер читательского билета |
rNumber |
NUMBER(6) |
6 |
X |
X |
||
ФИО |
rFullName |
VARCHAR2(100) |
100 |
X |
|||
Адрес |
rAddress |
VARCHAR2(200) |
200 |
X |
|||
Телефон |
rPhone |
NUMBER(11) |
11 |
X |
|||
Дата рождения |
rDate |
DATE |
X |
||||
Замена (Replacement) |
|||||||
Код замены |
repCode |
INTEGER |
X |
X |
|||
Дата замены |
repDate |
DATE |
X |
||||
Списание (Writeoff) |
|||||||
Код списания |
woCode |
INTEGER |
X |
X |
|||
Дата списания |
woDate |
DATE |
X |
2.4 Основные запросы к базе данных
Выборка недобросовестных читателей
Из естественного соединения таблиц Читатель и Выдача выбрать ФИО, адрес, телефон читателей для которых дата фактического возврата больше даты ожидаемого возврата, либо имеет null-значение; подсчитать для каждого читателя количество выдач, удовлетворяющих данному условию (количество опозданий/долгов). Отсортировать по убыванию количества опозданий/долгов.
Выборка популярных книг за период
Выбрать из естественного соединения таблиц Книга, Экземпляр книги и Выдача название книги и сумму выдач для всех экземпляров данной книги, у которых дата выдачи лежит в заданном интервале.
Выборка цены утерянных книг
Из естественного соединения таблиц Книга, Экземпляр книги, Выдача и Читатель выбрать название книги, номер экземпляра, его цену и ФИО читателя, если флаг Утерян равен 1 и код акта замены не указан.
Выборка читателей
Из таблицы Читатель выбрать ФИО, адрес, телефон, дату рождения читателя. Если количество выдач читателю в которых ICHOICE не равен null
Выборка книг, находящихся на руках у читателя
Из естественного соединения таблиц Книга, Экземпляр книги, Выдача и Читатель выбрать ISBN и название книги для книг, у которых не указана дата фактического возврата и номер читательского соответствует заданному.
Выборка свободных экземпляров книги
Выбрать из естественного соединения таблиц Книга, Экземпляр книги, Место расположения и Выдача отдел, стеллаж, полку и сектор для экземпляров книги, ISBN которой соответствует заданному, дата фактического возврата не равна null, а дата выдачи максимальна среди выдач этого экземпляра.
Выборка недобросовестных читателей:
где Ч - отношение Читатель (Номер читательского билета, ФИО, Адрес, Телефон, Дата рождения); B - отношение Выдача (Номер выдачи, Номер экземпляра, Номер читательского билета, Дата выдачи, Дата ожидаемого возврата, Дата фактического возврата); dateBegin и dateEnd - введенные начальная и конечная даты соответственно
Выборка стоимости утерянных книг:
где К - отношение Книга(ISBN, Название книги, Автор(ы), Место издания, Издательство, Год издания, Количество страниц, Количество экземпляров); Э - отношение Экземпляр книги (Номер экземпляра, ISBN, Код списания, Код замены, Код места, Стоимость экземпляра, Дата поставки, Утерян).
Формулировка в виде выражений реляционного исчисления с переменными-кортежами
Выборка книг, находящихся на руках:
где К - отношение Книга(ISBN, Название книги, Автор(ы), Место издания, Издательство, Год издания, Количество страниц, Количество экземпляров), Э - отношение Экземпляр книги (Номер экземпляра, ISBN, Код списания, Код замены, Код места, Стоимость экземпляра, Дата поставки, Утерян), B - отношение Выдача (Номер выдачи, Номер экземпляра, Номер читательского билета, Дата выдачи, Дата ожидаемого возврата, Дата фактического возврата).
Выборка стоимости утерянных книг:
где Ч - отношение Читатель (Номер читательского билета, ФИО, Адрес, Телефон, Дата рождения); B - отношение Выдача (Номер выдачи, Номер экземпляра, Номер читательского билета, Дата выдачи, Дата ожидаемого возврата, Дата фактического возврата); К - отношение Книга(ISBN, Название книги, Автор(ы), Место издания, Издательство, Год издания, Количество страниц, Количество экземпляров); Э - отношение Экземпляр книги (Номер экземпляра, ISBN, Код списания, Код замены, Код места, Стоимость экземпляра, Дата поставки, Утерян).
Формулировка на языке SQL
Выборка недобросовестных читателей
SELECT R."rFullName" AS ФИО, R."rAddress" AS Адрес, R."rPhone" AS Телефон, R."rData" AS Дата_рождения, COUNT(I."iNumber") AS Опоздания_Долги
FROM "Reader" R, "Issuance" I
WHERE R."rNumber" = I."rNumber" AND
(I."iExpReturn" < I."iFactReturn" OR I."iFactReturn" IS NULL) AND
(I."iFactReturn" BETWEEN (select to_date('dateBegin','dd-mm-rr') from dual) AND (select to_date('dateEnd','dd-mm-rr') from dual) OR I."iFactReturn" IS NULL)
GROUP BY R."rFullName",R."rAddress",R."rPhone",R."rData"
ORDER BY Опоздания_Долги DESC
Выборка популярных книг за период
SELECT B."bName" AS Книга, B."bAuthor" AS Автор,B."bPublish" AS Издательство, B."bYear" AS Год_издания, COUNT(I."iNumber") AS Выдач
FROM "Book" B, "Issuance" I, "Copy" C
WHERE B."ISBN" = C."ISBN" AND C."cNumber" = I."cNumber" AND I."iIssuance" BETWEEN (select to_date('dateBegin','dd-mm-rr') from dual) AND (select to_date('dateEnd','dd-mm-rr') from dual)
GROUP BY B."bName",B."bAuthor",B."bPublish",B."bYear"
ORDER BY Выдач DESC
Выборка стоимости утерянных книг
SELECT B."bName" AS Книга, C."cNumber" AS Номер, C."cCost" AS "Цена",R."rFullName" AS ФИО_читателя
FROM "Book" B, "Issuance" I, "Copy" C, "Reader" R
WHERE B."ISBN" = C."ISBN" AND C."cNumber" = I."cNumber" AND I."rNumber"=R."rNumber" AND C."cLost"=1 AND C."repCode" IS NULL
Выборка читателей
SELECT R."rNumber" AS Номер_билета, R."rFullName" AS ФИО, R."rAddress" AS Адрес, R."rPhone" AS Телефон, R."rData" AS Дата_рождения, case when (select count(I."iNumber") from "Issuance" I, "Reader" R2 where I."rNumber" = R2."rNumber" AND R2."rNumber" = R."rNumber" AND I.ICHOICE IS NOT NULL group by R2."rNumber") IS NULL then 'нет' else 'да' end AS Выбрал_книгу FROM "Reader" R
Выборка книг, находящихся на руках у читателя
SELECT B.ISBN, B. "bName"
FROM "Book" B, "Copy" C, "Issuance" I, "Reader" R
WHERE I. "cNumber" = C. "cNumber" AND C. ISBN = B.ISBN AND I. "rNumber" = R. "rNumber" AND R. "rNumber" = 'RNUMBER' AND I. "iFactReturn" IS NULL AND C."cLost" = 0 AND C."repCode" IS NULL
Выбор свободных экземпляров книги читателем
SELECT C."cNumber" AS Номер, P."plSection" AS Отдел,P."plRack" AS Стеллаж,P."plShelf" AS Полка,P."plSector" AS Сектор
FROM "Book" B INNER JOIN "Copy" C ON B.ISBN = C.ISBN AND B."bName" = 'Конспект лекций по высшей математике' AND C."cLost" = 0 AND C."woCode" IS NULL
INNER JOIN "Place" P ON C."plCode" = P."plCode"
INNER JOIN "Issuance" I ON I."cNumber" = C."cNumber" AND I."iFactReturn" IS NOT NULL AND I."iIssuance"=(select max(I2."iIssuance") from "Book" B2 INNER JOIN "Copy" C2 ON B2.ISBN = C2.ISBN AND B2."bName" = 'Конспект лекций по высшей математике' AND C2."cLost" = 0 AND C2."woCode" IS NULL
INNER JOIN "Place" P2 ON C2."plCode" = P2."plCode"
INNER JOIN "Issuance" I2 ON I2."cNumber" = C2."cNumber"
WHERE C2."cNumber"=C."cNumber"
GROUP BY C2."cNumber")
2.5 Хранимые процедуры
Блок-схема алгоритма. Алгоритм регистрации нового читателя представлен на рисунке 6.
Рисунок 6. Алгоритм регистрации нового читателя
Алгоритм регистрации новой книги представлен на рисунке 7.
Рисунок 7. Алгоритм регистрации книги
Алгоритм добавления экземпляра книги представлен на рисунке 8.
Рисунок 8. Алгоритм добавления экземпляра книги
Алгоритм добавления книги в раздел каталога представлен на рисунке 9.
Рисунок 9. Алгоритм добавления книги в раздел каталога
Алгоритм редактирования экземпляра книги и изменения его места расположения представлен на рисунке 10.
Рисунок 10. Алгоритм редактирования экземпляра книги и изменения его места расположения
Алгоритм редактирования данных книги представлен на рисунке 11.
Рисунок 11. Алгоритм редактирования данных книги
Алгоритм редактирования данных читателя представлен на рисунке 12.
Рисунок 12. Алгоритм редактирования данных читателя
Код на языке PL/SQL (см. Приложение 2)
2.6 Архитектура информационной системы
Архитектуру информационной системы можно представить в виде совокупности трех элементов: базы данных, СУБД, приложения.
Приложение DBLibrary.exe реализует пользовательский интерфейс для работы с данными, хранящимися в базе. Приложение взаимодействует с базой данных посредством объектно-реляционной СУБД Oracle 11g Express Edition.
Концептуальная схема информационной системы представлена на рисунке 13.
Рисунок 13. Архитектура информационной системы
3. Рабочий проект
3.1 SQL-скрипт создания базы данных (см. Приложение 1)
3.2 SQL-скрипт хранимых процедур (см. Приложение 2)
3.3 Текст программы (см. Приложение 3).
3.4 Руководство пользователя
Введение
В данном руководстве описывается приложение DBLibrary, обеспечивающее автоматизацию ведения базы данных библиотеки.
Приложение реализует возможности, требуемые читателям, библиотекарям и администрации библиотеки по поиску и учету книг.
Пользователи системы должны иметь опыт работы с персональным компьютером на базе операционных систем Microsoft Windows на уровне квалифицированного пользователя и свободно осуществлять базовые операции.
Перед началом работы с приложением необходимо ознакомиться с
Руководством пользователя.
Назначение и условия применения
Приложение DBLibrary предназначено для автоматизации приведенных ниже функций пользователей.
Функции читателей:
- просмотр каталога библиотеки и получение полного списка имеющихся книг из выбранного раздела;
- после выбора книги, при наличии свободного экземпляра, получение его расположения; в противном случае, получение ближайшего времени возврата экземпляра данной книги.
Функции библиотекаря:
- регистрация новых книг в каталоге, с распределением их по разделам;
- сохранение месторасположения каждого экземпляра;
- выдача читателю книг, с фиксированием номера выданного экземпляра и срока возврата книги;
- списание не пользующихся спросом книг;
- списание утерянных книг по акту списания или замены.
Функции администрации:
- получение сведений о должниках;
- получение сведений о популярных и непопулярных среди читателей книгах;
- получение сведений о стоимости книги, чтобы установить возможность возмещения или замены утерянной книги.
Минимальные требования для запуска программы:
- Процессор Intel Pentium IV;
- Наличие не менее 128Mб ОЗУ;
- Наличие не менее 20Мб свободного дискового пространства;
- SVGA - графический адаптер;
- Минимальный набор периферийного оборудования.
3.4.2.3 Программное обеспечение, необходимое для функционирования программы:
- Операционная система Microsoft Windows Vista/7/8;
- СУБД Oracle 11g Express Edition;
- программная платформа.NET Framework 4.5 и выше.
Подготовка к работе
Перед началом работы необходимо удостовериться, что компьютер имеет доступ к базе данных библиотеки.
Для начала работы требуется запустить исполняемый файл DBLibrary.exe, предварительно скопировав его с дистрибутивного носителя на жесткий диск ПК. В случае успешного запуска приложения можно приступать к работе.
Описание операций
После загрузки программы отображается окно выбора пользователя (рисунок 14). Кликнув на один из элементов RadioButton и, для читателя, указав номер читательского билета, пользователь переходит в один из режимов работы в приложении.
Рисунок 14. Диалоговое окно выбора пользователя
Для читателя доступен выбор разделов каталога из выпадающего списка в левом углу окна, просмотр книг данного раздела и просмотр доступных экземпляров книги по клику на заголовок строки данной книги. В случае, если свободных экземпляров книги в данный момент нет в библиотеке пользователю будет выдана дата ожидаемого возврата книги.
Рисунок 15. Выбор экземпляра книги читателем
Для выбора книги читатель должен кликнуть по заголовку строки соответствующего экземпляра и указать дату ожидаемого возврата книги (рисунок 15). Пользователь не может выбирать более пяти книг и более одного экземпляра одной книги. В этих случаях появится соответствующее сообщение и будет заблокирован доступ к выбору книги.
Администрации библиотеки доступен просмотр результатов трех запросов, выбираемых в меню. Всю рабочую область окна в режиме работы администрации занимает таблица просмотра результатов.
Для просмотра результата запроса необходимо кликнуть его название в меню и при необходимости указать временно интервал - результат будет отображен в таблице (рисунок 16).
Рисунок 16. Просмотр результатов запроса о недобросовестных читателях
В режиме работы библиотекаря форма состоит из двух вкладок: первая - для просмотра данных о книгах и их экземплярах, вторая - для просмотра данных о читателях и выданных им книгах.
Определить, что читатель выбрал книгу библиотекарь может по значению поля «Выбор_книги» в строке читателя. Для подтверждения выдачи библиотекарь должен кликнуть заголовок строки читателя и выбрать в основном меню пункт «Выдать». Отобразится окно с данными о выбранных читателем книгах, после чего библиотекарь может подтвердить выдачу книг читателю, либо отменить ее.
Для редактирования данных читателя, необходимо кликнуть заголовок строки читателя и выбрать в меню «Правка» пункт «Редактировать». Отобразиться окно редактирования, в котором библиотекарь может изменить указанные данные читателя и сохранить изменения. Для отображения изменений в таблице читателей необходимо выбрать пункт «Обновить» в меню «Правка».
Для добавления читателя необходимо выбрать в пункте «Зарегистрировать» основного меню программы подпункт «Читателя». В отобразившемся окне по завершении ввода данных во все информационные поля нажать кнопку подтверждения и обновить данные в таблице читателей способом, описанным ранее (рисунок 17).
Рисунок 17. Окно добавления читателя
На вкладке «Книги» библиотекарь может просматривать книги, из разделов каталога, а также получать данные об экземплярах этих книг.
Для получения данных о выдачах экземпляров необходимо один раз щёлкнуть по заголовку строки книги, для получения информации обо всех экземплярах книги, включая те, что еще не были выданы, необходимо дважды щелкнуть по заголовку строки книги.
Для экземпляров книг, не возвращенных в срок, библиотекарь может установить флаг «Утерян», щелкнув заголовок строки экземпляра и выбрав в основном меню пункт «Пометить как утерянный».
Утерянные книги могут быть заменены читателем. Для оформления замены необходимо кликнуть по заголовку строки утерянного экземпляра и выбрать в основном меню пункт «Заменить» (рисунок 18). В появившемся окне необходимо будет ввести информацию о поступившей взамен книге.
Рисунок 18. Выбор акта замены или списания для утерянного экземпляра
Утраченные или старые книги могут быть списаны. Для этого необходимо, выделив строку экземпляра в таблице, выбрать в основном меню пункт «Списать».
Добавление и редактирование данных книг и их экземпляров осуществляется таким же образом как и читателей.
Аварийные ситуации
В случае обнаружения непредвиденных ошибок, некорректных данных или несанкционированного вмешательства необходимо обратиться к администратору информационной системы.
Рекомендации по освоению
Для лучшего освоения системы рекомендуется опробовать пользователям каждой из групп весь перечень доступных им действий из перечисленных выше.
Заключение
В ходе выполнения курсовой работы была проанализирована предметная область, изучены варианты использования информационной системы пользователями различных групп.
На основе полученной информации были разработаны локальные представления пользователей, объединённые затем в инфологическую модель предметной области.
Исходя из анализа инфологической модели были созданы концептуальная и физическая модели базы данных, сформулированы основные запросы к ней.
На заключительном этапе создания информационной системы было разработано приложение на языке С#, позволяющее пользователям изменять содержимое базы данных интуитивно понятным для них способом без знания принципов её устройства и функционирования.
Разработанное приложение обеспечивает достижение поставленной цели - автоматизации ведения базы данных библиотеки.
Список источников
1. Гарсиа-Молина Г., Ульман Дж.Д., Уидом Дж. Системы баз данных. Полный курс. - М.: Вильямс, 2003. 1089 с.
2. Дейт К.Дж. Введение в системы баз данных. - М.: Вильямс, 2005. - 1328 с.
Приложение 1
SQL-скрипт создания базы данных
/* DBMS name: ORACLE Version 11g */
/* Created on: 02.01.2014 6:01:07 */
alter table "Copy"
drop constraint FK_COPY_LOCATED_PLACE;
alter table "Copy"
drop constraint FK_COPY_REPLACED_REPLACEM;
alter table "Copy"
drop constraint FK_COPY_THERE_IS_BOOK;
alter table "Copy"
drop constraint FK_COPY_WRITEOFF_WRITEOFF;
alter table "Issuance"
drop constraint FK_ISSUANCE_ISSUED_COPY;
alter table "Issuance"
drop constraint FK_ISSUANCE_TAKES_READER;
alter table "saved"
drop constraint FK_SAVED_SAVED_SECTION;
alter table "saved"
drop constraint FK_SAVED_SAVED2_BOOK;
drop table "Book" cascade constraints;
drop index "located_FK";
drop index "writeoff_FK";
drop index "replaced_FK";
drop index "there_is_FK";
drop table "Copy" cascade constraints;
drop index "issued_FK";
drop index "takes_FK";
drop table "Issuance" cascade constraints;
drop table "Place" cascade constraints;
drop table "Reader" cascade constraints;
drop table "Replacement" cascade constraints;
drop table "Section" cascade constraints;
drop table "Writeoff" cascade constraints;
drop index "saved2_FK";
drop index "saved_FK";
drop table "saved" cascade constraints;
/*=====================================================
/* Table: "Book" */
/*=====================================================
create table "Book"
ISBN CHAR(13) not null,
"bName" VARCHAR2(100) not null,
"bAuthor" VARCHAR2(100) not null,
"bPlace" VARCHAR2(40) not null,
"bPublish" VARCHAR2(40) not null,
"bYear" INTEGER not null,
"bPages" INTEGER not null,
constraint PK_BOOK primary key (ISBN)
);
/*=====================================================
/* Table: "Copy" */
/*=====================================================
create table "Copy"
(
"cNumber" INTEGER not null,
"woCode" INTEGER,
ISBN CHAR(13) not null,
"repCode" INTEGER,
"plCode" INTEGER not null,
"cCost" NUMBER(8,2) not null,
"cDate" DATE not null,
"cLost" SMALLINT,
constraint PK_COPY primary key ("cNumber")
);
/*=====================================================
/* Index: "there_is_FK" */
/*=====================================================
create index "there_is_FK" on "Copy" (
ISBN ASC
);
/*=====================================================
/* Index: "replaced_FK" */
/*=====================================================
create index "replaced_FK" on "Copy" (
"repCode" ASC
);
/*=====================================================
/* Index: "writeoff_FK" */
/*=====================================================
create index "writeoff_FK" on "Copy" (
"woCode" ASC
);
/*=====================================================
/* Index: "located_FK" */
/*=====================================================
create index "located_FK" on "Copy" (
"plCode" ASC
);
/*=====================================================
/* Table: "Issuance" */
/*=====================================================
create table "Issuance"
(
"iNumber" INTEGER not null,
"cNumber" INTEGER not null,
"rNumber" NUMBER(6) not null,
"iIssuance" DATE not null,
"iExpReturn" DATE not null,
"iFactReturn" DATE,
ICHOICE SMALLINT,
constraint PK_ISSUANCE primary key ("iNumber")
);
/*=====================================================
/* Index: "takes_FK" */
/*=====================================================
create index "takes_FK" on "Issuance" (
"rNumber" ASC
);
/*=====================================================
/* Index: "issued_FK" */
/*=====================================================
create index "issued_FK" on "Issuance" (
"cNumber" ASC
);
/*=====================================================
/* Table: "Place" */
/*=====================================================
create table "Place"
(
"plCode" INTEGER not null,
"plSection" VARCHAR2(100) not null,
"plRack" INTEGER not null,
"plShelf" INTEGER not null,
"plSector" VARCHAR2(4) not null,
constraint PK_PLACE primary key ("plCode")
);
/*=====================================================
/* Table: "Reader" */
/*=====================================================
create table "Reader"
(
"rNumber" NUMBER(6) not null,
"rFullName" VARCHAR2(100) not null,
"rAddress" VARCHAR2(200) not null,
"rPhone" NUMBER(11) not null,
"rData" DATE not null,
constraint PK_READER primary key ("rNumber")
);
/*=====================================================
/* Table: "Replacement" */
/*=====================================================
create table "Replacement"
(
"repCode" INTEGER not null,
"repDate" DATE not null,
constraint PK_REPLACEMENT primary key ("repCode")
);
/*=====================================================
/* Table: "Section" */
/*=====================================================
create table "Section"
(
"sCode" INTEGER not null,
"sName" VARCHAR2(100) not null,
constraint PK_SECTION primary key ("sCode")
);
/*=====================================================
/* Table: "Writeoff" */
/*=====================================================
create table "Writeoff"
(
"woCode" INTEGER not null,
"woDate" DATE not null,
constraint PK_WRITEOFF primary key ("woCode")
);
/*=====================================================
/* Table: "saved" */
/*=====================================================
create table "saved"
(
"sCode" INTEGER not null,
ISBN CHAR(13) not null,
constraint PK_SAVED primary key ("sCode", ISBN)
);
/*=====================================================
/* Index: "saved_FK" */
/*=====================================================
create index "saved_FK" on "saved" (
"sCode" ASC
);
/*=====================================================
/* Index: "saved2_FK" */
/*=====================================================
create index "saved2_FK" on "saved" (
ISBN ASC
);
alter table "Copy"
add constraint FK_COPY_LOCATED_PLACE foreign key ("plCode")
references "Place" ("plCode");
alter table "Copy"
add constraint FK_COPY_REPLACED_REPLACEM foreign key ("repCode")
references "Replacement" ("repCode");
alter table "Copy"
add constraint FK_COPY_THERE_IS_BOOK foreign key (ISBN)
references "Book" (ISBN);
alter table "Copy"
add constraint FK_COPY_WRITEOFF_WRITEOFF foreign key ("woCode")
references "Writeoff" ("woCode");
alter table "Issuance"
add constraint FK_ISSUANCE_ISSUED_COPY foreign key ("cNumber")
references "Copy" ("cNumber");
alter table "Issuance"
add constraint FK_ISSUANCE_TAKES_READER foreign key ("rNumber")
references "Reader" ("rNumber");
alter table "saved"
add constraint FK_SAVED_SAVED_SECTION foreign key ("sCode")
references "Section" ("sCode");
alter table "saved"
add constraint FK_SAVED_SAVED2_BOOK foreign key (ISBN)
references "Book" (ISBN);
Приложение 2
SQL-скрипт хранимых процедур
CREATE OR REPLACE PROCEDURE PROCEDURE_INS_READER
(
RNAME IN VARCHAR2
, ADDRESS IN VARCHAR2
, PHONE IN NUMBER
, DATEB IN DATE
) AS
BEGIN
INSERT INTO "Reader" ("rNumber", "rFullName", "rAddress", "rPhone", "rData")
VALUES(0, RNAME,ADDRESS,PHONE,DATEB);
END PROCEDURE_INS_READER;
CREATE OR REPLACE PROCEDURE PROCEDURE_INS_BOOK
(
ISBN_ IN CHAR
, BNAME IN VARCHAR2
, AUTHOR IN VARCHAR2
, PLACE IN VARCHAR2
, PUBLISH IN VARCHAR2
, BYEAR IN NUMBER
, PAGES IN NUMBER
, SCODE IN NUMBER
) AS
BEGIN
insert into "Book"(ISBN, "bName", "bAuthor", "bPlace", "bPublish", "bYear", "bPages")
values(ISBN_, BNAME, AUTHOR, PLACE, PUBLISH, BYEAR, PAGES);
insert into "saved" ("sCode", ISBN)
values(SCODE,ISBN_);
END PROCEDURE_INS_BOOK;
CREATE OR REPLACE PROCEDURE PROCEDURE_INS_COPY
(
ISBN_ IN CHAR
, PRICE IN NUMBER
, DATEC IN DATE
, PLCODE IN NUMBER
) AS
BEGIN
insert into "Copy"("cNumber", ISBN, "plCode", "cCost", "cDate", "cLost")
values(0, ISBN_, PLCODE, PRICE, DATEC, 0);
END PROCEDURE_INS_COPY;
CREATE OR REPLACE PROCEDURE PROCEDURE_ADD_SECTION
(
ISBN_ IN CHAR
, SECTION IN NUMBER
) AS
BEGIN
insert into "saved" ("sCode", ISBN)
values(SECTION, ISBN_);
END PROCEDURE_ADD_SECTION;
CREATE OR REPLACE PROCEDURE PROCEDURE_EDIT_COPY
(
ISBN_ IN CHAR
, PRICE IN NUMBER
, CDATE IN DATE
, SECTION IN VARCHAR2
, RACK IN NUMBER
, SHELF IN NUMBER
, SECTOR IN VARCHAR2
) AS
num number(38,0);
BEGIN
select P."plCode" into num from "Place" P
where P."plSection" = SECTION AND P."plRack" = RACK AND P."plShelf" = SHELF AND P."plSector" = SECTOR;
if(num IS NOT NULL) then
begin
update "Copy" SET "plCode" = num, "cCost" = PRICE, "cDate" = CDATE
where isbn = ISBN_;
end;
else
begin
insert into "Place"("plCode", "plSection", "plRack", "plShelf", "plSector")
values(0, SECTION, RACK, SHELF, SECTOR);
update "Copy" SET "plCode" = (select max("plCode") from "Place"), "cCost" = PRICE, "cDate" = CDATE
where isbn = ISBN_;
end; end if;
END PROCEDURE_EDIT_COPY;
CREATE OR REPLACE PROCEDURE PROCEDURE_EDIT_BOOK
(
ISBN_ IN CHAR
, BNAME IN VARCHAR2
, AUTHOR IN VARCHAR2
, PLACE IN VARCHAR2
, PUBLISH IN VARCHAR2
, BYEAR IN NUMBER
, PAGES IN NUMBER
) AS
BEGIN
update "Book" SET "bName" = BNAME, "bAuthor" = AUTHOR, "bPlace" = PLACE, "bPublish" = PUBLISH, "bYear" = BYEAR, "bPages" = PAGES
where isbn = isbn_;
END PROCEDURE_EDIT_BOOK;
CREATE OR REPLACE PROCEDURE PROCEDURE_EDIT_READER
(
RID IN NUMBER
, RNAME IN VARCHAR2
, ADDRESS IN VARCHAR2
, PHONE IN NUMBER
, BDATE IN DATE
) AS
BEGIN
update "Reader" SET "rFullName" = RNAME, "rAddress" = ADDRESS, "rPhone" = PHONE, "rData" = BDATE
where "rNumber" = rid;
END PROCEDURE_EDIT_READER;
Приложение 3
Тексты основных модулей программы
Класс Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OracleClient;
namespace DBLibrary
{
static class Program
{
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
OracleConnection OC = new OracleConnection();
OC.ConnectionString = "Data source=XE; User id=system; Password=2310823";
try
{
OC.Open();
}
catch (Exception ex)
{
MessageBox.Show("Failed! " + ex.Message);
goto final;
}
try
{
while (true)
{
SelectMode SM = new SelectMode();
SM.ShowDialog();
if (SM.DialogResult == DialogResult.Yes)
Application.Run(new AReader(OC));
else if (SM.DialogResult == DialogResult.No)
Application.Run(new Librarian(OC));
else if (SM.DialogResult == DialogResult.Ignore)
Application.Run(new Administration(OC));
else
break;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
goto final;
}
final:
OC.Close();
OC.Dispose();
}
}
}
Класс SelectMode
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DBLibrary
{
public partial class SelectMode : Form
{
public SelectMode()
{
InitializeComponent();
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
}
private void button1_Click(object sender, EventArgs e)
{
if(radioButton1.Checked == true)
this.DialogResult = System.Windows.Forms.DialogResult.Yes;
else if(radioButton2.Checked == true)
this.DialogResult = System.Windows.Forms.DialogResult.No;
else if(radioButton3.Checked == true)
this.DialogResult = System.Windows.Forms.DialogResult.Ignore;
this.Close();
}
private void radioButton1_MouseDown(object sender, MouseEventArgs e)
{
radioButton1.Checked = true;
radioButton2.Checked = false;
radioButton3.Checked = false;
}
private void radioButton2_MouseDown(object sender, MouseEventArgs e)
{
radioButton1.Checked = false;
radioButton2.Checked = true;
radioButton3.Checked = false;
}
private void radioButton3_MouseDown(object sender, MouseEventArgs e)
{
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = true;
}
}
}
Класс Reader
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OracleClient;
namespace DBLibrary
{
public partial class Reader : Form
{
private AReader AR;
private int cNumber;
private string isbn;
private bool flag;
private bool clc;
public Reader(AReader A)
{
InitializeComponent();
AR = A;
this.Text = this.Text +" "+ AR.rName;
flag = false;
clc = false;
}
private void Reader_FormClosed(object sender, FormClosedEventArgs e)
{
AR.Close();
}
private void Reader_Load(object sender, EventArgs e)
{
DataTable tab;
OracleCommand Comand = AR.OC.CreateCommand();
Comand.CommandText = "SELECT B.* FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" AND I.\"iFactReturn\" IS NULL "+
"INNER JOIN \"Reader\" R ON R.\"rNumber\" = I.\"rNumber\" AND R.\"rNumber\" = (select to_number('"+AR.rNumber+"')from dual)";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
if (tab.Rows.Count == 5)
{
MessageBox.Show("Вы взяли уже пять книг и не можете выбирать новые");
return;
}
Comand.CommandText = "SELECT \"sCode\", \"sName\" FROM \"Section\"";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
comboBox1.DataSource = tab;
comboBox1.ValueMember = "sCode";
comboBox1.DisplayMember = "sName";
Comand.CommandText = "SELECT B.* FROM \"Book\" B, \"saved\" s WHERE B.ISBN = s.ISBN AND s.\"sCode\" = " +
comboBox1.SelectedValue.ToString();
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
dataGridView1.DataSource = tab.DefaultView;
}
private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
OracleCommand Comand = AR.OC.CreateCommand();
DataTable tab = new DataTable();
Comand.CommandText = "SELECT B.* FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND B.ISBN = (select to_char('" + dataGridView1[0, e.RowIndex].Value + "') from dual) AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" AND I.\"iFactReturn\" IS NULL "+
"INNER JOIN \"Reader\" R ON R.\"rNumber\" = I.\"rNumber\" AND R.\"rNumber\" = (select to_number('"+AR.rNumber+"')from dual)";
tab.Load(Comand.ExecuteReader());
if (tab.Rows.Count != 0)
{
MessageBox.Show("Вы уже выбрали эту книгу");
}
tab = new DataTable();
Comand.CommandText = "SELECT C.\"cNumber\" AS Номер, P.\"plSection\" AS Отдел,P.\"plRack\" AS Стеллаж,P.\"plShelf\" AS Полка,P.\"plSector\" AS Сектор " +
"FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND B.ISBN = (select to_char('" + dataGridView1[0, e.RowIndex].Value + "') from dual) AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Place\" P ON C.\"plCode\" = P.\"plCode\" "+
"where (select count(I.\"iNumber\") from \"Issuance\" I where I.\"cNumber\" = C.\"cNumber\" GROUP by C.\"cNumber\") IS NULL";
tab.Load(Comand.ExecuteReader());
if (tab.Rows.Count == 0)
{
tab = new DataTable();
Comand.CommandText = "SELECT C.\"cNumber\" AS Номер, P.\"plSection\" AS Отдел,P.\"plRack\" AS Стеллаж,P.\"plShelf\" AS Полка,P.\"plSector\" AS Сектор " +
"FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND B.ISBN = (select to_char('" + dataGridView1[0, e.RowIndex].Value + "') from dual) AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Place\" P ON C.\"plCode\" = P.\"plCode\" " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" AND I.\"iFactReturn\" IS NOT NULL " +
"AND I.\"iIssuance\"=(select max(I2.\"iIssuance\") from \"Book\" B2 INNER JOIN \"Copy\" C2 ON B2.ISBN = C2.ISBN AND B2.ISBN = (select to_char('" + dataGridView1[0, e.RowIndex].Value + "') from dual) AND C2.\"cLost\" = 0 AND C2.\"woCode\" IS NULL " +
"INNER JOIN \"Place\" P2 ON C2.\"plCode\" = P2.\"plCode\" " +
"INNER JOIN \"Issuance\" I2 ON I2.\"cNumber\" = C2.\"cNumber\" " +
"WHERE C2.\"cNumber\"=C.\"cNumber\"" +
"GROUP BY C2.\"cNumber\")";
tab.Load(Comand.ExecuteReader());
if (tab.Rows.Count == 0)
{
Comand.CommandText = "SELECT C.\"cNumber\" AS Номер, I.\"iExpReturn\" AS Дата_возврата " +
"FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND B.ISBN = (select to_char('" + dataGridView1[0, e.RowIndex].Value.ToString() + "') from dual) AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Place\" P ON C.\"plCode\" = P.\"plCode\" " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" AND I.\"iFactReturn\" IS NULL";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
bool f = false;
for (int i = 0; i < tab.Rows.Count; ++i)
{
if (DateTime.Compare(Convert.ToDateTime(tab.Rows[i][1].ToString()), DateTime.Today) > 0)
f = true;
}
if (!f)
{
MessageBox.Show("Книга не была возвращена в библиотеку");
return;
}
clc = true;
}
else
clc = false;
}
dataGridView2.DataSource = tab.DefaultView;
isbn = dataGridView1[0, e.RowIndex].Value.ToString();;
}
private void dataGridView2_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
OracleCommand Comand = AR.OC.CreateCommand();
Comand.CommandText = "SELECT B.* FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND B.ISBN = (select to_char('" + isbn + "') from dual) AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" AND I.\"iFactReturn\" IS NULL " +
"INNER JOIN \"Reader\" R ON R.\"rNumber\" = I.\"rNumber\" AND R.\"rNumber\" = (select to_number('" + AR.rNumber + "')from dual)";
DataTable tab = new DataTable();
tab.Load(Comand.ExecuteReader());
if (tab.Rows.Count != 0)
{
MessageBox.Show("Вы уже выбрали эту книгу");
return;
}
if (!clc)
{
cNumber = Convert.ToInt32(dataGridView2[0, e.RowIndex].Value);
label2.Visible = true;
dateTimePicker1.Visible = true;
button2.Enabled = true;
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (flag)
{
DataTable tab;
OracleCommand Comand = AR.OC.CreateCommand();
Comand.CommandText = "SELECT B.* FROM \"Book\" B, \"saved\" s WHERE B.ISBN = s.ISBN AND s.\"sCode\" = " +
comboBox1.SelectedValue.ToString();
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
dataGridView1.DataSource = tab.DefaultView;
}
flag = false;
}
private void comboBox1_MouseClick(object sender, MouseEventArgs e)
{
flag = true;
}
private void button2_Click(object sender, EventArgs e)
{
if (DateTime.Compare(dateTimePicker1.Value, DateTime.Today) <= 0)
{
MessageBox.Show("Дата возврата должна быть больше текущей даты");
return;
}
DataTable tab;
OracleCommand Comand = AR.OC.CreateCommand();
Comand.CommandText = "SELECT B.* FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND C.\"cLost\" = 0 AND C.\"woCode\" IS NULL " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" AND I.\"iFactReturn\" IS NULL " +
"INNER JOIN \"Reader\" R ON R.\"rNumber\" = I.\"rNumber\" AND R.\"rNumber\" = (select to_number('" + AR.rNumber + "')from dual)";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
if (tab.Rows.Count == 5)
{
MessageBox.Show("Вы взяли уже пять книг и не можете выбирать новые");
return;
}
Comand.CommandText = "INSERT INTO \"Issuance\" (\"iNumber\",\"cNumber\",\"rNumber\",\"iIssuance\",\"iExpReturn\",\"iFactReturn\",ICHOICE) "+
"VALUES (0, "+
"(select to_number('"+cNumber+"') from dual), "+
"(select to_number('" + AR.rNumber + "') from dual), "+
"(select to_date(SYSDATE,'dd-mm-rr') from dual), "+
"(select to_date('" + dateTimePicker1.Value.ToShortDateString()+ "','dd-mm-rr') from dual), "+
"null, 1)";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
label2.Visible = false;
dateTimePicker1.Visible = false;
button2.Enabled = false;
}
}
}
Класс Administration
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OracleClient;
namespace DBLibrary
{
public partial class Administration : Form
{
private OracleConnection OC;
private int lbl;
public Administration(OracleConnection oc)
{
InitializeComponent();
OC = oc;
lbl = 0;
}
private void Administration_Load(object sender, EventArgs e)
{
dateTimePicker1.Enabled = false;
dateTimePicker2.Enabled = false;
button1.Enabled = false;
}
private void недобросовестныеЧитателиToolStripMenuItem_Click(object sender, EventArgs e)
{
dateTimePicker1.Enabled = true;
dateTimePicker2.Enabled = true;
button1.Enabled = true;
lbl = 1;
}
private void label1_Click(object sender, EventArgs e)
{ }
private void популярныеКнигиToolStripMenuItem_Click(object sender, EventArgs e)
{
dateTimePicker1.Enabled = true;
dateTimePicker2.Enabled = true;
button1.Enabled = true;
lbl = 2;
}
private void стоимостьУтерянныхКнигToolStripMenuItem_Click(object sender, EventArgs e)
{
lbl = 3;
button1_Click(sender, e);
}
private void button1_Click(object sender, EventArgs e)
{
OracleCommand Comand = OC.CreateCommand();
DataTable table = new DataTable();
if (lbl == 1)
{
string dateBegin = dateTimePicker1.Value.ToShortDateString();
string dateEnd = dateTimePicker2.Value.ToShortDateString();
Comand.CommandText = "SELECT R.\"rFullName\" AS ФИО, R.\"rAddress\" AS Адрес, R.\"rPhone\" AS Телефон, " +
"R.\"rData\" AS Дата_рождения, COUNT(I.\"iNumber\") AS Опоздания_Долги " +
"FROM \"Reader\" R, \"Issuance\" I " +
"WHERE R.\"rNumber\" = I.\"rNumber\" AND " +
"(I.\"iExpReturn\" < I.\"iFactReturn\" OR I.\"iFactReturn\" IS NULL) AND " +
"(I.\"iFactReturn\" BETWEEN (select to_date('"+dateBegin+ "','dd-mm-rr') from dual) AND " +
"(select to_date('" + dateEnd + "','dd-mm-rr') from dual) OR I.\"iFactReturn\" IS NULL) " +
"GROUP BY R.\"rFullName\",R.\"rAddress\",R.\"rPhone\",R.\"rData\" " +
"ORDER BY Опоздания_Долги DESC";
table.Load(Comand.ExecuteReader());
dataGridView1.DataSource = table.DefaultView;
}
else if (lbl == 2)
{
string dateBegin = dateTimePicker1.Value.ToShortDateString();
string dateEnd = dateTimePicker2.Value.ToShortDateString();
Comand.CommandText = "SELECT B.\"bName\" AS Книга, B.\"bAuthor\" AS Автор,B.\"bPublish\" AS Издательство, "+
"B.\"bYear\" AS Год_издания, COUNT(I.\"iNumber\") AS Выдач "+
"FROM \"Book\" B, \"Issuance\" I, \"Copy\" C "+
"WHERE B.\"ISBN\" = C.\"ISBN\" AND C.\"cNumber\" = I.\"cNumber\" AND "+
"I.\"iIssuance\" BETWEEN (select to_date('"+dateBegin+ "','dd-mm-rr') from dual) AND "+
"(select to_date('" + dateEnd + "','dd-mm-rr') from dual)"+
"GROUP BY B.\"bName\",B.\"bAuthor\",B.\"bPublish\",B.\"bYear\""+
"ORDER BY Выдач DESC";
table.Load(Comand.ExecuteReader());
dataGridView1.DataSource = table.DefaultView;
}
else if (lbl == 3)
{
Comand.CommandText = "SELECT B.\"bName\" AS Книга, C.\"cNumber\" AS Номер, C.\"cCost\" AS \"Цена\",R.\"rFullName\" AS ФИО_читателя "+
"FROM \"Book\" B, \"Issuance\" I, \"Copy\" C, \"Reader\" R "+
"WHERE B.\"ISBN\" = C.\"ISBN\" AND C.\"cNumber\" = I.\"cNumber\" AND I.\"rNumber\"=R.\"rNumber\" AND C.\"cLost\"=1 AND C.\"repCode\" IS NULL";
table.Load(Comand.ExecuteReader());
dataGridView1.DataSource = table.DefaultView;
}
dateTimePicker1.Enabled = false;
dateTimePicker2.Enabled = false;
button1.Enabled = false;
}
}
}
Класс Librarian
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OracleClient;
namespace DBLibrary
{
public partial class Librarian : Form
{
public OracleConnection OC;
private bool flag;
private bool D;
private string isbn;
public int rNumber;
public int mode;
public int cNumber;
public Librarian(OracleConnection oc)
{
InitializeComponent();
OC = oc;
flag = false;
}
public void Librarian_Load(object sender, EventArgs e)
{
экземплярToolStripMenuItem.Visible = false;
this.Enabled = true;
выдатьToolStripMenuItem.Visible = false;
списатьToolStripMenuItem.Visible = false;
заменToolStripMenuItem.Visible = false;
DataTable tab;
OracleCommand Comand = OC.CreateCommand();
Comand.CommandText = "SELECT \"sCode\", \"sName\" FROM \"Section\"";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
comboBox1.DataSource = tab;
comboBox1.ValueMember = "sCode";
comboBox1.DisplayMember = "sName";
FLoad();
}
public void FLoad()
{
DataTable tab;
OracleCommand Comand = OC.CreateCommand();
Comand.CommandText = "SELECT B.* FROM \"Book\" B, \"saved\" s WHERE B.ISBN = s.ISBN AND s.\"sCode\" = " +
comboBox1.SelectedValue.ToString();
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
dataGridView1.DataSource = tab.DefaultView;
Comand.CommandText = "SELECT R.\"rNumber\" AS Номер_билета, R.\"rFullName\" AS ФИО, R.\"rAddress\" AS Адрес, R.\"rPhone\" AS Телефон, R.\"rData\" AS Дата_рождения, " +
"case when (select count(I.\"iIssuance\") from \"Issuance\" I, \"Reader\" R2 where I.\"rNumber\" = R2.\"rNumber\" AND R2.\"rNumber\" = R.\"rNumber\" AND I.ICHOICE IS NOT NULL group by R2.\"rNumber\")IS NULL then 'нет' else 'да' end AS Выбрал_книгу " +
"FROM \"Reader\" R";
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
dataGridView3.DataSource = tab.DefaultView;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (flag)
{
DataTable tab;
OracleCommand Comand = OC.CreateCommand();
Comand.CommandText = "SELECT B.* FROM \"Book\" B, \"saved\" s WHERE B.ISBN = s.ISBN AND s.\"sCode\" = " +
comboBox1.SelectedValue.ToString();
tab = new DataTable();
tab.Load(Comand.ExecuteReader());
dataGridView1.DataSource = tab.DefaultView;
}
flag = false;
}
private void comboBox1_MouseClick(object sender, MouseEventArgs e)
{
flag = true;
}
private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
D = false;
mode = 1;
isbn = dataGridView1[0, e.RowIndex].Value.ToString();
экземплярToolStripMenuItem.Visible = true;
OracleCommand Comand = OC.CreateCommand();
DataTable tab = new DataTable();
Comand.CommandText = "SELECT C.\"cNumber\" AS Номер, C.\"cCost\" AS Цена, C.\"cDate\" AS Дата_поставки, case when C.\"cLost\" = 0 then 'нет' else 'да' end AS Утерян, "+
"case when C.\"cLost\" = 1 AND C.\"repCode\" IS NOT NULL then 'да' when C.\"cLost\" = 1 AND C.\"repCode\" IS NULL then 'нет' else ' ' end AS Заменен, " +
"case when C.\"woCode\" IS NULL then 'нет' else 'да' end AS Списан, " +
"P.\"plSection\" AS Отдел, P.\"plRack\" AS Стеллаж, P.\"plShelf\" AS Полка, P.\"plSector\" AS Сектор, "+
"I.\"iIssuance\" AS Дата_выдачи, I.\"iExpReturn\" AS Ожид_возврат, I.\"iFactReturn\" AS Факт_возврат "+
"FROM \"Book\" B INNER JOIN \"Copy\" C ON B.ISBN = C.ISBN AND B.ISBN = (select to_char('" + isbn + "') from dual) " +
"INNER JOIN \"Place\" P ON C.\"plCode\" = P.\"plCode\" " +
"INNER JOIN \"Issuance\" I ON I.\"cNumber\" = C.\"cNumber\" " +
"AND I.\"iIssuance\"=(select max(I2.\"iIssuance\") from \"Book\" B2 INNER JOIN \"Copy\" C2 ON B2.ISBN = C2.ISBN AND B2.ISBN = (select to_char('" + isbn + "') from dual) " +
"INNER JOIN \"Place\" P2 ON C2.\"plCode\" = P2.\"plCode\" " +
"INNER JOIN \"Issuance\" I2 ON I2.\"cNumber\" = C2.\"cNumber\" " +
"WHERE C2.\"cNumber\"=C.\"cNumber\" " +
"GROUP BY C2.\"cNumber\")";
tab.Load(Comand.ExecuteReader());
dataGridView2.DataSource = tab.DefaultView;
}
private void dataGridView3_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
mode = 3;
rNumber = Convert.ToInt32(dataGridView3[0, e.RowIndex].Value);
OracleCommand Comand = OC.CreateCommand();
DataTable tab = new DataTable();
Comand.CommandText = "SELECT B.ISBN, B.\"bName\" AS Название, C.\"cNumber\" AS Номер, I.\"iExpReturn\" AS Ожид_возврат "+
"FROM \"Book\" B, \"Copy\" C, \"Issuance\" I, \"Reader\" R "+
"WHERE I.\"cNumber\" = C.\"cNumber\" AND C.ISBN = B.ISBN AND I.\"rNumber\" = R.\"rNumber\" AND R.\"rNumber\" = (select to_number('" + rNumber + "') from dual) AND I.\"iFactReturn\" IS NULL AND I.ICHOICE IS NULL";
Подобные документы
Учет книжного фонда библиотеки. Разработка концептуальной модели данных. Составление спецификации атрибутов и связей, генерация в системе PowerDesigner физической модели по концептуальной модели. Создание скрипта создания базы данных для СУБД FireBird.
контрольная работа [784,2 K], добавлен 10.04.2014Разработка структуры базы данных библиотеки для улучшения качества обслуживания, создания информационной базы и упрощения работы персонала. Создание объектов базы на языке sql-запросов. Создание хранимой процедуры с курсором, демонстрация процедуры.
курсовая работа [1,3 M], добавлен 28.12.2012Проектирование базы данных для автоматизированной системы "Склад". Разработка концептуальной модели (ER-диаграмма). Преобразование в реляционную модель и ее нормализация. Разработка запросов к базе данных на языке SQL. Скрипт для создания базы данных.
курсовая работа [161,8 K], добавлен 07.10.2013Минимальные системные требования к техническому и программному обеспечению для применения базы данных. Структура базы данных, создание таблиц (сотрудники, контакты, контракты, клиенты), запросов и форм. Описание действий при работе с базой данных.
практическая работа [1,0 M], добавлен 13.02.2011Формирование входных и выходных данных, SQL–скрипт генерации таблиц базы данных. Создание интерфейса программного приложения и проектирование форм базы данных. Требования к аппаратно–программному обеспечению. Инструкции по установке и эксплуатации.
курсовая работа [1,6 M], добавлен 08.02.2013Анализ предметной области, этапы проектирования автоматизированных информационных систем. Инструментальные системы разработки программного обеспечения. Роль CASE-средств в проектировании информационной модели. Логическая модель проектируемой базы данных.
курсовая работа [410,6 K], добавлен 21.03.2011Опыт создания автоматизированных информационных систем. Разработка автоматизированной информационной системы для строительного предприятия ООО "СТК Дело". Этапы проектирования базы данных для учета хранения строительных материалов на складе предприятия.
курсовая работа [1,7 M], добавлен 15.03.2015Классификация информационных систем. Сортировка данных в MS Access. Фильтрация данных. Изменение структуры и вида таблицы. Базы данных в Internet. Требования к программному обеспечению. Запуск справочно-правовой системы "Гарант" и ее настройки.
контрольная работа [1,5 M], добавлен 21.05.2013Определение автоматизированных информационных систем. Обоснование выбора среды разработки информационной системы. Создание запросов для выбора информации. Логическая и физическая структура реляционной базы данных. Разработка интерфейса пользователя.
курсовая работа [2,1 M], добавлен 16.04.2017Создание базы данных "Автовокзал" как части информационной системы. Требования к базе данных и этапы ее разработки. Анализ информационных потоков, выбор модели. Входные и выходные данные. Программирование базы данных на языке Borland Delphi 7.0.
курсовая работа [105,8 K], добавлен 16.05.2011