МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «ЮЖНО-РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ (НПИ) имени М.И. ПЛАТОВА» ФАКУЛЬТЕТ КАФЕДРА НАПРАВЛЕНИЕ КУРСОВАЯ РАБОТА На тему:___________________________________________ ___________________________________________________ По дисциплине:__________________________________________ __________________________________________________________ Выполнил студент _____ курса, группы___ _____________________ Фамилия, имя, отчество Принял____________________________________________________ Должность, звание Фамилия, имя, отчество «___» __________ _____ г.________________ Подпись Новочеркасск 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,