Uploaded by feda523

PrimerKurs1

advertisement
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«ЮЖНО-РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ
ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ (НПИ)
имени М.И. ПЛАТОВА»
ФАКУЛЬТЕТ
КАФЕДРА
НАПРАВЛЕНИЕ
КУРСОВАЯ РАБОТА
На тему:___________________________________________
___________________________________________________
По дисциплине:__________________________________________
__________________________________________________________
Выполнил студент _____ курса, группы___ _____________________
Фамилия, имя, отчество
Принял____________________________________________________
Должность, звание
Фамилия, имя, отчество
«___» __________ _____ г.________________
Подпись
Новочеркасск 20
г.
Здесь будет тема задания.
Оглавление
1 СИСТЕМНЫЙ АНАЛИЗ.................................................................................. 5
1.1
Название и цель разработки информационной системы .................... 5
1.2
Характеристика предприятия .................................................................. 5
1.2.1
Сведения о предприятии ......................................................................... 5
1.2.2 Сведения об отношениях предприятия с действующими лицами из
окружающей среды ............................................................................................... 6
1.2.3 Детализация отношений ............................................................................. 6
1.2.4 Описание сценариев реализации процессов ........................................... 7
1.3
Сводные данные о категориях пользователей и их потребностях .. 12
1.4. Концептуальная модель данных предметной области ......................... 17
1.5 Описание специфических потребностей к программному продукту,
опосредованно связанных с предметной областью ...................................... 23
2 СИСТЕМНЫЙ АНАЛИЗ................................................................................ 24
2.1 Иерархия функций информационной системы ...................................... 24
2.2 Структура системы ....................................................................................... 28
2.2.1 Структурная схема системы .................................................................... 28
2.2.2 Описание подсистем, из которых состоит программный продукт .. 29
2.3 Проектирование пользовательского интерфейса .................................. 30
2.3.1 Схема интерфейса ...................................................................................... 30
2.3.2 Проектирование экранных форм. Эскизы и общее описание форм.
................................................................................................................................. 32
2.4 Системное проектирование. Проектирование БД ................................. 37
2.4.1 Логическая модель данных, полученная из концептуальной .......... 37
2.4.3 Описание работ, проделанных по нормализации................................ 41
2.4.3 Описание используемых средств обеспечения целостности данных
................................................................................................................................. 44
3 ТЕХНИЧЕСКОЕ ПРОЕКТИРОВАНИЕ ..................................................... 45
3.1 Выбор языка, среды, которые будут использоваться в ходе
разработки приложения ..................................................................................... 45
3
3.2 Выбор СУБД ................................................................................................... 46
3.3 Физическая модель данных ........................................................................ 48
3.3.1 Составление таблиц со списком полей физической модели ............. 49
3.4. Разработка запросов на выборку данных. .............................................. 53
ЗАКЛЮЧЕНИЕ ................................................................................................... 56
СПИСОК ЛИТЕРАТУРЫ ................................................................................. 58
ПРИЛОЖЕНИЕ. ЛИСТИНГ ПРОГРАММЫ И СКРИПТА SQL............. 59
ЛИСТИНГ ПРОГРАММЫ ............................................................................... 67
4
1 СИСТЕМНЫЙ АНАЛИЗ
1.1 Название и цель разработки информационной системы
Название проектируемой информационной системы: Информационная
система «Тренажеры для космонавтов».
В результате внедрения информационной системы должны быть достигнуты следующие цели:
 повышение производительности труда сотрудников тренажерного отдела;
 уменьшение времени поиска необходимой информации по пользователям тренажеров, администраторам тренажеров, проводимых тренировках;
 сбор и хранение данных.
Информационная система должна обеспечивать:
 учет информации о пользователях тренажеров;
 учет результатов тестирования;
 учет готовности тренажеров к работе;
 хранение данных об администраторах тренажеров.
1.2 Характеристика предприятия
1.2.1 Сведения о предприятии
Центр тренажеростроения предоставляет широкий спектр высокотехнологичных услуг по созданию тренажеров и подготовки специалистов к получению звания космонавта. Данное предприятие не имеет филиалов. Центр
тренажеростроения состоит из нескольких отделов, расположенных на тер-
5
ритории комплекса. Организационная структура центра тренажеростроения
представлена на рисунке 1.1.
Генеральный
директор
Отдел
программирования
тренажеров
Отдел создания
физических моделей
тренажеров
Отдел тестирования
тренажеров
Отдел подготовки
космонавтов
Отдел тестирования
космонавтов
Рисунок 1.1 – Организационная структура центра тренажеростроения
1.2.2 Сведения об отношениях предприятия с действующими лицами из окружающей среды
Центр тренажеростроения взаимодействует со следующими типами
действующих лиц из окружающей среды:
 Пользователь тренажера.
Центр тренажеростроения может вступать в следующие отношения с
действующими лицами из окружающей среды:
 подготовка индивидуального плана тренировки пользователя;
 проведение тренировки на тренажерах;
 сдача экзамена на тренажерах;
 присвоение пользователю звание космонавта после сдачи экзамена.
1.2.3 Детализация отношений
1. Отношение «подготовка индивидуального плана тренировки пользователя». Процессы:
 пользователь запрашивает план тренировок у начальника отдела подготовки космонавтов;
6
 оформление начальником отдела подготовки космонавтов необходимых документов;
 выдача пользователю индивидуального плана подготовки начальником
отдела подготовки космонавтов.
2. Отношение «проведение тренировки на тренажерах». Процессы:
 пользователь готовится к запуску тренажера;
 администратор симулирует условия из плана индивидуальных тренировок;
 пользователь решает задачи, сгенерированные в симуляторе тренажера.
3. Отношение «сдача экзамена на тренажерах». Процессы:
 получение начальником отдела тестирования космонавтов запроса на
сдачу экзамена от пользователя;
 оформление начальником отдела тестирования космонавтов экзаменационного варианта тренировки;
 администратор симулирует условия из экзаменационного варианта
тренировки;
 пользователь сдает экзамен.
4. Отношение «присвоение пользователю звание космонавта после сдачи экзамена». Процессы:
 пользователь получает звание космонавта.
1.2.4 Описание сценариев реализации процессов
Процесс №1 «Пользователь запрашивает план тренировок у начальника
отдела подготовки космонавтов». Сценарий №1.
7
Пользователь тренажеров в центре тренажеростроения запрашивает у
начальника отдела подготовки космонавтов индивидуальный план тренировок. Начальник отделения подготовки космонавтов рассказывает о направлениях подготовки космонавтов, просматривая документ «Направления подготовки» и сообщает, какие документы необходимо собрать пользователю, что
приступить к подготовке.
Выявленные категории пользователей: начальник отдела подготовки
космонавтов, пользователь.
Выявленные типы документов: «Направления подготовки», «Документы для оформления индивидуального плана».
Вывод: Требуется автоматизировать подачу заявок о подготовке.
Процесс №2 «Оформление начальником отдела подготовки космонавтов необходимых документов». Сценарий № 1.
Пользователь приносит в центр тренажеростроения необходимые документы для получения плана тренировок. Начальник отдела подготовки
космонавтов обрабатывает полученные данные, заносит информацию о пользователе в документ «Информация о пользователях». Однако, если документы не соответствуют, начальник отдела подготовки космонавтов отказывает
пользователю в дальнейшей подготовке. Затем заполняет документ «Индивидуальный план», расписав курс подготовки по выбранной специальности
пользователем и время его подготовки, а также заносит информацию в документ «График обучения пользователя».
Выявленные категории пользователей: начальник отдела подготовки
космонавтов, пользователь.
Выявленные типы документов: «Информация о пользователях», «Индивидуальный план», «Документы для оформления индивидуального плана»,
«График обучения пользователя».
8
Вывод: Требуется автоматизировать обработку данных.
Процесс №3 «Выдача пользователю индивидуального плана подготовки начальником отдела подготовки космонавтов». Сценарий №1.
Обработав все данные и заполнив необходимые документы, начальник
отдела подготовки космонавтов выдает пользователю «Индивидуальный
план». Пользователь подписывает «Договор обучения» и приступает к тренировкам.
Выявленные категории пользователей: начальник отдела подготовки
космонавтов, пользователь.
Выявленные типы документов: «Договор обучения», «Индивидуальный
договор».
Вывод: Данная деятельность не требует автоматизации.
Процесс №4 «Пользователь готовится к запуску тренажера». Сценарий
№1.
Пользователь приходит к администратору необходимого тренажера,
передает ему «Индивидуальный план», получает «Инструкцию пользования
тренажером» и изучает его.
Выявленные категории пользователей: пользователь, администратор
тренажера.
Выявленные типы документов: «Индивидуальный план», «Инструкция
пользования тренажером».
Вывод: Данная деятельность требует автоматизировать обмен данными
между участниками.
Процесс №5 «Администратор симулирует условия из плана индивидуальных тренировок». Сценарий №1.
9
Изучив «Индивидуальный план», администратор заносит данные о
тренировке в «Журнал тренировок».
Выявленные категории пользователей: пользователь, администратор
тренажера.
Выявленные типы документов: «Индивидуальный план», «Журнал
тренировок».
Вывод: Данная деятельность требует автоматизировать внос данных.
Процесс №6 «Пользователь решает задачи, сгенерированные в симуляторе тренажера». Сценарий №1.
Пользователь проходит тренировку, сгенерированную тренажером по
данным «Журнала тренировок». Администратор заносит данные о результатах тренировки в «Журнал результатов».
Выявленные категории пользователей: пользователь, администратор
тренажера.
Выявленные типы документов: «Журнал тренировок», «Журнал результатов».
Вывод: Данная деятельность требует автоматизировать обмен данными.
Процесс №7 «Получение начальником отдела тестирования космонавтов запроса на сдачу экзамена от пользователя». Сценарий №1.
Пользователь приходит к начальнику отдела подготовки космонавтов с
результатами тренировок и «Индивидуальным планом» и просит назначить
ему итоговый экзамен.
Выявленные категории пользователей: пользователь, начальник отдела
подготовки космонавтов.
10
Выявленные типы документов: «Индивидуальный план».
Вывод: Данная деятельность требует автоматизировать обработку данных.
Процесс №8 «Оформление начальником отдела тестирования космонавтов экзаменационного варианта тренировки». Сценарий №1.
Начальник отдела подготовки космонавтов просматривает «Индивидуальный план» и «Журнал результатов» и на их основе составляет решение о
проведение экзамена, которое вносит в «Журнал экзаменов». После передает
его администратору тренажера.
Выявленные категории пользователей: начальник отдела подготовки
космонавтов, администратор.
Выявленные типы документов: «Индивидуальный план», «Журнал результатов», «Журнал экзаменов».
Вывод: Данная деятельность требует автоматизировать обработку данных.
Процесс №9 «Администратор симулирует условия из экзаменационного варианта тренировки». Сценарий №1.
Администратор тренажера симулирует условия экзамена на тренажере
из «Журнала экзаменов» и сообщает о готовности проведения экзамена пользователю.
Выявленные категории пользователей: администратор, пользователь.
Выявленные типы документов: «Журнал экзаменов».
Вывод: Данная деятельность требует автоматизировать обработку данных.
Процесс №10 «Пользователь сдает экзамен». Сценарий №1.
11
Пользователь проходит итоговый экзамен, сгенерированную тренажером по данным «Журнала экзаменов» администратор вносит данные в «Журнал результатов».
Выявленные категории пользователей: администратор, пользователь.
Выявленные типы документов: «Журнал экзаменов», «Журнал результатов».
Вывод: Данная деятельность требует автоматизировать обработку данных.
Процесс №11 «Пользователь получает звание космонавта». Сценарий
№1.
Пользователь получает звание космонавта. Начальник отдела подготовки космонавтов отмечает в «Плане обучения», что пользователь сдал экзамен. «Договор обучения» становится неактивным, но остается в системе.
Выявленные категории пользователей: пользователь, начальник отдела
подготовки космонавтов.
Выявленные типы документов: «Договор обучения».
Вывод: Данная деятельность требует автоматизировать обработку данных.
1.3 Сводные данные о категориях пользователей и их потребностях
Перечень действующих лиц, с которыми предприятие взаимодействует
во внешней среде:
 ДЛ1. Пользователи.
Перечень действующих лиц, которые являются сотрудниками предприятия и принимают участия в процессах:
 ДЛ2. Начальник отдела подготовки космонавтов;
12
 ДЛ3. Администратор тренажера.
Перечень документов:
 Д1. «Направления подготовки»;
 Д2. «Документы для оформления индивидуального плана»;
 Д3. «Информация о пользователях»;
 Д4. «Индивидуальный план»;
 Д5. «График обучения пользователя»;
 Д6. «Договор обучения»;
 Д7. «Инструкция пользования тренажером»;
 Д8. «Журнал тренировок»;
 Д9. «Журнал результатов»;
 Д10. «Журнал экзаменов»;
 Д11. «Сотрудники центра тренажеростроения»;
 Д12. «Тренажеры центра».
Сводные данные о потребностях пользователя при разных процессах представлены в таблицах 1.1, 1.2, 1.3 и 1.4.
13
Таблица 1.1 - Сводные данные о потребностях пользователей при подготовка
индивидуального плана тренировки
Процесс и сценарий
Процесс №1
«Пользователь
запрашивает
план тренировок у начальника отдела подготовки космонавтов». Сценарий №1
Процесс №1
«Пользователь
запрашивает
план тренировок у начальника отдела подготовки космонавтов». Сценарий №1
Процесс №2
«Оформление
начальником
отдела подготовки космонавтов необходимых документов»
Процесс №2
«Оформление
начальником
отдела подготовки космонавтов необходимых документов»
Процесс №2
«Оформление
начальником
отдела подготовки космонавтов необходимых документов»
Операция и
действие
Консультация
пользователя
Действующее лицо
ДЛ2.
Начальник
отдела подготовки космонавтов
Документы и
данные, вход
-
Документы и
данные, выход
Д1. «Направления подготовки»
Получение
списка документов
ДЛ1. Пользователь
-
Д2. «Документы
для оформления
индивидуального
плана»
Получение документов
ДЛ2.
Начальник
отдела подготовки космонавтов
Д2. «Документы
для оформления
индивидуального
плана»
-
Расчёт плана
обучения
ДЛ2.
Начальник
отдела подготовки космонавтов
-
Д5. «График
обучения пользователя»
Заполнение индивидуального
плана
ДЛ2.
Начальник
отдела подготовки космонавтов
-
Д4. «Индивидуальный план»
14
Процесс №2
«Оформление
начальником
отдела подготовки космонавтов необходимых документов»
Процесс №3
«Выдача пользователю индивидуального
плана подготовки начальником
отдела подготовки космонавтов». Сценарий
№1
Внесение данных
ДЛ2.
Начальник
отдела подготовки космонавтов
Получение документов
ДЛ1. Пользователь
-
Д3. «Информация о пользователях»
Д4. «Индивидуальный план»
-
Таблица 1.2 - Сводные данные о потребностях пользователя при проведении
тренировки на тренажерах
Процесс и сценарий
Операция и действие
Действующее
лицо
Документы
и данные,
вход
-
Документы и
данные, выход
Д7. «Инструкция пользования тренажером»
Процесс №4
«Пользователь
готовится к запуску тренажера». Сценарий
№1
Процесс №5
«Администратор
симулирует условия из плана индивидуальных
тренировок».
Сценарий №1
Процесс №6
«Пользователь
решает задачи,
сгенерированные
в симуляторе
тренажера». Сценарий №1
Знакомит пользователя с правилами пользования
тренировки
ДЛ3. Администратор тренажера
Создает симуляцию
ДЛ3. Администратор тренажера
Д4. «Индивидуальный
план»
Д8. «Журнал
тренировок»
Решает полученные задачи
ДЛ1. Пользователи
Д8. «Журнал
тренировок»
15
-
Процесс №6
«Пользователь
решает задачи,
сгенерированные
в симуляторе
тренажера». Сценарий №1
Записывает результаты
ДЛ3. Администратор тренажера
-
Д8. «Журнал
результатов»
Таблица 1.3 - Сводные данные о потребностях пользователя при сдаче экзамена на тренажерах
Процесс и сценарий
Операция и
действие
Действующее
лицо
Документы и
данные, вход
Процесс №7 «Получение начальником отдела тестирования космонавтов запроса
на сдачу экзамена
от пользователя».
Сценарий №1
Процесс №8
«Оформление
начальником отдела тестирования
космонавтов экзаменационного
варианта тренировки». Сценарий
№1
Процесс №9 «Администратор симулирует условия
из экзаменационного варианта
тренировки».
Сценарий №1
Процесс №10
«Пользователь
сдает экзамен».
Сценарий №1
Процесс №10
«Пользователь
сдает экзамен».
Сценарий №1
Просит о проведении экзамена
ДЛ1. Пользователи
Д4. «Индивидуальный план»
Составление
экзамена
ДЛ2. Начальник отдела подготовки космонавтов
Д4. «Индивидуальный план», Д8.
«Журнал результатов»
Д10. «Журнал экзаменов»
Создает симуляцию
ДЛ3. Администратор тренажера
Д10. «Журнал экзаменов»
-
Решает полученные задачи
ДЛ1. Пользователи
Д10. «Журнал экзаменов»
-
Записывает результаты
ДЛ3. Администратор тренажера
-
Д8. «Журнал
результатов»
16
Документы
и данные,
выход
-
Таблица 1.4 - Сводные данные о потребностях пользователя при получении
звания космонавта
Процесс и сценарий
Процесс №11
«Пользователь
получает звание
космонавта».
Сценарий №1
Процесс №11
«Пользователь
получает звание
космонавта».
Сценарий №1
Операция и
действие
Получает звание
Действующее
лицо
ДЛ1. Пользователь
Документы и
данные, вход
-
Закрывает план
ДЛ2. Начальник
отдела подготовки космонавтов
-
Документы и
данные, выход
Д6. «Договор
обучения»
Д6. «Договор
обучения»
1.4. Концептуальная модель данных предметной области
В ходе исследования предметной области была составлена концептуальная модель данных, отображенная на рисунке 1.2 и 1.3.
17
Наименование
А1
Принадлежат R1
Отделы Е1
Номер
тренировки
А3
Дата
тренировки
А4
Время
начала
занятия А5
Работают
R4
Номер
удостовере
ния А14
Название
задания А6
Фамилия
А15
Сотрудники
центра
тренажеростро
ения Е5
Имя А16
Отчество
А17
Возраст
А18
Номер
телефона
А19
Год
создания
А8
Модель
А7
Комплекс
А2
A
B
Номер
симуляции
А10
Вес А9
Тренажеры
Е3
Ошибки
А12
Журнал
тренировок
Е2
Создают
R12
Затраченное
время А13
C
Берёт
R13
Вносят
данные
R5
Журнал
результатов
Е4
Выдает
R3
Получает
R2
Номер
экзамена
А33
Журнал
экзаменов
Е9
Дата
экзамена
А34
Время
начала
экзамена
А35
Оценивают
R6
Рисунок 1.2 – Концептуальная модель предметной области, часть 1
18
Оценка
А11
C
Номер
пользователя
А20
Пользуется
R7
Фамилия
А21
B
Сотруднича
ют R8
Пользователь
Е6
Пол А24
Имя А22
A
Составляют
R10
Номер
договора
А26
Получает R9
Отчество
А23
Договор
обучения Е7
Содержит
R11
Дата
заключения
А27
Предположительная
дата окончания А28
Номер
занятия
А29
Возраст
А25
Индивидуальный
план Е8
Тема
занятия
А30
Краткое
описание
А31
Рисунок 1.3 – Концептуальная модель предметной области, часть 2
19
Дата
занятия
А32
Справочник сущностей концептуальной модели данных представлен в
таблице 1.5.
Таблица 1.5 - Справочник сущностей концептуальной модели данных
Номер сущности
Название сущности
E1
Отделы
E2
Журнал тренировок
E3
Тренажеры
E4
Журнал результатов
E5
Сотрудники центра
тренажеростроения
E6
Пользователь
E7
Договор обучения
E8
Индивидуальный
план
Журнал экзаменов
E9
Описание сущности
Ссылка на документ
Отделы, в которых
работают сотрудники центра тренажоростроения
Журнал с данными
проходящих тренировок
Тренажеры, которые
используются в тренировках
Журнал, в который
заносятся результаты тренировок
Люди, работающие в
центре тренажеростроения
Человек, проходящий обучения в центре тренажоростроения
Договор об обучении пользователя
План тренировок
пользователя
Журнал с данными
предстоящих экзаменов
Д11
Д8
Д7, Д12
Д9
Д11
Д3, Д10
Д1, Д2, Д5, Д6
Д4
Д10, Д12
Справочник атрибутов концептуальной модели представлен в таблице
1.6.
20
Таблица 1.6 - Справочник атрибутов концептуальной модели
Номер атрибута
A1
Тип атрибута
Текст
A7
Название
атрибута
Наименование
Комплекс
Номер тренировки
Дата тренировки
Время начала
занятия
Название задания
Модель
A8
Название сущности
Описание
E1. Отделы
Название отдела
Текст
E1. Отделы
E2. Журнал тренировок
E2. Журнал тренировок
E2. Журнал тренировок
E2. Журнал тренировок
E3. Тренажеры
Год создания
Дата
E3. Тренажеры
A9
Вес
E3. Тренажеры
A10
A11
Номер симуляции
Оценка
Вещественное число
Целое число
Номер комплекса
Номер проводимой
тренировки
Дата проведения тренировки
Время начала проведения тренировки
Название проводимого
упражнения
Название модели тренажера
Год создания тренажера
Вес тренажера, в килограммах
Номер прошедшей симуляции
Оценка за симуляцию
A12
Ошибки
Целое число
A13
Затраченное
время
Номер удостоверения
Дата
A15
Фамилия
Текст
A16
Имя
Текст
A17
Отчество
Текст
A18
Возраст
Целое число
A19
Номер телефона
Номер пользователя
Фамилия
Имя
Текст
E4. Журнал результатов
E5. Сотрудники
центра тренажеростроения
E5. Сотрудники
центра тренажеростроения
E5. Сотрудники
центра тренажеростроения
E5. Сотрудники
центра тренажеростроения
E5. Сотрудники
центра тренажеростроения
E6. Пользователь
Целое число
E6. Пользователь
Текст
Текст
E6. Пользователь
E6. Пользователь
A2
A3
A4
A5
A6
A14
A20
A21
A22
Целое число
Целое число
Дата
Дата
Текст
Целое число
Целое
E4. Журнал результатов
E4. Журнал результатов
E4. Журнал результатов
21
Номер ошибок, допущенных во время выполнения
Время выполнения симуляции
Уникальный код сотрудника
Фамилия сотрудника
Имя сотрудника
Отчество сотрудника
Возраст сотрудника
Номер мобильного телефона сотрудника
Индивидуальный номер пользователя
Фамилия пользователя
Имя пользователя
A23
A24
A25
A26
A27
A28
A29
A30
A31
A32
A33
A34
A35
Отчество
Пол
Возраст
Номер договора
Дата заключения
Предположительная дата
окончания
Номер занятия
Тема занятия
Текст
Текст
Целое число
Целое число
Краткое описание
Дата занятия
Текст
Номер экзамена
Дата экзамена
Целое число
Время начала
экзамена
Время
Дата
Дата
Целое число
Текст
Дата
Дата
E6. Пользователь
E6. Пользователь
E6. Пользователь
E7. Договор обучения
E7. Договор обучения
E7. Договор обучения
Отчество пользователя
Пол пользователя
Возраст пользователя
Номер заключенного
договора
Дата заключения договора
Дата планируемого
окончания обучения
E8. Индивидуальный план
E8. Индивидуальный план
E8. Индивидуальный план
E8. Индивидуальный план
Е9. Журнал экзаменов
Е9. Журнал экзаменов
Е9. Журнал экзаменов
Номер занятия
Тема занятия
Краткое содержание
задач задания
Дата проведения занятия
Номер предстоящего
экзамена
Дата предстоящего экзамена
Время начала предстоящего экзамена
Справочник отношений концептуальной модели представлен в таблице
1.7
Таблица 1.7 - Справочник отношений концептуальной модели
Номер
Название
R1
Принадлежат
R2
Получает
R3
Выдает
R4
Работают
R5
Вносят данные
R6
Оценивают
Сущности
E1. Отделы - E3. Тренажеры
E2. Журнал тренировок - E3. Тренажеры
E3. Тренажеры - E4.
Журнал результатов
E1. Отделы - E5. Сотрудники центра тренажеростроения
E2. Журнал тренировок - E5. Сотрудники
центра тренажеростроения
E4. Журнал результатов - E5. Сотрудники
центра тренажеростроения
22
Тип отношений
1:0, 1:n
Документы
Д11, Д12
1:1, n:1
Д8, Д12
1:1, 1:n
Д9, Д12
1:1, 1:n
Д11
1:1, n:1
Д8, Д11
1:1, n:1
Д9, Д11
R7
Пользуется
R8
Сотрудничают
R9
Получает
R10
Составляют
R11
Содержит
R12
Создают
R13
Берет
E3. Тренажеры - E6.
Пользователь
E5. Сотрудники центра
тренажеростроения E6. Пользователь
E6. Пользователь - E7.
Договор обучения
E5. Сотрудники центра
тренажеростроения E7. Договор обучения
E7. Договор обучения E8. Индивидуальный
план
Е5. Сотрудники центра
тренажеростроения –
Е9. Журнал экзаменов
E3. Тренажеры - Е9.
Журнал экзаменов
1:1, 1:n
Д3, Д7, Д10,
Д12
Д3, Д11
1:1
Д1, Д5, Д6
1:1, 1:n
Д1, Д2, Д5,
Д6, Д11
1:1
Д1, Д4, Д5,
Д6
1:1, 1:n
Д10, Д11
1:1, 1:n
Д11, Д12
1:1, 1:n
1.5 Описание специфических потребностей к программному продукту, опосредованно связанных с предметной областью
В ходе исследования предметной области были составлены следующие
специфические требования к программному продукту:
 у каждого сотрудника должен быть свой уникальный номер;
 каждому сотруднику выдается свой логин и пароль для входа в систему;
 у одного пользователя в центре тренажеростроения может быть только
один договор об обучении;
 каждый пользователь имеет свой индивидуальный план.
23
2 СИСТЕМНЫЙ АНАЛИЗ
2.1 Иерархия функций информационной системы
В разрабатываемой информационной системе «Тренажеры для космонавтов» можно выделить ряд следующих обобщенных функций:
 учет сотрудников. Данная функция информационной системы позволяет осуществлять работу с информацией о сотрудниках и должностях;
 учет пользователей. Данная функция информационной системы позволяет осуществлять работу с информацией о пользователях.
 учет договоров с пользователями. Данная функция информационной
системы позволяет осуществлять работу с информацией об учебных
договорах.
 учет тренажеров. Данная функция информационной системы позволяет
осуществлять работу с информацией о тренажерах центра.
Выявленная иерархия функций информационной системы «Тренажеры
для космонавтов» представлена на рисунках 2.1, 2.2, 2.3, 2.4.
24
Учет
сотрудников
Добавление
сотрудника
Добавление отдела
Редактирование
сведений о
сотруднике
Редактирование
отдела
Увольнение
сотрудника
Удаление отдела
Учет отделов центра
тренажеростроения
Добавление
сотруднику отдела
центра
тренажеростроения
Поиск сотрудника
Рисунок 2.1 - Иерархия функций информационной системы, часть «Учет сотрудников»
25
Учет
пользователей
Добавление
пользователя
Редактирование
сведений о
пользователе
Увольнение
пользователя
Поиск
пользователя
Рисунок 2.2 - Иерархия функций информационной системы, часть «Учет
клиентов»
26
Учет договоров
Добавление
договоров
Редактирование
сведений о
договоре
Удаление
договоров
Поиск
договоров
Рисунок 2.3 - Иерархия функций информационной системы, часть «Учет договоров»
27
Учет
тренажеров
Добавление
тренажера
Редактирование
сведений о
тренажере
Удаление
тренажера
Поиск
тренажера
Рисунок 2.4 - Иерархия функций информационной системы, часть «Учет тренажеров»
2.2 Структура системы
2.2.1 Структурная схема системы
На основе описанных функций информационной системы была разработана следующая структурная схема, изображенная на рисунке 2.5.
28
Интерфейс
клиентского
приложения
Подсистема
учета
сотрудников и
отделов центра
тренажерострое
ния
Подсистема
учета
пользователей
Подсистема
учета договоров
Подсистема
учета
тренажеров
База данных
Рисунок 2.5 – Структурная схема информационной системы
2.2.2 Описание подсистем, из которых состоит программный продукт
В состав информационной системы входят:
 интерфейс клиентского приложения;
 подсистема учета сотрудников и отделов, с помощью которой осуществляется добавление сотрудников, изменение сведений о сотрудниках, увольнение сотрудников, поиск сотрудника, а также добавление,
изменение и удаление отделов;
29
 подсистема учета пользователей, с помощью которой осуществляется
добавление пользователя, изменение сведений о пользователе, удаление пользователя, поиск пользователя;
 подсистема учета документов договорах, с помощью которой осуществляется добавление договоров, изменение договоров, удаление договоров и поиск договоров;
 подсистема учета тренажеров, с помощью которой осуществляется добавление тренажера, изменение сведений о тренажере, удаление тренажера, поиск тренажера;
 база данных, в которой хранятся сведения о сотрудниках, отделах, клиентах, о документах.
2.3 Проектирование пользовательского интерфейса
2.3.1 Схема интерфейса
Схема пользовательского интерфейса представлена на рисунке 2.6.
30
Главное
окно
приложения
Окно
"Сотрудники"
Окно
"Тренажеры"
Окно
"Пользователи"
Окно
"Договоры"
Окно
"Индивидуа
льные
планы"
Форма
поиска по
отделам
Форма
поиска по
сотрудникам
Форма
поиска по
тренажерам
Форма поиска
по
пользователям
Форма
поиска по
договорам
Форма
поиска по
планам
Окно
"Журнал
тренировок"
Окно
"Журнал
результатов"
Окно
"Журнал
экзаменов"
Форма
добавления
отделов
Форма
добавления
сотрудников
Форма
добавления
тренажеров
Форма
добавления
пользователей
Форма
добавления
договоров
Форма
добавления
планов
Форма
поиска по
тренировкам
Форма
поиска по
результатам
Форма
поиска по
экзаменам
Форма
изменения
отделов
Форма
изменения
сотрудников
Форма
изменения
тренажеров
Форма
изменения
пользователей
Форма
изменения
договоров
Форма
изменения
планов
Форма
добавления
тренировок
Форма
изменения
результатов
Форма
добавления
экзаменов
Форма
удаления
отделов
Форма
удаления
сотрудников
Форма
удаления
тренажеров
Форма
удаления
пользователей
Форма
удаления
договоров
Форма
удаления
планов
Форма
изменения
тренировок
Форма
удаления
отделов
Форма
изменения
экзаменов
Форма
удаления
тренировок
Форма
удаления
результатов
Форма
удаления
экзаменов
Окно
"Отделы"
Окно
"Журналы"
Рисунок 2.6 – Схема пользовательского интерфейса
31
2.3.2 Проектирование экранных форм. Эскизы и общее описание
форм.
При входе в приложение пользователю отображается главная форма.
Из главной формы пользователь может перейти на следующие формы: «Отделы», «Сотрудники», «Тренажеры», «Пользователи», «Договоры», «Индивидуальные планы», «Журналы» (рисунок 2.7).
Рисунок 2.7 – Главная форма приложения
В любой форме можно получить соответствующие ей сведения, найти
конкретную запись, добавить новую, изменить уже имеющуюся запись, а
также удалить не нужную запись. На рисунке 2.8 представлена форма «Сотрудники».
32
Рисунок 2.8 – Форма «Сотрудники»
Нажав кнопку «Найти», переходим в форму поиска записей в этой таблице, представляющую из себя несколько элементов для ввода критериев, по
которым будет осуществляться поиск (рисунок 2.9).
33
Рисунок 2.9 – Форма поиска записей
Нажав кнопку «Добавить», переходим в форму добавления записей в
эту таблицу, представляющую из себя несколько элементов для ввода данных, которые будут добавлены в таблицу (рисунок 2.10).
34
Рисунок 2.10 – Форма добавления записей
Нажав кнопку «Обновить», переходим в форму обновления записей в
этой таблице, представляющую из себя несколько элементов для ввода данных, которые будут обновлены данные записи в таблице (рисунок 2.11).
35
Рисунок 2.11 – Форма обновления записей
Нажав кнопку «Удалить», переходим в форму удаления записей в
этой таблице, представляющую из себя несколько элементов для ввода данных, по которым будет удалена запись в таблице (рисунок 2.12).
36
Рисунок 2.12 - Форма удаления записей
Все оставшиеся формы имеют аналогичный вид и аналогичные функции. Различия заключатся в количестве колонок таблиц и форм заполнения
данных.
2.4 Системное проектирование. Проектирование БД
2.4.1 Логическая модель данных, полученная из концептуальной
На основе концептуальной модели данных была получена логическая
модель данных, изображенная на рисунке 2.13.
37
Тренажеры
PK
Серийный номер
FK1
Модель
Год выпуска
Вес
Номер отдела
Отделы
PK
Номер отдела
Наименование
Пользователи
Журнал тренировок
Сотрудники
PK
Номер удостоверения
FK1
Фамилия
Имя
Отчество
Возраст
Номер телефона
Номер отдела
PK
Номер тренировки
FK2
FK1
Дата тренировки
Время начала занятия
Название операции
Серийный номер
Номер удостоверения
PK
Номер пользователя
FK1
Фамилия
Имя
Отчество
Пол
Возраст
Серийный номер
Договор обучения
Журнал экзаменов
PK
Номер экзамена
FK1
FK2
Дата экзамена
Время начала экзамена
Серийный номер
Номер удостоверения
PK
Номер договора
FK1
FK2
Дата заключения
Дата окончания
Номер удостоверения
Номер пользователя
Индивидуальный план
Журнал результатов
PK
Номер симуляции
FK1
FK2
Оценка
Ошибки
Затраченное время
Серийный номер
Номер удостоверения
PK
Номер занятия
FK1
Тема занятия
Краткое описание
Дата занятия
Номер договора
Рисунок 2.13 - Логическая модель базы данных
В таблицах 2.1 – 2.9 представлено описание элементов логической модели.
Таблица 2.1 - Список полей для таблицы «Отдел»
№
1
Поле
Номер отдела
Тип поля
Целое число
Признаки
Pk
2
Наименование
Текст
M, u
38
Описание
Уникальный код отдела
Название отдела
Таблица 2.2 - Список полей для таблицы «Сотрудники»
№
1
Поле
Номер удостоверения
Тип поля
Целое число
Признаки
Pk
2
3
4
5
6
Фамилия
Имя
Отчество
Возраст
Номер телефона
Текст
Текст
Текст
Целое число
Текст
M, u
M, u
M, u
M, u
M, u
7
Номер отдела
Целое число
Fk, m, u
Описание
Уникальный код сотрудника
Фамилия сотрудника
Имя сотрудника
Отчество сотрудника
Возраст сотрудника
Мобильный номер
сотрудника
Уникальный код отдела
Таблица 2.3 - Список полей для таблицы «Тренажеры»
№
1
Поле
Серийный номер
Тип поля
Целое число
Признаки
Pk
2
Модель
Текст
M, u
3
Год выпуска
Дата
M, u
4
5
Вес
Номер отдела
Текст
Целое число
M, u
Fk, m, u
Описание
Уникальный код тренажера
Название модели тренажера
Год выпуска тренажера
Вес тренажера
Уникальный код отдела
Таблица 2.4 - Список полей для таблицы «Пользователи»
№
1
Поле
Номер пользователя
Тип поля
Целое число
Признаки
Pk
2
Фамилия
Текст
M, u
3
4
Имя
Отчество
Дата
Текст
M, u
M, u
5
6
7
Пол
Возраст
Серийный номер
Текст
Целое число
Целое число
M, u
M, u
Fk, m, u
39
Описание
Уникальный код
пользователя
Фамилия пользователя
Имя пользователя
Отчество пользователя
Пол пользователя
Возраст пользователя
Уникальный код тренажера
Таблица 2.5 - Список полей для таблицы «Договор обучения»
№
1
Поле
Номер договора
Тип поля
Целое число
Признаки
Pk
2
Дата заключения
Дата
M, u
3
Дата окончания
Дата
M, u
4
Номер удостоверения
Целое число
Fk1, m, u
5
Номер пользователя
Целое число
Fk2, m, u
Описание
Уникальный код договора
Уникальный код сотрудника
Дата окончания договора
Уникальный код сотрудника
Уникальный код
пользователя
Таблица 2.6 - Список полей для таблицы «Индивидуальный план»
№
1
Поле
Номер занятия
Тип поля
Целое число
Признаки
Pk
2
3
Тема занятия
Краткое описание
Текст
Текст
M, u
M, u
4
Дата занятия
Дата
M, u
5
Номер договора
Целое число
Fk, m, u
Описание
Уникальный код номера занятия
Название темы
Краткое описание занятия
Дата проведения занятия
Уникальный код договора
Таблица 2.7 - Список полей для таблицы «Журнал тренировок»
№
1
Поле
Номер тренировки
Тип поля
Целое число
Признаки
Pk
2
Дата тренировки
Дата
M, u
3
Время начала тренировки
Время
M, u
4
5
Название тренировки
Номер удостоверения
Текст
Целое число
M, u
Fk1, m, u
6
Серийный номер
Целое число
Fk2, m, u
40
Описание
Уникальный код тренировки
Дата проведения тренировки
Время начала проведения тренировки
Название тренировки
Уникальный код сотрудника
Уникальный код тренажера
Таблица 2.8 - Список полей для таблицы «Журнал результатов»
№
1
Поле
Номер симуляции
Тип поля
Целое число
Признаки
Pk
2
3
Оценка
Ошибки
Целое число
Текст
M, u
M, u
4
Затраченное время
Текст
M, u
5
Серийный номер
Целое число
Fk1, m, u
6
Номер удостоверения
Целое число
Fk2, m, u
Описание
Уникальный код результата
Оценка тренировки
Ошибки за тренировку
Комментарий о затраченном времени
Уникальный код сотрудника
Уникальный код тренажера
Таблица 2.9 - Список полей для таблицы «Журнал экзаменов»
№
1
Поле
Номер экзамена
Тип поля
Целое число
Признаки
Pk
2
Дата экзамена
Дата
M, u
3
Время начала экзамена
Время
M, u
4
Серийный номер
Целое число
Fk1, m, u
5
Номер удостоверения
Целое число
Fk2, m, u
Описание
Уникальный код экзамена
Дата проведения экзамена
Время начала проведения экзамена
Уникальный код сотрудника
Уникальный код тренажера
2.4.3 Описание работ, проделанных по нормализации
Выявлены следующие функциональные зависимости:
1. Отношение «Отделы»:
 Номер отдела => Наименование.
2. Отношение «Сотрудники»:
 Номер удостоверения => Фамилия;
 Номер удостоверения => Имя;
 Номер удостоверения => Отчество;
41
 Номер удостоверения => Возраст;
 Номер удостоверения => Номер телефона;
 Номер удостоверения => Номер отдела.
3. Отношение «Тренажеры»:
 Серийный номер => Модель;
 Серийный номер => Год выпуска;
 Серийный номер => Вес;
 Серийный номер => Номер отдела.
4. Отношение «Пользователи»:
 Номер пользователя => Фамилия;
 Номер пользователя => Имя;
 Номер пользователя => Отчество;
 Номер пользователя => Пол;
 Номер пользователя => Возраст;
 Номер пользователя => Серийный номер.
5. Отношение «Договор обучения»:
 Номер договора => Дата заключения;
 Номер договора => Дата окончания;
 Номер договора => Номер удостоверения;
 Номер договора => Номер пользователя.
6. Отношение «Индивидуальный план»:
42
 Номер занятия => Тема занятия;
 Номер занятия => Краткое описание;
 Номер занятия => Дата занятия;
 Номер занятия => Номер договора.
7. Отношение «Журнал тренировок»:
 Номер тренировки => Дата тренировки;
 Номер тренировки => Время начала тренировки;
 Номер тренировки => Название тренировки;
 Номер тренировки => Номер удостоверения;
 Номер тренировки => Серийный номер.
8. Отношение «Журнал результатов»:
 Номер симуляции => Оценка;
 Номер симуляции => Ошибки;
 Номер симуляции => Затраченное время;
 Номер симуляции => Серийный номер;
 Номер симуляции => Номер удостоверения.
9. Отношение «Журнал экзаменов»:
 Номер экзамена => Дата экзамена;
 Номер экзамена => Время начала экзамена;
 Номер экзамена => Серийный номер;
 Номер экзамена => Номер удостоверения.
43
Все приведенные выше отношения находятся в первой нормальной
форме, так как атрибуты этих отношений не упорядочены и различаются по
наименованию и все значения атрибутов атомарны.
Приведенные выше отношения находятся также и во второй нормальной форме, так как нет не ключевых атрибутов, зависящих от части сложного
ключа.
И наконец, можно сказать, что приведенные выше отношения находятся также и в третьей нормальной форме, так как все не ключевые атрибуты
этих отношений взаимно независимы.
Таким образом, видно, что логическая модель данных находится в третьей нормальной форме.
2.4.3 Описание используемых средств обеспечения целостности
данных
Правильно спроектированная и поддерживаемая база данных не допускает возможности нарушения ссылочной целостности.
В разрабатываемой базе данных для обеспечения целостности внешних
ключей используются механизмы автоматического поддержания ссылочной
целостности.
Так, при операции редактирования записи невозможно изменить значение первичного ключа. А при операции изменения внешнего ключа, хранящегося в записи, или при операции удаления записи, на которую имеются
ссылки, происходит запрет выполнения этой операции.
44
3 ТЕХНИЧЕСКОЕ ПРОЕКТИРОВАНИЕ
3.1 Выбор языка, среды, которые будут использоваться в ходе разработки приложения
Разработка Python началась еще в 80-е годы XX столетия. Вплоть до
2018 года Гвидо Ван Россум (автор языка программирования Python) принимал активное участие в развитии языка. Первая предварительная версия появилась в 1991 году.
В 1994 году в свет вышла первая версия языка Python 1.0. По мере развития, в язык добавлялись новые функции, которые привлекали все больше
разработчиков. Ежегодно в язык вносились значимые дополнения, которые
выпускались с новыми версиями. Последняя версия опубликована в октябре
2021 года.
Основной особенностью языка программирования является то, что его
достаточно просто понять и изучить, а, имея опыт работы с другими языками
программирования, изучение Python вовсе не составит никакого труда.
Одним из важнейших отличий от языка Java или C заключается в том,
что для написания приложений потребуется меньше кода.
Еще одна особенность заключается в том, что у Python есть множество
библиотек, с помощью которых можно достичь своих целей программирования намного быстрее.
C# — пятый по популярности язык программирования в мире.
К преимуществам C# относят:
 Независимость от платформы;
 Отличная совместимость с Windows;
 Управление памятью;
45
 Строгая типизация.
К недостаткам относят:
 Скорость;
 Безопасность.
После сравнения языка Python с C подобными языками программирования, предпочтение было отдано языку Python, так как программы на нем
разрабатываются в среднем в полтора-два раза быстрее, нежели на компилируемых языках. Таким образом, в ходе разработки клиентского приложения
для информационной системы будет использоваться язык программирования
Python.
Для того, чтобы облегчить написание, а также тестирование и отладку
программного кода, обычно используют специальные среды разработки. В
ходе разработки приложения будет использоваться среда разработки PyCharm Community.
3.2 Выбор СУБД
Система управления базами данных (СУБД) — совокупность программных и лингвистических средств общего или специального назначения,
обеспечивающих управление созданием и использованием баз данных.
PostgreSQL не просто реляционная, а объектно-реляционная СУБД. Это
даёт ему некоторые преимущества над другими SQL базами данных с открытым исходным кодом, такими как MySQL, MariaDB и Firebird.
Фундаментальная характеристика объектно-реляционной базы данных
— это поддержка пользовательских объектов и их поведения, включая типы
данных, функции, операции, домены и индексы. Это делает PostgreSQL невероятно гибким и надежным. Среди прочего, он умеет создавать, хранить и
извлекать сложные структуры данных.
46
Основные характеристики PostgreSQL:
 Надежность - PostgreSQL является проверенным и доказанным фактом и обеспечивается следующими возможностями:
 полное соответствие принципам ACID - атомарность, непротиворечивость, изолированность, сохранность данных;
 многоверсионность (Multiversion Concurrency Control,MVCC)
используется для поддержания согласованности данных в конкурентных условиях, в то время как в традиционных базах данных используются блокировки. MVCC означает, что каждая
транзакция видит копию данных (версию базы данных) на время
начала транзакции несмотря на то, что состояние базы могло
уже измениться. Это защищает транзакцию от несогласованных
изменений данных, которые могли быть вызваны (другой) конкурентной транзакцией, и обеспечивает изоляцию транзакций;
 наличие Write Ahead Logging (WAL) - общепринятый механизм
протоколирования всех транзакций, что позволяет восстановить
систему после возможных сбоев.
 Производительность PostgreSQL основывается на использовании
индексов, интеллектуальном планировщике запросов, тонкой системы блокировок, системой управления буферами памяти и кэширования, превосходной масштабируемости при конкурентной работе;
 Расширяемость PostgreSQL означает, что пользователь может
настраивать систему путем определения новых функций, агрегатов,
типов,языков, индексов и операторов. Объектно-ориентированность
PostgreSQL позволяет перенести логику приложения на уровень ба-
47
зы данных, что сильно упрощает разработку клиентов, так как вся
бизнес-логика находится в базе данных;
 Поддержка SQL, а также схем, подзапросов, внешних связок, правил, представлений, наследование, хранимые процедуры, триггеры
и другое;
 Богатый набор типов данных включает в себя символьные типы,
массивы, геометрические типы, сетевые типы, композитные типы и
другие;
 PostgreSQL имеет очень богатый набор встроенных функций и операторов для работы с данными;
 Интерфейсы в PostgreSQL реализованы для доступа к базе данных
из ряда языков (C, C++, C#, Python, Perl, Ruby, Php, Lisp и другие) и
методов доступа к данным (JDBC, ODBC).
Firebird — это система управления реляционными базами данных SQL
с открытым исходным кодом.
К основным характеристикам Firebird относят:






Полную поддержку триггеров и хранимых процедур;
Совместимость с концепцией ACID;
Небольшой размер;
Язык для написания хранимых процедур и триггеров;
Поддержку внешних пользовательских функций;
Безопасную запись данных.
После сравнения PostgreSQL и Firebird предпочтение было отдано PostgreSQL. Таким образом, для работы с базой данных будет использоваться
СУБД PostgreSQL.
3.3 Физическая модель данных
На основе логической модели данных с учетом выбранной СУБД была
получена физическая модель данных, представленная на рисунке 3.1.
48
Рисунок 3.1 – Физическая модель данных
3.3.1 Составление таблиц со списком полей физической модели
При переходе от логической модели к физической имена таблиц и их
элементов были изменены. Изменения представлены в таблице 3.1.
Таблица 3.1 – Таблица перекодировки
№
Исходные значения
Полученные значения
1
Номер отдела
department_id
2
Наименование
department_name
3
Номер удостоверения
employee_id
4
Фамилия
surname
5
Имя
name
6
Отчество
middle_name
7
Возраст
age
8
Номер телефона
phone_number
9
Серийный номер
serial_number
10
Модель
model
11
Год выпуска
year_of_release
12
Вес
weight
13
Номер пользователя
user_id
49
14
Пол
sex
15
Серийный номер
simulator_serial_id
16
Номер договора
contract_number
17
Дата заключения
date_of_conclusion
18
Дата окончания
end_date
19
Номер удостоверения
employee
20
Номер пользователя
user_id
21
Номер занятия
class_number
22
Тема занятия
lesson_topic
23
Краткое описание
short_description
24
Дата занятия
date_of_the_lesson
25
Номер тренировки
training_log
26
Дата тренировки
training_date
27
Время начала тренировки
class_start_time
28
Название тренировки
class_name
29
Номер симуляции
simulations_number
30
Оценка
estimation
31
Ошибки
error
32
Затраченное время
time_spent
33
Номер экзамена
exam_number
34
Дата экзамена
exam_date
35
Время начала экзамена
exam_start_date
36
Отделы
department
37
Сотрудники
employees
38
Тренажеры
simulators
39
Пользователи
users
40
Договор обучения
training_agreement
41
Индивидуальный план
individual_plan
42
Журнал тренировок
training_log
43
Журнал результатов
results_log
44
Журнал экзаменов
exam_log
50
В таблицах 3.2 – 3.10 представлено описание элементов физической
модели.
Таблица 3.2 - Список полей для таблицы «department»
№
1
Поле
department_id
Тип поля
Integer
Признаки
Pk
2
department_name
Varchar(30)
M, u
Описание
Уникальный код отдела
Название отдела
Таблица 3.3 - Список полей для таблицы «employees»
№
1
Поле
employee_id
Тип поля
Integer
Признаки
Pk
2
3
4
5
6
surname
name
middle_name
age
phone_number
Varchar(30)
Varchar(30)
Varchar(30)
Integer
Varchar(30)
M, u
M, u
M, u
M, u
M, u
7
department
Integer
Fk, m, u
Описание
Уникальный код сотрудника
Фамилия сотрудника
Имя сотрудника
Отчество сотрудника
Возраст сотрудника
Мобильный номер
сотрудника
Уникальный код отдела
Таблица 3.4 - Список полей для таблицы «simulators»
№
1
Поле
serial_number
Тип поля
Integer
Признаки
Pk
2
model
Varchar(30)
M, u
3
year_of_release
Date
M, u
4
5
weight
department
Float
Integer
M, u
Fk, m, u
Описание
Уникальный код тренажера
Название модели тренажера
Год выпуска тренажера
Вес тренажера
Уникальный код отдела
Таблица 3.5 - Список полей для таблицы «users»
№
1
Поле
user_id
Тип поля
Integer
51
Признаки
Pk
Описание
Уникальный код
пользователя
2
surname
Varchar(30)
M, u
3
4
name
middle_name
Date
Varchar(30)
M, u
M, u
5
6
7
sex
age
simulator_serial_id
Varchar(15)
Integer
Integer
M, u
M, u
Fk, m, u
Фамилия пользователя
Имя пользователя
Отчество пользователя
Пол пользователя
Возраст пользователя
Уникальный код тренажера
Таблица 3.6 - Список полей для таблицы «training_agreement»
№
1
Поле
contract_number
Тип поля
Integer
Признаки
Pk
2
date_of_conclusion
Date
M, u
3
end_date
Date
M, u
4
employee
Integer
Fk1, m, u
5
user_id
Integer
Fk2, m, u
Описание
Уникальный код договора
Уникальный код сотрудника
Дата окончания договора
Уникальный код сотрудника
Уникальный код
пользователя
Таблица 3.7 - Список полей для таблицы «individual_plan»
№
1
Поле
class_number
Тип поля
Integer
Признаки
Pk
2
3
lesson_topic
short_description
Varchar(30)
Varchar(30)
M, u
M, u
4
date_of_the_lesson
Date
M, u
5
contract_number
Integer
Fk, m, u
Описание
Уникальный код номера занятия
Название темы
Краткое описание занятия
Дата проведения занятия
Уникальный код договора
Таблица 3.8 - Список полей для таблицы «training_log»
№
1
Поле
training_log
Тип поля
Integer
Признаки
Pk
2
training_date
Date
M, u
52
Описание
Уникальный код тренировки
Дата проведения тренировки
3
class_start_time
Time
M, u
4
5
class_name
serial_number
Varchar(30)
Integer
M, u
Fk1, m, u
6
employee
Integer
Fk2, m, u
Время начала проведения тренировки
Название тренировки
Уникальный код сотрудника
Уникальный код тренажера
Таблица 3.9 - Список полей для таблицы «results_log»
№
1
Поле
simulations_number
Тип поля
Integer
Признаки
Pk
2
3
estimation
error
Integer
Varchar(30)
M, u
M, u
4
time_spent
Varchar(30)
M, u
5
serial_number
Integer
Fk1, m, u
6
employee
Integer
Fk2, m, u
Описание
Уникальный код результата
Оценка тренировки
Ошибки за тренировку
Комментарий о затраченном времени
Уникальный код сотрудника
Уникальный код тренажера
Таблица 3.10 - Список полей для таблицы «exam_log»
№
1
Поле
exam_number
Тип поля
Integer
Признаки
Pk
2
exam_date
Date
M, u
3
exam_start_date
Time
M, u
4
serial_number
Integer
Fk1, m, u
5
employee
Integer
Fk2, m, u
Описание
Уникальный код экзамена
Дата проведения экзамена
Время начала проведения экзамена
Уникальный код сотрудника
Уникальный код тренажера
3.4. Разработка запросов на выборку данных.
В ходе проектирования базы данных были разработаны различные запросы на выборку данных из БД:
1. Вывод всех данных из БД;
53
2. Вывод данных по интересующим нас критериям.
Так же в программе возможно удаление и редактирование данных.
Вывод всех данных осуществляется с помощью команды SELECT. Результат отображения данных таблицы «Сотрудники» показан на рисунке 3.1.
Рисунок 3.1 – Вывод всех данных
Рассмотрим запрос с выводом сотрудников, работающих в отделе №1.
Запрос выполнен с помощью Select:
SELECT * FROM employees WHERE department = 1
Результат запроса показан на рисунке 3.2.
54
Рисунок 3.2 – Выполнение запроса
55
ЗАКЛЮЧЕНИЕ
В курсовой работе на основе данных, полученных при анализе предметной области и анализе особенностей работы предприятия, была разработана и реализована база данных для ведения необходимой информации, составлен и реализован ряд алгоритмов для выполнения функций обработки
информации, соответствующих специфике работы предприятия.
Информационная система предназначена для ведения информации о
сотрудниках предприятия, пользователях и договорах об обучении.
Информационная система обеспечивает следующие функции:
 учет информации о пользователях;
 учет информации о договорах;
 фиксация сообщений о проходимых тренировках на тренажерах;
 хранение данных о сотрудниках предприятия.
Преимуществами созданной системы является повышение производительности труда сотрудников предприятия, уменьшение времени ожидания
пользователей, уменьшение времени поиска необходимой информации по
договорам, пользователям, сотрудникам.
В первой главе работы составлена характеристика предприятия, описаны данные о категориях пользователей и их потребностях, разработана концептуальная модель данных предметной области.
Во второй главе работы составлена функциональная схема разрабатываемого приложения, спроектированы схема информационной системы, а
также схема пользовательского интерфейса, разработана логическая модель
данных и проведена работа по нормализации логической модели, описаны
используемые средства обеспечения целостности данных.
56
В третьей главе работы рассмотрены вопросы технического проектирования информационной системы. Обоснован выбор комплекса технических
средств и СУБД, построена физическая модель данных проектируемой базы
данных.
При разработке системы были использованы следующие приложения:
 PyCharm Community;
 PostgreSQL.
При оформлении пояснительной записки использовались:
 Microsoft Word 2016;
 Microsoft Visio 2016.
57
СПИСОК ЛИТЕРАТУРЫ
1. Дейт К. Введение в системы баз данных – М., 1980 г., 464 стр.
2. Зеленков Ю. А. Введение в базы данных – 1997 г.
3. Мартин Г. Понимание SQL – М.: 1993 г., 291 стр.
4. Пушников Ф. Ю. Введение в системы управления базами данных –
Уфа: 1999 г.
5. Руководство по языку программирования Python, интернет-ресурс:
https://metanit.com/python/tutorial/
6. Документация по PostgreSQL 15.1, интернет-ресурс:
https://www.postgresql.org/docs/current/index.html
58
ПРИЛОЖЕНИЕ. ЛИСТИНГ ПРОГРАММЫ И СКРИПТА SQL
SQL скрипт. Создание базы данных и таблиц.
SET statement_timeout = 0;
SET check_function_bodies = false;
SET lock_timeout = 0;
SET xmloption = content;
SET idle_in_transaction_session_timeout =
SET client_min_messages = warning;
0;
SET row_security = off;
SET client_encoding = 'UTF8';
SET default_tablespace = '';
SET standard_conforming_strings = on;
SET default_table_access_method = heap;
SELECT
CREATE TABLE public.department (
pg_catalog.set_config('search_path', '', false);
department_id integer NOT NULL,
SET check_function_bodies = false;
department_name character varying(30)
SET xmloption = content;
NOT NULL
SET client_min_messages = warning;
);
SET row_security = off;
ALTER TABLE public.department OWNCREATE DATABASE "Kurs_DB" WITH
ER TO postgres;
TEMPLATE = template0 ENCODING = 'UTF8'
ALTER TABLE public.department ALTER
LOCALE_PROVIDER = libc LOCALE = 'Rus-
COLUMN department_id ADD GENERATED AL-
sian_Russia.1251';
WAYS AS IDENTITY (
ALTER DATABASE "Kurs_DB" OWNER
SEQUENCE
TO postgres;
NAME
lic."Department_department_id_seq"
\connect "Kurs_DB"
START WITH 1
SET statement_timeout = 0;
INCREMENT BY 1
SET lock_timeout = 0;
NO MINVALUE
SET idle_in_transaction_session_timeout =
NO MAXVALUE
0;
CACHE 1
SET client_encoding = 'UTF8';
);
SET standard_conforming_strings = on;
CREATE TABLE public.employees (
SELECT
pg_catalog.set_config('search_path', '', false);
employee_id integer NOT NULL,
59
pub-
surname
character
varying(30)
NOT
serial_number integer DEFAULT 1 NOT
NULL,
NULL,
name character varying(30) NOT NULL,
employee integer DEFAULT 1 NOT
NULL
middle_name character varying(30) DEFAULT '-'::character varying,
);
age integer NOT NULL,
ALTER TABLE public.exam_log OWNER
TO postgres;
phone_number character varying(15) DEFAULT 'Отсутствует'::character varying,
department integer DEFAULT 1 NOT
ALTER TABLE public.exam_log ALTER
NULL
COLUMN exam_number ADD GENERATED ALWAYS AS IDENTITY (
);
SEQUENCE
ALTER TABLE public.employees OWNER
NAME
pub-
lic."Exam_log_exam_number_seq"
TO postgres;
START WITH 1
ALTER TABLE public.employees ALTER
COLUMN employee_id ADD GENERATED AL-
INCREMENT BY 1
WAYS AS IDENTITY (
NO MINVALUE
SEQUENCE
NAME
pubNO MAXVALUE
lic."Employees_employee_id_seq"
CACHE 1
START WITH 1
);
INCREMENT BY 1
CREATE TABLE public.individual_plan (
NO MINVALUE
class_number integer NOT NULL,
NO MAXVALUE
lesson_topic character varying(30) NOT
CACHE 1
NULL,
);
short_description character varying(100)
CREATE TABLE public.exam_log (
NOT NULL,
exam_number integer NOT NULL,
date_of_the_lesson date NOT NULL,
exam_date date NOT NULL,
contract_number integer NOT NULL
exam_start_time time without time zone
);
NOT NULL,
ALTER
TABLE
OWNER TO postgres;
60
public.individual_plan
ALTER
TABLE
public.individual_plan
SEQUENCE
ALTER COLUMN class_number ADD GENERAT-
NAME
pub-
lic."Results_log_simulation_number_seq"
ED ALWAYS AS IDENTITY (
START WITH 1
SEQUENCE
NAME
pubINCREMENT BY 1
lic."Individual_plan_class_number_seq"
NO MINVALUE
START WITH 1
NO MAXVALUE
INCREMENT BY 1
CACHE 1
NO MINVALUE
);
NO MAXVALUE
CREATE TABLE public.simulators (
CACHE 1
serial_number integer NOT NULL,
);
model character varying(30) NOT NULL,
year_of_release date NOT NULL,
CREATE TABLE public.results_log (
weight real NOT NULL,
simulation_number integer NOT NULL,
department integer NOT NULL
estimation integer NOT NULL,
);
error character varying(100) DEFAULT ''::character varying NOT NULL,
ALTER TABLE public.simulators OWNER
TO postgres;
time_spent character varying(20) NOT
NULL,
ALTER TABLE public.simulators ALTER
COLUMN serial_number ADD GENERATED AL-
serial_number integer DEFAULT 1 NOT
WAYS AS IDENTITY (
NULL,
SEQUENCE
employee integer DEFAULT 1 NOT
NAME
lic."Simulators_serial_number_seq"
NULL,
CONSTRAINT
START WITH 1
estimation_check
CHECK (((estimation > 1) AND (estimation < 6)))
INCREMENT BY 1
);
NO MINVALUE
ALTER TABLE public.results_log OWNER
NO MAXVALUE
TO postgres;
CACHE 1
ALTER TABLE public.results_log ALTER
);
COLUMN simulation_number ADD GENERATED
ALWAYS AS IDENTITY (
61
pub-
CREATE
TABLE
pub-
class_name character varying(50) NOT
lic.training_agreement (
NULL,
contract_number integer NOT NULL,
serial_number integer DEFAULT 1 NOT
NULL,
date_of_conclusion date NOT NULL,
employee integer DEFAULT 1 NOT
end_date date GENERATED ALWAYS
AS
((date_of_conclusion
+
'1
NULL
year'::interval))
STORED NOT NULL,
);
employee integer DEFAULT 1 NOT
ALTER TABLE public.training_log OWN-
NULL,
ER TO postgres;
user_id integer DEFAULT 1 NOT NULL
ALTER TABLE public.training_log ALTER
COLUMN training_number ADD GENERATED
);
ALWAYS AS IDENTITY (
ALTER TABLE public.training_agreement
SEQUENCE
OWNER TO postgres;
NAME
pub-
lic."Training_log_training_number_seq"
ALTER TABLE public.training_agreement
START WITH 1
ALTER COLUMN contract_number ADD GENERATED ALWAYS AS IDENTITY (
SEQUENCE
NAME
INCREMENT BY 1
pub-
NO MINVALUE
lic."Training_agreement_contract_number_seq"
NO MAXVALUE
START WITH 1
CACHE 1
INCREMENT BY 1
);
NO MINVALUE
CREATE TABLE public.users (
NO MAXVALUE
user_id integer NOT NULL,
CACHE 1
surname
);
character
varying(30)
NOT
NULL,
CREATE TABLE public.training_log (
name character varying(30) NOT NULL,
training_number integer NOT NULL,
middle_name character varying(30) DEFAULT '-'::character varying,
training_date date NOT NULL,
sex character varying(10) NOT NULL,
class_start_time time without time zone
NOT NULL,
age integer NOT NULL,
62
simulator_serial_number
integer
DE-
1
Душенко
Григорьевич
FAULT 1 NOT NULL
Александр
65
+7(918)5535555
1
);
3
ALTER TABLE public.users OWNER TO
Гудзовская
Анатольевна
Валерия
43
4
postgres;
ALTER
TABLE
public.users
ALTER
вич
4
Трейлоб
Михаил Романо-
19
8(918)6655444 1
5
Кушнеров
COLUMN user_id ADD GENERATED ALWAYS
AS IDENTITY (
Сергеевич
SEQUENCE
NAME
pub-
Александр
20
8(918)1234567
1
lic."Users_user_id_seq"
6
START WITH 1
мирович
INCREMENT BY 1
Абакумов
33
Андрей Влади-
8(918)9991254 5
8
Иванов Иван
NO MINVALUE
54
+7(918)3234231 4
NO MAXVALUE
9
Петров Петр
33
Иванович
Сергеевич
9
CACHE 1
10
);
36
COPY public.department (department_id,
\.
Салов Андрей Владимирович
2
department_name) FROM stdin;
COPY public.exam_log (exam_number, ex2
Отдел № 2
4
Отдел № 4
5
Отдел № 5
6
am_date, exam_start_time, serial_number, employee)
FROM stdin;
1
2021-10-09
1
1
12:00:00
Отдел № 6
\.
7
Отдел № 7
COPY
1
Отдел № 1
8
Отдел № 8
9
Отдел № 9
(class_number,
public.individual_plan
lesson_topic,
short_description,
date_of_the_lesson, contract_number) FROM stdin;
1
Стыковка
процесс стыковки
\.
\.
COPY public.employees (employee_id, surname, name, middle_name, age, phone_number, department) FROM stdin;
63
Отработать
2022-12-07
1
COPY
public.results_log
(simula-
SELECT
tion_number, estimation, error, time_spent, seri-
pg_catalog.setval('public."Employees_employee_id_
al_number, employee) FROM stdin;
seq"', 10, true);
2
5
1
1
3
минуты
SELECT
pg_catalog.setval('public."Exam_log_exam_number_
seq"', 2, true);
\.
SELECT
COPY
public.simulators
(serial_number,
pg_catalog.setval('public."Individual_plan_class_nu
model, year_of_release, weight, department) FROM
mber_seq"', 2, true);
stdin;
SELECT
1
A-21
2014-02-22
235.4
pg_catalog.setval('public."Results_log_simulation_nu
1
mber_seq"', 2, true);
\.
SELECT
COPY
public.training_agreement
pg_catalog.setval('public."Simulators_serial_number
(con-
_seq"', 2, true);
tract_number, date_of_conclusion, employee, user_id) FROM stdin;
1
SELECT
2017-03-21
1
pg_catalog.setval('public."Training_agreement_contr
1
act_number_seq"', 2, true);
\.
SELECT
COPY public.training_log (training_number,
pg_catalog.setval('public."Training_log_training_nu
training_date, class_start_time, class_name, seri-
mber_seq"', 2, true);
al_number, employee) FROM stdin;
SELECT
1
2022-01-02
Стыковка
1
12:00:00
pg_catalog.setval('public."Users_user_id_seq"',
1
true);
\.
2,
ALTER TABLE ONLY public.department
COPY public.users (user_id, surname, name,
ADD CONSTRAINT "Department_pkey"
middle_name, sex, age, simulator_serial_number)
PRIMARY KEY (department_id);
FROM stdin;
ALTER TABLE ONLY public.employees
1
Хорошко
Сергей
Владимирович Мужской
ADD CONSTRAINT "Employees_pkey"
25
PRIMARY KEY (employee_id);
1
ALTER TABLE ONLY public.exam_log
\.
ADD CONSTRAINT "Exam_log_pkey"
SELECT
PRIMARY KEY (exam_number);
pg_catalog.setval('public."Department_department_i
d_seq"', 9, true);
64
ALTER
TABLE
ONLY
pub-
ADD
lic.individual_plan
CONSTRAINT
fk_exam_log_simulator
al_number)
ADD
CONSTRAINT
"Individu-
FOREIGN
KEY
(seri-
REFERENCES
pub-
lic.simulators(serial_number);
al_plan_pkey" PRIMARY KEY (class_number);
ALTER
ALTER TABLE ONLY public.results_log
TABLE
ONLY
pub-
lic.individual_plan
ADD CONSTRAINT "Results_log_pkey"
ADD
PRIMARY KEY (simulation_number);
CONSTRAINT
fk_individual_plan_training_agreement
KEY
ALTER TABLE ONLY public.simulators
(contract_number)
FOREIGN
REFERENCES
pub-
lic.training_agreement(contract_number);
ADD CONSTRAINT "Simulators_pkey"
ALTER TABLE ONLY public.results_log
PRIMARY KEY (serial_number);
ALTER
TABLE
ONLY
ADD
pub-
CONSTRAINT
fk_result_log_employee FOREIGN KEY (employee)
lic.training_agreement
REFERENCES public.employees(employee_id);
ADD
CONSTRAINT
ing_agreement_pkey"
PRIMARY
"TrainKEY
ALTER TABLE ONLY public.results_log
(con-
tract_number);
ADD
CONSTRAINT
fk_result_log_simulator
ALTER TABLE ONLY public.training_log
al_number)
ADD
CONSTRAINT
"Train-
FOREIGN
KEY
REFERENCES
(seripub-
lic.simulators(serial_number);
ing_log_pkey" PRIMARY KEY (training_number);
ALTER TABLE ONLY public.simulators
ALTER TABLE ONLY public.users
ADD
ADD
CONSTRAINT
"Users_pkey"
fk_simulators_depatment FOREIGN KEY (depart-
PRIMARY KEY (user_id);
ment)
ALTER
CONSTRAINT
REFERENCES
pub-
TABLE
ONLY
pub-
lic.training_agreement
fk_employee_department FOREIGN KEY (department)
REFERENCES
lic.department(department_id);
ALTER TABLE ONLY public.employees
ADD
CONSTRAINT
pub-
ADD
lic.department(department_id);
CONSTRAINT
fk_training_agreement_employee FOREIGN KEY
(employee)
ALTER TABLE ONLY public.exam_log
REFERENCES
pub-
lic.employees(employee_id);
ADD
CONSTRAINT
ALTER
fk_exam_log_employee FOREIGN KEY (employee)
TABLE
ONLY
pub-
lic.training_agreement
REFERENCES public.employees(employee_id);
ADD
ALTER TABLE ONLY public.exam_log
CONSTRAINT
fk_training_agreement_user FOREIGN KEY (user_id) REFERENCES public.users(user_id);
65
ALTER TABLE ONLY public.training_log
ADD CONSTRAINT fk_training_log_employee FOREIGN KEY (employee) REFERENCES public.employees(employee_id);
ALTER TABLE ONLY public.training_log
ADD CONSTRAINT fk_training_log_simulator FOREIGN KEY (serial_number) REFERENCES public.simulators(serial_number);
ALTER TABLE ONLY public.users
ADD CONSTRAINT fk_user_simulator FOREIGN KEY (simulator_serial_number) REFERENCES
public.simulators(serial_number);
66
ЛИСТИНГ ПРОГРАММЫ
import tkinter as tk
# region кнопки и области
from tkinter import ttk
go_to_search_btn = tk.Button(workspace_frame,
import psycopg2
font=('calibri', 20, 'bold'),
from datetime import datetime
text='Найти',
from PIL import Image, ImageTk
width=100,
height=60,
command=lambda:
go_to(search_frame, workspace_frame))
def go_to(new_page, old_page):
new_page.pack()
go_to_add_btn = tk.Button(workspace_frame,
old_page.pack_forget()
font=('calibri', 20, 'bold'),
text='Добавить',
width=100,
def create_place(name_page):
height=60,
table_frame = tk.Frame(name_page,
command=lambda:
width=w,
go_to(add_frame, workspace_frame))
height=320,
bg='black')
go_to_update_btn = tk.Button(workspace_frame,
font=('calibri', 20, 'bold'),
workspace_frame = tk.Frame(name_page,
text='Обновить',
width=w,
width=100,
height=400,
height=60,
bg='black')
command=lambda:
go_to(update_frame, workspace_frame))
return table_frame, workspace_frame
go_to_delete_btn = tk.Button(workspace_frame,
font=('calibri', 20, 'bold'),
def do_workspace(where_page, this_page):
67
text='Удалить',
height=400,
width=100,
width=w)
height=60,
# region размещение
command=lambda:
go_to_search_btn.place(x=100, y=18, width=1080,
go_to(delete_frame, workspace_frame))
height=60)
go_to_add_btn.place(x=100, y=94, width=1080,
height=60)
go_to_back_btn = tk.Button(workspace_frame,
go_to_update_btn.place(x=100,
font=('calibri', 20, 'bold'),
y=170,
width=1080, height=60)
text='Назад',
go_to_delete_btn.place(x=100,
y=246,
width=1080, height=60)
width=100,
go_to_back_btn.place(x=100, y=322, width=1080,
height=60,
height=60)
command=lambda:
# endregion
go_to(where_page, this_page))
# endregion
return search_frame, add_frame, update_frame,
search_frame = tk.Frame(workspace_frame,
delete_frame
height=400,
width=w)
def view_records(table, table_name):
add_frame = tk.Frame(workspace_frame,
cur.execute(f"SELECT * FROM {table_name}")
height=400,
# запрос данных из базы
width=w)
[table.delete(i) for i in table.get_children()]
#
очистка таблицы формы
[table.insert('', 'end', values=row) for row in
update_frame = tk.Frame(workspace_frame,
cur.fetchall()] # запись данных в таблицу формы
height=400,
width=w)
def view_search_records(table):
delete_frame = tk.Frame(workspace_frame,
68
[table.delete(i) for i in table.get_children()]
#
f"SELECT * FROM department WHERE
очистка таблицы формы
{choice}
{department_operation_combobox.get()}
'{department_entry.get()}'")
[table.insert('', 'end', values=row) for row in
cur.fetchall()] # запись данных в таблицу формы
con.commit()
view_search_records(department_table)
def back_and_save(new_page, old_page, table, table_name):
def department_add():
new_page.pack()
cur.execute(
old_page.pack_forget()
f"INSERT
view_records(table, table_name)
ment_name)
INTO
department
VALUES
(depart('{depart-
ment_add_entry.get()}')")
con.commit()
name_table = 'department'
# region department functions
view_records(department_table, name_table)
def department_search():
department_add_entry.delete(0, tk.END)
choice = department_combobox.get()
if choice == 'Номер отдела':
choice = 'department_id'
def department_update():
else:
choice_old = department_choice_old_entry.get()
choice = 'department_name'
if choice_old == 'Название отдела':
if department_entry.get().isdigit():
choice_old = 'department_name'
cur.execute(
f"SELECT * FROM department WHERE
{choice}
{department_operation_combobox.get()}
condition_choice
{department_entry.get()}")
=
ment_choice_condition_combobox.get()
if condition_choice == 'Номер отдела':
else:
cur.execute(
condition_choice = 'department_id'
if condition_choice == 'Название отдела':
69
depart-
condition_choice = 'department_name'
tion_choice}
=
'{depart-
ment_condition_value_entry.get()}'")
con.commit()
if department_new_value_entry.get().isdigit() and
department_condition_value_entry.get().isdigit():
cur.execute(
name_table = 'department'
f"UPDATE department set {choice_old} =
view_records(department_table, name_table)
{department_new_value_entry.get()} where {condition_choice}
=
{depart-
ment_condition_value_entry.get()}")
department_choice_old_entry.delete(0, tk.END)
con.commit()
elif
department_choice_condition_combobox.delete(0,
tk.END)
department_new_value_entry.get().isdigit()
and
not
depart-
department_new_value_entry.delete(0, tk.END)
ment_condition_value_entry.get().isdigit():
department_condition_value_entry.delete(0,
cur.execute(
tk.END)
f"UPDATE department set {choice_old} =
{department_new_value_entry.get()} where {condition_choice}
=
'{depart-
ment_condition_value_entry.get()}'")
def department_delete():
con.commit()
condition_choice
=
depart-
ment_delete_combobox.get()
elif not department_new_value_entry.get().isdigit()
and department_condition_value_entry.get().isdigit():
if condition_choice == 'Номер отдела':
cur.execute(
condition_choice = 'department_id'
f"UPDATE department set {choice_old} =
if condition_choice == 'Название отдела':
'{department_new_value_entry.get()}' where {condition_choice}
=
condition_choice = 'department_name'
{depart-
ment_condition_value_entry.get()}")
con.commit()
if department_delete_entry.get().isdigit():
else:
cur.execute(f"DELETE from department where
{condi-
cur.execute(
tion_choice}={department_delete_entry.get()};")
f"UPDATE department set {choice_old} =
con.commit()
'{department_new_value_entry.get()}' where {condi-
else:
70
cur.execute(f"DELETE from department where
width=w,
{condiheight=h,
tion_choice}='{department_delete_entry.get()}';")
bg='black')
con.commit()
main_page.pack()
name_table = 'department'
department_page = tk.Frame(main_window,
view_records(department_table, name_table)
width=w,
height=h,
department_delete_combobox.delete(0, tk.END)
bg='black')
department_delete_entry.delete(0, tk.END)
employee_page = tk.Frame(main_window,
width=w,
# endregion
height=h,
bg='black')
def close():
main_window.destroy()
simulator_page = tk.Frame(main_window,
width=w,
height=h,
w = 1280
bg='black')
h = 720
user_page = tk.Frame(main_window,
main_window = tk.Tk()
width=w,
main_window.title('Databases')
height=h,
main_window.geometry(f'{w}x{h}+150+50')
bg='black')
# region create pages
agreement_page = tk.Frame(main_window,
main_page = tk.Frame(main_window,
width=w,
71
height=h,
# region main_page widgets
bg='black')
# region picture
picture_frame = tk.Frame(main_page,
plan_page = tk.Frame(main_window,
width=840,
width=w,
height=h,
height=h,
bg='black')
bg='black')
picture_frame.place(x=0, y=0, width=840, height=h)
journal_page = tk.Frame(main_window,
width=w,
image1
=
Im-
age.open(r"C:\Users\ysenk\PycharmProjects\Kurs_D
height=h,
B\kurs1.jpg")
bg='black')
image1 = image1.resize((840, h))
test = ImageTk.PhotoImage(image1)
training_page = tk.Frame(main_window,
width=w,
label1 = tk.Label(picture_frame, image=test)
height=h)
label1.image = test
result_page = tk.Frame(main_window,
label1.place(x=0, y=0)
width=w,
height=h)
# endregion
exam_page = tk.Frame(main_window,
menu_frame = tk.Frame(main_page,
width=w,
width=440,
height=h)
height=h,
bg='black')
# endregion
72
menu_frame.place(x=840, y=0, width=440, height=h)
font=('calibri', 20, 'bold'),
height=60,
# region main menu button
width=220,
department_btn = tk.Button(menu_frame,
text='Пользователи',
font=('calibri', 20, 'bold'),
command=lambda:
go_to(user_page,
main_page))
height=60,
width=220,
agreement_btn = tk.Button(menu_frame,
text='Отделы',
font=('calibri', 20, 'bold'),
command=lambda:
go_to(department_page, main_page))
height=60,
width=220,
text='Договоры',
employee_btn = tk.Button(menu_frame,
font=('calibri', 20, 'bold'),
command=lambda:
go_to(agreement_page, main_page))
height=60,
width=220,
plan_btn = tk.Button(menu_frame,
text='Сотрудники',
font=('calibri', 20, 'bold'),
command=lambda:
go_to(employee_page, main_page))
height=60,
width=220,
text='Индивидуальные планы',
simulator_btn = tk.Button(menu_frame,
font=('calibri', 20, 'bold'),
command=lambda:
go_to(plan_page,
main_page))
height=60,
width=220,
journal_btn = tk.Button(menu_frame,
text='Тренажеры',
font=('calibri', 20, 'bold'),
command=lambda:
go_to(simulator_page, main_page))
height=60,
width=220,
text='Журналы',
user_btn = tk.Button(menu_frame,
73
command=lambda:
table_frame,
go_to(journal_page, main_page))
workspace_frame
=
cre-
ate_place(department_page)
table_frame.place(x=0, y=0, height=320, width=w)
exit_btn = tk.Button(menu_frame,
workspace_frame.place(x=0,
y=320,
height=400,
width=w)
font=('calibri', 20, 'bold'),
# endregion
height=60,
width=220,
# region department_table
text='Выход',
con = psycopg2.connect(
command=close)
database="Kurs_DB",
# region размещение кнопок меню
user="postgres",
department_btn.place(x=20,
y=29,
height=60,
width=400)
employee_btn.place(x=20,
password="qwerty",
y=115,
height=60,
host="127.0.0.1",
width=400)
port="5432"
simulator_btn.place(x=20,
y=201,
height=60,
)
width=400)
cur = con.cursor()
user_btn.place(x=20, y=287, height=60, width=400)
agreement_btn.place(x=20,
y=373,
cur.execute("SELECT
height=60,
depart-
ment_name FROM department")
width=400)
rows = cur.fetchall()
plan_btn.place(x=20, y=459, height=60, width=400)
journal_btn.place(x=20,
department_id,
y=545,
elements = []
height=60,
width=400)
for row in rows:
exit_btn.place(x=20, y=631, height=60, width=400)
elements.append((row[0], row[1]))
# endregion
# endregion
columns = ('department_id', 'department_name')
# endregion
department_table = ttk.Treeview(table_frame, columns=columns, show="headings")
# region department
department_table.pack(fill=tk.BOTH, expand=1)
# region пространство размещения department
74
font=('calibri', 20, 'bold'),
department_table.heading("department_id",
justify='center',
text="Номер отдела")
values=['Номер
отдела',
'Название отдела'])
department_table.heading("department_name",
text="Название отдела")
department_operation_combobox
for person in elements:
department_table.insert("",
=
ttk.Combobox(department_search_frame,
tk.END,
val-
font=('calibri', 20, 'bold'),
ues=person)
justify='center',
# endregion
values=['=', '>', '<', '<=',
'>=', '<>'])
# region кнопки и области department
department_search_frame,
department_add_frame,
department_entry
department_update_frame, department_delete_frame
=
tk.Entry(department_search_frame,
= do_workspace(
font=('calibri', 20, 'bold'))
main_page,
department_page)
search_btn = tk.Button(department_search_frame,
# endregion
font=('calibri', 20, 'bold'),
width=120,
# region department_search
height=60,
text='Найти',
text_label = tk.Label(department_search_frame,
command=department_search)
font=('calibri', 28, 'bold'),
text="Найти запись, где:",
back_to_workspace_btn
width=120,
tk.Button(department_search_frame,
height=60)
font=('calibri', 20, 'bold'),
width=440,
department_combobox
=
height=60,
ttk.Combobox(department_search_frame,
75
=
text='Назад',
font=('calibri', 20, 'bold'))
command=lambda:
back_and_save(department_page,
departdepartment_add_btn
ment_search_frame,
=
tk.Button(department_add_frame,
departfont=('calibri', 20, 'bold'),
ment_table,
text='Добавить',
'department'))
command=department_add)
text_label.place(x=30, y=30, width=300, height=60)
department_combobox.place(x=330,
back_to_workspace_btn
y=30,
=
tk.Button(department_add_frame,
width=240, height=60)
font=('calibri', 20, 'bold'),
department_operation_combobox.place(x=570, y=30,
width=80, height=60)
width=120,
department_entry.place(x=650,
y=30,
width=200,
height=60,
height=60)
text='Назад',
search_btn.place(x=740,
y=290,
width=440,
command=lambda:
height=60)
back_and_save(department_page,
back_to_workspace_btn.place(x=100,
y=290,
depart-
ment_add_frame, department_table,
width=440, height=60)
'department'))
# endregion
# region размещение
department_add_label.place(x=240,
# region department_add
department_add_label
width=400, height=60)
=
department_add_entry.place(x=640,
tk.Label(department_add_frame,
y=30,
width=400, height=60)
font=('calibri', 20, 'bold'),
back_to_workspace_btn.place(x=100,
y=290,
width=440, height=60)
text='Введите название нового
отдела:')
department_add_btn.place(x=740,
width=440, height=60)
department_add_entry
y=30,
# endregion
=
tk.Entry(department_add_frame,
# endregion
76
y=290,
values=['Название
отдела'])
# region department_update
department_new_value_entry
department_choice_old_label
=
=
tk.Entry(department_update_frame,
tk.Label(department_update_frame,
font=('calibri', 15, 'bold'))
font=('calibri', 15, 'bold'),
text='Выберите
колон-
ку,\nкоторую хотите изменить')
department_choice_condition_combobox
=
ttk.Combobox(department_update_frame,
department_new_value_label
=
tk.Label(department_update_frame,
font=('calibri',
15,
'bold'),
font=('calibri', 15, 'bold'),
justify='center',
text='Введите новое значение\nв этой колонке')
values=['Номер отдела', 'Название отдела'])
department_choice_condition_label
=
tk.Label(department_update_frame,
department_condition_value_entry
=
tk.Entry(department_update_frame,
font=('calibri', 15, 'bold'),
font=('calibri', 15, 'bold'),
text='Выберите колонку
)
для условия')
department_update_btn
department_condition_value_label
=
=
tk.Button(department_update_frame,
tk.Label(department_update_frame,
font=('calibri', 20, 'bold'),
font=('calibri', 15, 'bold'),
text='Обновить',
text='В которой значение')
command=department_update)
department_choice_old_entry
=
back_to_workspace_btn
ttk.Combobox(department_update_frame,
tk.Button(department_update_frame,
font=('calibri', 15, 'bold'),
font=('calibri', 20, 'bold'),
justify='center',
text='Назад',
77
=
command=lambda:
back_and_save(department_page,
# endregion
depart# endregion
ment_update_frame,
department_table,
# region department_delete
'department'))
department_text_label
=
tk.Label(department_delete_frame,
font=('calibri', 15, 'bold'),
# region размещение виджетов обновления в department
text='Удалить элемент, в кото-
department_choice_old_label.place(x=5,
ром: ',
y=0,
width=315, height=60)
justify='center')
department_new_value_label.place(x=325,
y=0,
width=315, height=60)
department_delete_combobox_label
department_choice_condition_label.place(x=645,
=
tk.Label(department_delete_frame,
y=0, width=315, height=60)
font=('calibri', 15, 'bold'),
department_condition_value_label.place(x=965, y=0,
text='Колонка')
width=315, height=60)
department_choice_old_entry.place(x=5,
department_delete_entry_label
y=60,
tk.Label(department_delete_frame,
width=315, height=60)
department_new_value_entry.place(x=325,
=
font=('calibri', 15, 'bold'),
y=60,
width=315, height=60)
text='Имеет значение')
department_choice_condition_combobox.place(x=645,
department_delete_combobox
y=60, width=315, height=60)
=
ttk.Combobox(department_delete_frame,
department_condition_value_entry.place(x=965,
font=('calibri', 15, 'bold'),
y=60, width=315, height=60)
justify='center',
department_update_btn.place(x=740,
values=['Номер
y=290,
'Название отдела'])
width=440, height=60)
back_to_workspace_btn.place(x=100,
y=290,
width=400, height=60)
78
отдела',
department_delete_entry
=
tk.Entry(department_delete_frame,
# region размещение виджетов удаления
font=('calibri', 15, 'bold'))
department_text_label.place(x=0,
y=0,
width=w,
height=60)
department_delete_btn
=
department_delete_combobox_label.place(x=330,
tk.Button(department_delete_frame,
y=60, width=300, height=60)
font=('calibri', 20, 'bold'),
department_delete_entry_label.place(x=650,
width=300, height=60)
text='Удалить элемент',
department_delete_combobox.place(x=330,
command=department_delete)
back_to_workspace_btn
y=120,
width=300, height=60)
department_delete_entry.place(x=650,
y=120,
width=300, height=60)
=
tk.Button(department_delete_frame,
department_delete_btn.place(x=740,
font=('calibri', 20, 'bold'),
width=440, height=60)
text='Назад',
back_to_workspace_btn.place(x=100,
width=440, height=60)
command=lambda:
back_and_save(department_page,
y=60,
# endregion
depart-
ment_delete_frame,
# endregion
depart-
# endregion
ment_table,
'department'))
main_window.mainloop()
79
y=290,
y=290,
Download