1 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ ДНР ГОУ ВПО «ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Факультет КНТ Кафедра ПИ ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту по дисциплине «Программирование систем с Базами Данных» на тему: «Создание клиент-серверной информационной системы средствами СУБД» Руководители: Выполнил: асс. каф. ПИ ст. гр. ПИ-18а Щедрин С.В. Песков В. А. асс. каф. ПИ Ногтев Е.А. Донецк – 2021 2 РЕФЕРАТ Тема курсового проекта: Создание клиент-серверной информационной системы «Банки Украины» средствами СУБД. В состав проекта входят: пояснительная записка к курсовому проекту содержит: 76 страниц, 53 рисунка, 12 таблиц, 4 источника, 6 приложений. В курсовом проекте рассмотрен процесс проектирования базы данных, таблиц и их структуры, разработки запросов и многопользовательской защиты данных. Проведён анализ предметной области и сформированы требования к разрабатываемой программной системе. Исходя из требований к многопользовательской защите, выбрана архитектура системы с разделением пользователей на роли. Сделан обзор методологий разработки программного обеспечения, языков описания архитектур программных систем и применяемых видов. Объект исследования – информационная система для автоматизации учёта банков Украины. Результат работы – разработанная СУБД обеспечения и учета ломбардов на языке С#, с использованием синтаксиса PostgreSQL. БАЗА ДАННЫХ, СУБД, РЕЛЯЦИОННАЯ БАЗА ДАННЫХ POSTGRESQL, СВЯЗИ, ЗАПРОС, 3 СОДЕРЖАНИЕ Введение…………………………………………………………………………...4 1 Описание предметной области, постановка задачи….……………………....5 2 Обоснование выбора СУБД, описание возможностей СУБД……………….6 3 Обоснование выбора инструментальных средств для написания клиентской части, проектирование структуры ПО……………………………8 3.1 Невизуальные компоненты для работы с данным ......................................... 8 3.2 Визуальные компоненты для работы с данными .......................................... 8 3.3 Разработка шаблонов приложений для работы с шаблонами базы данных ................................................................................................................................. 10 4 Проектирование базы данных в выбранной СУБД…………………………14 4.1 Проектирование концептуальной модели БД .............................................. 14 4.2 Создание таблиц, доменов, индексов ........................................................... 15 4.3 Разработка триггеров ...................................................................................... 17 4.4 Проектирование запросов к базе данных ..................................................... 17 4.5 Создание представлений и хранимых процедур, функций ........................ 20 5 Разработка клиентского приложения………………………………………..35 5.1 Формы и компоненты для работы с основными таблицами ...................... 35 5.2 Формы и компоненты для работы со справочниками ................................. 36 5.3 Формы и компоненты для отображения результатов запросов ................. 37 6 Тестирование разработанной информационной системы………………….39 ЗАКЛЮЧЕНИЕ………………………………………………………………….47 Перечень ссылок………………………………………………………………...48 Приложение А Техническое задание…………………………………………..49 Приложение Б Листниг шаблонов………………………………………….….54 Приложение В Листинг серверного приложения…………..…………………55 Приложение Г Листинг клиентского приложения……………………………65 Приложение Д Руководство пользователя…………………………………….76 Приложение Ж Руководство администратора………………………………...77 4 ВВЕДЕНИЕ Применение баз данных все больше наблюдается при разработке приложений любого уровня сложности. Не взирая на особенности использования приложения или предметной области, базы данных являются мощным инструментом для хранения внушительного количества информации, манипулирования хранящимися данными, быстрого доступа к ним. В определенных случаях, базы данных могут обеспечить перечень возможностей многопользовательской защиты, ограничивая возможности и предоставляемые данные в зависимости от пользователя, который использует базу данных. Для разработки системы управления с использованием базы данных, в первую очередь необходимо определить структуру хранения данных и доступа к ним. Необходимо определить создаваемые таблицы, их структуру, типы данных полей, домены, связь по внешним ключам с другими таблицами. После определения структуры хранения данных, необходимо разработать запросы к данным, которые будут предоставлять необходимые пользователям данные. При необходимости, представления и функции c учетом особенностей СУБД. могут создаваться 5 1 ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ, ПОСТАНОВКА ЗАДАЧИ Реляционная база данных — это совокупность взаимосвязанных таблиц, каждая из которых содержит информацию об объектах определенного типа. В реляционной базе данных каждая таблица должна иметь первичный ключ — поле или комбинацию полей, которые единственным образом идентифицируют каждую строку таблицы. Если ключ состоит из нескольких полей, он называется составным. Ключ должен быть уникальным и однозначно определять запись. По значению ключа можно отыскать единственную запись. Ключи служат также для упорядочивания информации в БД. В задании курсовой работы требуется разработать базу данных учёта банков. Рассмотрим особенности данной системы, указанные в условии. Система учета кредитной деятельности банков Украины должна содержать такие данные: название банка, тип (государственный, коммерческий, акционерный, …), год создания, уставной фонд, телефон, сведения о выданных кредитах (клиент (ФИО, город, телефон, номер счета), вид кредита (потребительский, под векселя, под ценные бумаги, краткосрочный, долгосрочный, …), сумма, годовой процент, дата выдачи), возврат кредитов (сумма, дата возврата). Примечание: клиент может брать кредиты в нескольких банках; кредит может возвращаться по частям. Пользователи системы могут выступать в двух ролях: администратор и работник. 6 2 ОБОСНОВАНИЕ ВЫБОРА СУБД, ОПИСАНИЕ ВОЗМОЖНОСТЕЙ СУБД Для реализации серверной части курсового проекта была выбрана СУБД PostgreSQL. Для администрирования всех элементов базы данных изпользовался инструмент pgAdmin. Для облегченного использования PostgreSQL используется система управления базами данных Navicat. PostgreSQL предоставляет пользователям следующие возможности: 1) Механизм транзакций. Это логические единицы работы с базой данных. Они позволяют объединять выполняемые изменения в одно действие, которое либо будет выполнено полностью, либо не выполнится полностью и отменит внесенные изменения. 2) Функции. Это блоки кода, которые выполняются непосредственно на сервере, могут быть написаны на встроенном языке PL/pgSQL. Позволяют выполнять различные запросы исходя их полученных параметров с данными. Функции в PostgeSQL являются своего рода транзакциями, поэтому функции можно использовать для обработки данных, которые не будут иметь смысла, будучи обработанными не в полном объеме. 3) Представления. Это именованные запросы, которые, в отличие от таблиц, не хранят данные постоянно, а заполняются информацией только в момент обращения к себе. Позволяют ограничить доступ к таблицам, реализуя защиту на уровне строк. 4) Индексы. Это объекты баз данных, которые позволяют ускорять поиск необходимых данных. 5) Роли. Эти объекты базы данных используются для управления разрешениями на доступ к другим объектам. Эти объекты могут 7 рассматриваться как пользователи, так и зависимости от настроек роли. группы пользователей, в 8 3 ОБОСНОВАНИЕ ВЫБОРА ИНСТРУМЕНТАЛЬНЫХ СРЕДСТВ ДЛЯ НАПИСАНИЯ КЛИЕНТСКОЙ ЧАСТИ, ПРОЕКТИРОВАНИЕ СТРУКТУРЫ ПО 3.1 Не визуальные компоненты для работы с данными Для разработки клиентской части курсового проекта был выбран язык программирования C#, визуальная среда разработки Microsoft Visual Studio, подключаемая библиотека Npgsql пакета NuGet для взаимодействия с сервером базы данных. Разработка на языке C# в среде Visual Studio позволяет легко создавать элементы интерфейса, работать с результатами запросов к БД как с объектами. Библиотека Npgsql содержит все необходимые механизмы для подключения к базе данных, выполнения запросов и обработки полученных данных. Для подключения к базе данных существует класс NpgsqlConnection, конструктор которого вызывается с одним параметром - строкой подключения. Эта строка формируется из нескольких параметров: адреса и порта сервера, логина и пароля пользователя, названия базы данных. Для выполнения запросов на сервере базы данных используется класс NpgsqlCommand. Для выполнения запроса необходимо вызвать конструктор с двумя параметрами - строкой с запросом и объектом подключения. 3.2 Визуальные компоненты для работы с данными Для отображения данных из таблиц был выбран элемент управления DataGridView из WindowsForms, который является достаточно гибким и позволяет автоматизировать вывод информации пользователю. Пример использования данного элемента управления для отображения таблицы из базы данных представлен на рисунках 3.2 и 3.3. 9 Рисунок 3.2 – Пример использования DataGridView для отображения данных таблицы Рисунок 3.3 – Пример использования DataGridView для отображения данных таблицы (код программы) Для отображения справочников при добавлении/редактировании записей в базе данных был использован элемент управления ComboBox, 10 который обеспечивает удобное отображение и выбор данных из справочника. Примеры использования данного элемента управления приведен на рисунках 3.4 и 3.5. Рисунок 3.4 – Пример использования ComboBox для отображения справочников Рисунок 3.5 – Пример использования ComboBox для отображения справочников (код программы) 3.3 Разработка шаблонов приложений для работы с шаблонами базы данных Данный программный продукт оснащён простым, интуитивно понятным пользовательским интерфейсом. В программе были созданы окна авторизации пользователя, работы с таблицами, работы с запросами и графиками. 11 Начало работы происходит в окне авторизации. Если авторизация происходит успешно, появляется окно для работы (добавление, удаление, изменение записей) с таблицами. Работа с таблицами происходит на основе разрешений конкретного пользователя. Из окна для работы с таблицами пользователь может перейти на окно с перечнем запросов. В нём пользователь может выполнить запрос, получить результат, экспортировать результаты в excel, просмотреть некоторые итоговые запросы в виде графиков. Рассмотрим особенности каждой формы на рисунках 3.6 - 3.10. Рисунок 3.6 – Форма авторизации Рисунок 3.7 – Форма работы с таблицами 12 Рисунок 3.8 – Форма запросов Рисунок 3.9 – Форма с графиками 13 Рисунок 3.10 – Окно ввода параметров 14 4 ПРОЕКТИРОВАНИЕ БАЗЫ ДАННЫХ В ВЫБРАННОЙ СУБД 4.1 Проектирование концептуальной модели БД Процесс проектирования БД с использованием метода нормальных форм (НФ) является итерационным и заключается в последовательном переводе отношения из 1НФ в НФ более высокого порядка по определенным правилам. Каждая следующая НФ ограничивается определенным типом функциональных зависимостей и устранением соответствующих аномалий при выполнении операций над отношениями БД, а также сохранении свойств, предшествующих НФ. Нормализация базы данных сводит к минимуму количество избыточной информации. Ее целью является сохранять данные только один раз, но в нужном месте. Нормализованная база данных исключает дублирование и многократное обслуживание данных, а также появление проблем с целостностью данных, возникающих при повторном вводе одинаковых данных. Первоначально доктором Эдгаром Коддом были определены только 3 нормальные формы. Дальнейшая разработка реляционной теории привела к появлению еще нескольких форм и на данный момент их насчитывается 6. На практике соответствие базы данных правилам 3-ей нормальной формы вполне достаточно. В результате выполнения нормализации базы данных (приведение в 3НФ) были выделены следующие таблицы: База данных состоит из 8 таблиц, из них 3 таблицы-справочника. В таблице «Банк» содержится вся информация о всех банках в базе данных. В таблице «Кредиты» содержится вся информация о всех кредитах в базе данных. В таблице «Клиенты» содержится вся информация о всех клиентах в базе данных. 15 В таблице «Возврат кредита» содержится информация о всех возвратах кредитов. В таблице-справочнике «Тип банка» содержится информация о всех доступных типах банка. В таблице-справочнике «Вид кредита» содержится информация о всех доступных видах кредита. В таблице-справочнике «Город» содержится информация о всех доступных городах. В таблице «Сотрудник» содержится вся информация о всех сотрудниках в базе данных. 4.2 Создание таблиц, доменов, индексов Таблица 4.1 – Клиент № 1 2 3 4 5 6 7 Поле id_klient surname name patronymic id_city phone account_number Тип serial4 varchar varchar varchar int4 varchar varchar Размер 4 20 20 20 4 13 20 Описание Уникальный идентификатор Фамилия Имя Отчество Уникальный идентификатор Телефон Номер счёта Таблица 4.2 – Кредиты № 1 2 3 4 5 6 7 Поле Тип id_ credit serial4 id_ bank int4 id_ klient int4 id_type int4 credit_amount int4 annual_percentage int4 issue_date date Размер Описание 4 Уникальный идентификатор 4 Уникальный идентификатор 4 Уникальный идентификатор 4 Уникальный идентификатор 4 Сумма 4 Годовой процент Авто Дата выдачи 16 Таблица 4.3 – Банк № 1 2 3 4 5 6 Поле id_ bank name id_type year_open charter_capital phone Тип serial4 varchar int4 int4 int4 varchar Размер 4 20 4 4 4 13 Описание Уникальный идентификатор Название Уникальный идентификатор Год открытия Уставной фонд Телефон Таблица 4.4 – Возврат кредита № 1 2 3 4 5 Поле id_ repayment sum date id_credit id_bank Тип serial4 int4 date int4 int4 Размер Описание 4 Уникальный идентификатор 4 Сумма Авто Дата возврата 4 Уникальный идентификатор 4 Уникальный идентификатор Таблица 4.5 – Тип банка № Поле 1 id_ type 2 type Тип serial4 varchar Размер 4 15 Описание Уникальный идентификатор Тип банка Таблица 4.6 – Вид кредита № Поле 1 id_ type 2 type Тип serial4 varchar Размер 4 15 Описание Уникальный идентификатор Вид кредита Таблица 4.7 – Город № Поле 1 id_ city 2 city Тип serial4 varchar Размер 4 15 Описание Уникальный идентификатор Город 17 Таблица 4.8 – Сотрудник № Поле 1 login 2 id_bank Тип varchar int4 Размер 15 4 Описание Логин Уникальный идентификатор Рисунок 4.1 - Создание домена для телефона Рисунок 4.2 – Схема базы данных 4.3 Разработка триггеров Для сохранения целостности данных и проверки внесенных пользователем изменений использовались триггеры – хранимые процедуры особого типа, исполнение которых обусловлено действием по модификации данных: добавлением, удалением или изменением строки в заданной таблице реляционной базы данных. Триггеры запускаются сервером автоматически при попытке изменения данных в таблице, с которой они связаны. Все производимые им модификации данных рассматриваются как выполняемые в 18 транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции. Момент запуска триггера определяется с помощью ключевых слов BEFORE (триггер запускается до выполнения, связанного с ним события, например, до добавления записи), AFTER (после события) или INSTEAD OF (вместо события) [5]. При создании таблиц в базе данных для обработки информации о ломбардах использовались триггеры, ориентированные на следующие события: BEFORE DELETE (для удаления связанных записей из других таблиц); BEFORE INSERT (для проверки данных, которые пользователь хочет внести в таблицу, и выдачи осмысленного сообщения об ошибке); BEFORE UPDATE (для проверки информации в изменяемых пользователем строках таблицы). Примеры вышеуказанных триггеров приведены на рисунках 4.3 – 4.4. 19 Рисунок 4.3 – Триггер на каскадное изменение из таблицы "Тип банка" Рисунок 4.4 – Остальные триггера и триггерные функции 20 4.4 Проектирование запросов к базе данных Во время обучения синтаксису SQL необходимо было разработать запросы следующих типов: симметричное внутреннее соединение с условием (два запроса с условием отбора по внешнему ключу, два – по датам); симметричное внутреннее соединение без условия (три запроса); левое внешнее соединение; правое внешнее соединение; запрос на запросе по принципу левого соединения; итоговый запрос без условия; итоговый запрос без условия c итоговыми данными вида: «всего», «в том числе»; итоговые запросы с условием на данные (по значению, по маске, с использованием индекса, без использования индекса); итоговый запрос с условием на группы; итоговый запрос с условием на данные и на группы; запрос на запросе по принципу итогового запроса; запрос с использованием объединения запросы с подзапросами (с использованием in, not in, case). Запросы — это объект базы данных, который служит для извлечения данных из таблиц и предоставления их пользователю в удобном виде. Особенность запросов состоит в том, что они черпают данные из базовых таблиц и создают на их основе временную таблицу. Применение запросов позволяет избежать дублирования данных в таблицах и обеспечивает максимальную гибкость при поиске и отображении данных в базе данных. 4.5 Создание представлений и хранимых процедур, функций На базе ранее представленных запросов разработаны отчёты Excel и представлены на рисунке 4.5. 21 Рисунок 4.5 – Отчет Excel CREATE OR REPLACE FUNCTION "1" (_type VARCHAR) RETURNS TABLE ( "ID" INTEGER, "Название" VARCHAR, "Тип банка" VARCHAR, "Год создания" VARCHAR, "Уставной фонд" VARCHAR, "Телефон" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Bank".id_bank, "public"."Bank"."name", "public"."Type of bank"."type", "public"."Bank".year_open, "public"."Bank".charter_capital, "public"."Bank".phone FROM "public"."Bank" INNER JOIN "public"."Type of bank" ON "public"."Bank".id_type = "public"."Type of bank".id_type WHERE "Type of bank".type = _type ; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.14 – Текст запроса (Симметричное внутреннее соединение с условием отбора по внешнему ключу) Рисунок 4.15 – Симметричное внутреннее соединение с условием отбора по внешнему ключу (вывести банки с указанным "типом банка") 22 CREATE OR REPLACE FUNCTION "2" (_city VARCHAR) RETURNS TABLE ( "ID" INTEGER, "Фамилия" VARCHAR, "Имя" VARCHAR, "Отчество" VARCHAR, "Город" VARCHAR, "Телефон" VARCHAR, "Номер счёта" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Klient".id_klient, "public"."Klient".surname, "public"."Klient"."name", "public"."Klient".patronymic, "public"."City".city, "public"."Klient".phone, "public"."Klient".account_number FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "City".city = _city ; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.16 – Текст запроса (Симметричное внутреннее соединение с условием отбора по внешнему ключу) Рисунок 4.17 – Симметричное внутреннее соединение с условием отбора по внешнему ключу (вывести клиентов, в указанном городе) 23 CREATE OR REPLACE FUNCTION "3" (_date INT) RETURNS TABLE ( "ID" INTEGER, "Название" VARCHAR, "Тип банка" VARCHAR, "Год создания" VARCHAR, "Уставной фонд" VARCHAR, "Телефон" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Bank".id_bank, "public"."Bank"."name", "public"."Type of bank"."type", "public"."Bank".year_open, "public"."Bank".charter_capital, "public"."Bank".phone FROM "public"."Bank" INNER JOIN "public"."Type of bank" ON "public"."Bank".id_type = "public"."Type of bank".id_type WHERE "Bank".year_open = _date; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.18 – Текст запроса (Симметричное внутреннее соединение с условием отбора по дате) Рисунок 4.19 – Симметричное внутреннее соединение с условием отбора по дате (вывести банки, открытые в указанном году) CREATE VIEW "4" AS SELECT "public"."Credit".id_credit AS "ID", "public"."Bank"."name" AS "Банк", concat_ws (' ', "Klient".surname, "Klient"."name", "Klient".patronymic) AS "Клиент", "public"."Type of credit"."type" AS "Вид кредита", "public"."Credit".credit_amount AS "Сумма", "public"."Credit".annual_percentage AS "Годовой процент", "public"."Credit".issue_date AS "Дата выдачи" FROM "public"."Credit" INNER JOIN "public"."Bank" ON "public"."Bank".id_bank = "public"."Credit".id_bank INNER JOIN "public"."Klient" ON "public"."Credit".id_klient = "public"."Klient".id_klient INNER JOIN "public"."Type of credit" ON "public"."Credit".id_type = "public"."Type of credit".id_type WHERE issue_date > NOW() - INTERVAL '730 days'; Рисунок 4.20 – Текст запроса (Симметричное внутреннее соединение с условием отбора по дате) 24 Рисунок 4.21 – Симметричное внутреннее соединение с условием отбора по дате (вывести кредиты, выданные за последние 2 года) CREATE VIEW "5" AS SELECT "public"."Credit".id_credit AS "ID", "public"."Bank"."name" AS "Банк", concat_ws ( ' ', "Klient".surname, "Klient"."name", "Klient".patronymic ) AS "Клиент", "public"."Type of credit"."type" AS "Вид кредита", "public"."Credit".credit_amount AS "Сумма", "public"."Credit".annual_percentage AS "Годовой процент", "public"."Credit".issue_date AS "Дата выдачи" FROM "public"."Credit" INNER JOIN "public"."Bank" ON "public"."Bank".id_bank = "public"."Credit".id_bank INNER JOIN "public"."Klient" ON "public"."Credit".id_klient = "public"."Klient".id_klient INNER JOIN "public"."Type of credit" ON "public"."Credit".id_type = "public"."Type of credit".id_type ORDER BY "public"."Credit"."credit_amount" DESC LIMIT 100; Рисунок 4.22 – Текст запроса (Симметричное внутреннее соединение без условия) Рисунок 4.23 – Симметричное внутреннее соединение без условия (вывести всю информацию о 100 кредитах, с наибольшей суммой) 25 CREATE VIEW "6" AS SELECT "public"."Klient".id_klient AS "ID", "public"."Klient".surname AS "Фамилия", "public"."Klient"."name" AS "Имя", "public"."Klient".patronymic AS "Отчество", "public"."City".city AS "Город", "public"."Klient".phone AS "Телефон", "public"."Klient".account_number AS "Номер счёта" FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city ORDER BY "public"."City".city ASC; Рисунок 4.24 – Текст запроса (Симметричное внутреннее соединение без условия) Рисунок 4.25 – Симметричное внутреннее соединение без условия (вывести клиентов с сортировкой по городу) CREATE VIEW "7" AS SELECT "public"."Bank"."name" AS "Банк", "public"."Type of bank"."type" AS "Тип банка" FROM "public"."Bank" INNER JOIN "public"."Type of bank" ON "public"."Bank".id_type = "public"."Type of bank".id_type; Рисунок 4.26 – Текст запроса (Симметричное внутреннее соединение без условия) Рисунок 4.27 – Симметричное внутреннее соединение без условия (вывести банк и его тип банка) 26 CREATE VIEW "8" AS SELECT "public"."Type of bank"."type" AS "Тип банка" FROM "public"."Type of bank" LEFT JOIN "public"."Bank" ON "public"."Type of bank".id_type = "public"."Bank".id_type WHERE "Bank".id_type IS NULL; Рисунок 4.28 – Текст запроса (Левое внешнее соединение) Рисунок 4.29 – Левое внешнее соединение (вывести типы банков, которые не используются) CREATE VIEW "9" AS SELECT "public"."Bank"."name" AS "Банк", "public"."Type of bank"."type" AS "Тип банка" FROM "public"."Bank" RIGHT JOIN "public"."Type of bank" ON "public"."Bank".id_type = "public"."Type of bank".id_type; Рисунок 4.30 – Текст запроса (Правое внешнее соединение) Рисунок 4.31 – Правое внешнее соединение (вывести все банки и типы банков) CREATE VIEW "10" AS SELECT TYPE FROM "Type of bank" WHERE id_type NOT IN (SELECT id_type FROM "Bank"); Рисунок 4.32 – Текст запроса (Запрос на запросе по принципу левого соединения) 27 Рисунок 4.33 – Запрос на запросе по принципу левого соединения (вывести не использованные типы банков) CREATE VIEW "11" AS SELECT "public"."City".city as "Город", Count("public"."Klient".id_klient) as "Количество людей" FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city GROUP BY "public"."City".city; Рисунок 4.34 – Текст запроса (Итоговый запрос без условия) Рисунок 4.35 – Итоговый запрос без условия (количество клиентов в каждом городе) CREATE VIEW "12" AS SELECT Sum("public"."Credit".credit_amount) AS "Общая стоимость выданных кредитов", AVG("public"."Credit".credit_amount) AS "Средняя стоимость выданных кредитов" FROM "public"."Credit"; Рисунок 4.36 – Текст запроса (Итоговый запрос без условия с итоговыми данными вида «всего», «в том числе») Рисунок 4.37 – Итоговый запрос без условия с итоговыми данными вида «всего», «в том числе» (вывести общую стоимость и среднюю стоимость кредитов) 28 CREATE OR REPLACE FUNCTION "13" (_date INT) RETURNS TABLE ("ID" BIGINT) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Credit".id_credit ) FROM "public"."Credit" WHERE "Credit".issue_date BETWEEN concat_ws ('', '''01.01.', _date, '''''') :: DATE AND concat_ws ('', '''31.12.', _date, '''''') :: DATE; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.38 – Текст запроса (Итоговый запрос с условием на данные по значению) Рисунок 4.39 – Итоговый запрос с условием на данные по значению (посчитать кол-во кредитов, выданных в указанном году) CREATE OR REPLACE FUNCTION "14" (_name VARCHAR) RETURNS TABLE ( "Кол-во клиентов" BIGINT ) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Klient".name ) FROM "public"."Klient" WHERE "name" LIKE ( concat_ws ('', '%', _name, '%') ) :: VARCHAR ; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.40 – Текст запроса (Итоговый запрос с условием на данные по маске) Рисунок 4.41 – Итоговый запрос с условием на данные по маске (вывести кол-во клиентов, у которых есть такие буквы в имени) 29 CREATE OR REPLACE FUNCTION "15" (_city VARCHAR) RETURNS TABLE ( "Количество" BIGINT, "Город" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Klient".id_klient ), "public"."City".city FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "City".city = _city GROUP BY "City".city ; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.42 – Текст запроса (Итоговый запрос с условием на данные без индекса) Рисунок 4.43 – Итоговый запрос с условием на данные без индекса (сколько клиентов в указанном городе) CREATE OR REPLACE FUNCTION "16" (_id_city INT) RETURNS TABLE ( "Количество" BIGINT, "Город" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Klient".id_klient ), "public"."City".city FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "City".id_city = _id_city GROUP BY "City".city ; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.44 – Текст запроса (Итоговый запрос с условием на данные с индексом) Рисунок 4.45 – Итоговый запрос с условием на данные с индексом (сколько клиентов в указанном городе) 30 CREATE VIEW "17" AS SELECT "count"("Credit".credit_amount-"Repayment of a credit"."sum") as "Количество кредитов" FROM "public"."Repayment of a credit" INNER JOIN "public"."Credit" ON "public"."Repayment of a credit".id_credit = "public"."Credit".id_credit; Рисунок 4.46 – Текст запроса (Итоговый запрос с условием на группы) Рисунок 4.47 – Итоговый запрос с условием на группы (количество кредитов, которые ещё не выплатили) CREATE OR REPLACE FUNCTION "18" (_type VARCHAR, _date INT) RETURNS TABLE ( "Количество" BIGINT ) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Credit".id_credit ) FROM "public"."Credit" INNER JOIN "public"."Type of credit" ON "public"."Credit".id_type = "public"."Type of credit".id_type WHERE type = _type AND "Credit".issue_date BETWEEN concat_ws ('', '''01.01.', _date, '''''') :: DATE AND concat_ws ('', '''31.12.', _date, '''''') :: DATE ; END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.48 – Текст запроса (Итоговый запрос с условием на данные и на группы) Рисунок 4.49 – Итоговый запрос с условием на данные и на группы (вывести количество кредитов, заложенных в указанном году и вид кредита) 31 CREATE VIEW "19" AS SELECT "public"."Type of credit"."type", ( SELECT AVG ("public"."Credit"."credit_amount") :: INT FROM "public"."Credit" ) FROM "public"."Type of credit" GROUP BY "public"."Type of credit"."type"; Рисунок 4.50 – Текст запроса (Запрос на запросе по принципу итогового запроса) Рисунок 4.51 – Запрос на запросе по принципу итогового запроса (вывести среднюю цену кредита по виду кредита) CREATE VIEW "20" AS SELECT "public"."Klient".phone FROM "Klient" UNION SELECT "public"."Bank".phone FROM "public"."Bank"; Рисунок 4.52 – Текст запроса (Запрос с использованием объединения) Рисунок 4.53 – Запрос с использованием объединения (вывести из 2ух таблиц телефоны) 32 CREATE OR REPLACE FUNCTION "21" ( _city1 VARCHAR, _city2 VARCHAR ) RETURNS TABLE ( "Фамилия" VARCHAR, "Имя" VARCHAR, "Отчество" VARCHAR, "Город" VARCHAR, "Телефон" DATE, "Номер счёта" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Klient".surname, "public"."Klient"."name", "public"."Klient".patronymic, "public"."City".city, "public"."Klient".phone, "public"."Klient".account_number FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "city" IN ( SELECT "city" FROM "City" WHERE "city" IN (_city1, _city2) ); END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.54 – Текст запроса (Запрос с подзапросом in) Рисунок 4.55 – Запрос с подзапросом in (вывести клиентов в указанном городе (2 штуки)) 33 CREATE OR REPLACE FUNCTION "22" ( _city1 VARCHAR, _city2 VARCHAR ) RETURNS TABLE ( "Фамилия" VARCHAR, "Имя" VARCHAR, "Отчество" VARCHAR, "Город" VARCHAR, "Телефон" DATE, "Номер счёта" VARCHAR ) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Klient".surname, "public"."Klient"."name", "public"."Klient".patronymic, "public"."City".city, "public"."Klient".phone, "public"."Klient".account_number FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "city" IN ( SELECT "city" FROM "City" WHERE "city" NOT IN (_city1, _city2) ); END $BODY$ LANGUAGE plpgsql STABLE; Рисунок 4.54 – Текст запроса (Запрос с подзапросом not in) Рисунок 4.55 – Запрос с подзапросом not in (вывести клиентов, которых нет в указанном городе (2 штуки)) 34 CREATE VIEW "23" AS SELECT "Repayment of a credit"."id_repayment", CASE WHEN "Credit".credit_amount-"Repayment of a credit"."sum" > 0 THEN 'Кредит не закрыт' :: TEXT WHEN "Credit".credit_amount-"Repayment of a credit"."sum" < 0 THEN 'Кредит закрыт' :: TEXT END AS "case" FROM "public"."Repayment of a credit" INNER JOIN "public"."Credit" ON "public"."Repayment of a credit".id_credit = "public"."Credit".id_credit; Рисунок 4.56 – Текст запроса (Запрос с case) Рисунок 4.57 – Запрос с case (вывести итог: закрыт кредит или нет) 35 5 РАЗРАБОТКА КЛИЕНТСКОГО ПРИЛОЖЕНИЯ 5.1 Формы и компоненты для работы с основными таблицами Рисунок 5.1 – Форма для сотрудника, для работы с основными таблицами (1й сотрудник) Рисунок 5.2 – Форма для сотрудника, для работы с основными таблицами (2й сотрудник) 36 Рисунок 5.2 – Форма для администратора, для работы с основными таблицами и справочниками 5.2 Формы и компоненты для работы со справочниками Рисунок 5.1 – Главная форма сотрудника, реализована только добавление изданий, новых подписчиков и заявок 37 Рисунок 5.2 – Главная форма администратора, реализованы справочники, добавление сотрудников, ломбардов и просмотра запросов Рисунок 5.3– Всплывающее окно при удалении Рисунок 5.4 – Всплывающее окно если ничего не было найдено 38 5.3 Формы и компоненты для отображения результатов запросов Рисунок 5.5 – Форма с графиками Рисунок 5.6 – Форма с запросами для администратора 39 6 ТЕСТИРОВАНИЕ РАЗРАБОТАННОЙ ИНФОРМАЦИОННОЙ СИСТЕМЫ После создания информационной системы было проведено его тестирования. Была проверена возможность единовременной работы с данными, каскадное удаление, изменение. При ошибочном вводе данных пользователю выводится сообщение, представленное на рисунках 6.1 и 6.2 Рисунок 6.1 – Потеря соединения с сервером Рисунок 6.2 – Ошибка при неправильных входных данных При вводе неправильных входных данных пользователю выдаётся ошибка авторизации, представленная на рисунке 6.3 40 Рисунок 6.3 – Ошибка при неправильных логине или пароле В целях защиты данных были созданы роли администратора(admin_bank) и рядового сотрудника(employee_bank). У администратора есть доступ почти ко всем элементам созданной базы данных, у сотрудников есть доступ только к своим записям в таблице кредиты и возврат кредитов. Остальные сотрудники наследуются от этих ролей. 41 Рисунок 6.4 – пользователь admin_bank Рисунок 6.5 – пользователь employee_bank 42 CREATE ROLE "admin_bank" CREATEROLE LOGIN PASSWORD '12345'; GRANT Connect, Create, Temporary ON DATABASE "Песков" TO "admin_bank" WITH GRANT OPTION; GRANT Create, Usage ON SCHEMA "public" TO "admin_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Bank" TO "admin_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."City" TO "admin_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Employee" TO "admin_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Type of bank" TO "admin_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Type of credit" TO "admin_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."Bank_id_bank_seq" TO "admin_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."City_id_city_seq" TO "admin_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."Type of bank_id_type_seq" TO "admin_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."Type of credit_id_type_seq" TO "admin_bank" WITH GRANT OPTION; CREATE ROLE "employee_bank"; GRANT Connect ON DATABASE "Песков" TO "employee_bank" WITH GRANT OPTION; GRANT Usage ON SCHEMA "public" TO "employee_bank" WITH GRANT OPTION; GRANT References, Select ON TABLE "public"."Bank" TO "employee_bank" WITH GRANT OPTION; GRANT References, Select ON TABLE "public"."City" TO "employee_bank" WITH GRANT OPTION; 43 GRANT References, Select ON TABLE "public"."Employee" TO "employee_bank" WITH GRANT OPTION; GRANT References, Select ON TABLE "public"."Type of bank" TO "employee_bank" WITH GRANT OPTION; GRANT References, Select ON TABLE "public"."Type of credit" TO "employee_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Credit" TO "employee_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Klient" TO "employee_bank" WITH GRANT OPTION; GRANT Delete, Insert, References, Select, Trigger, Truncate, Update ON TABLE "public"."Repayment of a credit" TO "employee_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."Credit_id_credit_seq" TO "employee_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."Klient_id_klient_seq" TO "employee_bank" WITH GRANT OPTION; GRANT Select, Update, Usage ON SEQUENCE "public"."Repayment of a credit_id_repayment_seq" TO "employee_bank" WITH GRANT OPTION; ALTER TABLE "Bank" ENABLE ROW LEVEL SECURITY; ALTER TABLE "Credit" ENABLE ROW LEVEL SECURITY; ALTER TABLE "Repayment of a credit" ENABLE ROW LEVEL SECURITY; ALTER TABLE "Employee" ENABLE ROW LEVEL SECURITY; CREATE POLICY rls_pol_1 ON "Bank" FOR SELECT TO "employee_bank" USING (id_bank = (SELECT DISTINCT "id_bank" FROM "Employee" WHERE "Employee".id_bank = (SELECT "Employee".id_bank FROM "Employee" WHERE "login" = CURRENT_USER))); CREATE POLICY rls_pol_0 ON "Bank" FOR ALL TO "admin_bank" 44 USING (true); CREATE POLICY rls_pol_1 ON "Employee" FOR SELECT TO "employee_bank" USING ("login" = CURRENT_USER); CREATE POLICY rls_pol_0 ON "Employee" FOR ALL TO "admin_bank" USING (true); CREATE POLICY rls_pol_1 ON "Credit" FOR All TO "employee_bank" USING (id_bank = (SELECT DISTINCT "id_bank" FROM "Employee" WHERE "Employee".id_bank = (SELECT "Employee".id_bank FROM "Employee" WHERE "login" = CURRENT_USER))); CREATE POLICY rls_pol_1 ON "Repayment of a credit" FOR All TO "employee_bank" USING (id_bank = (SELECT DISTINCT "id_bank" FROM "Employee" WHERE "Employee".id_bank = (SELECT "Employee".id_bank FROM "Employee" WHERE "login" = CURRENT_USER))); Рисунок 6.7 - Привилегии пользователя admin_bank 45 Рисунок 6.8 – Привилегии пользователя employee_bank Рисунок 6.9 – Вид базы данных для администратора 46 Рисунок 6.10 – Вид базы данных для сотрудника Рисунок 6.11 – Вид таблицы «Сотрудники» для сотрудника Рисунок 6.12 – Вид таблицы «Кредиты» для сотрудника 47 ЗАКЛЮЧЕНИЕ В течение разработки курсового проекта была изучена предметная область проекта, разработана концептуальная модель БД, были написаны основные запросы и функции для данной предметной области, было разработано клиентское приложение. Также были изучены тонкости проектирования и разработки клиент-серверных приложений. Система обладает уникальной авторизацией, базовым уровнем защиты данных от несанкционированного доступа. Недостатками данной программы является то, что отображение данных часто производится с задержкой по причине вычисления данных. В результате создания данной системы требования, изложенные в постановке задачи, выполнены. 48 ПЕРЕЧЕНЬ ССЫЛОК 1. PostgreSQL [Электронный ресурс] Режим доступа: https://ru.wikipedia.org/wiki/PostgreSQL, свободный.- Загл. с экрана. 2. Триггер [Электронный ресурс] Режим доступа: https://ru.wikipedia.org/wiki/Триггер_(базы_данных) , свободный.- Загл. с экрана. 3. Запрос [Электронный ресурс] Режим доступа: http://miheevag.narod.ru/db.htm , свободный.- Загл. с экрана. 4. Уотсон, К. Visual C# 2008. Базовый курс / Карли Уотсон, Кристиан Нейгел, Якоб Хаммер Педерсен, Джон Д. Рид, Морган Скиннер, Эрик Уайт// «Вильямс», 2009.– 1216c. 49 ПРИЛОЖЕНИЕ А ТЕХНИЧЕСКОЕ ЗАДАНИЕ 50 ГОУ ВПО «Донецкий национальный технический университет» Факультет компьютерных наук и технологий Кафедра программной инженерии Утверждаю Федяев О.И. ___________ __. __.2020 г. ТЕХНИЧЕСКОЕ ЗАДАНИЕ на курсовую работу по дисциплине «Программирование систем с серверами баз данных» выдано студенту группы ПИ-18 Тема: «Создание клиент-серверной информационной системы средствами СУБД» Описание предметной области: Донецк – 2020 51 Задание на курсовую работу 1. Спроектировать концептуальную модель базы данных (БД) для заданной предметной области и представить ее в виде взаимосвязанных таблиц, находящихся в третьей нормальной форме (в случае денормализации БД – обосновать необходимость). Выделить базовые таблицы и таблицысправочники, указать для них первичные и внешние ключи. 2. Создать базу данных в среде СУБД средствами языка SQL. Добавить таблицы, домены, индексы. 3. Разработать не менее шести триггеров (по одному для каждого типа события), как минимум для двух различных таблиц БД. Триггеры типа BEFORE INSERT должны быть созданы для всех таблиц и с использованием генераторов задавать значение первичного ключа для вновь добавляемой записи. 4. Заполнить таблицы БД с использованием соответствующих запросов на языке SQL (не менее десяти записей в каждом справочнике, не менее 10 000 50 000 псевдослучайных записей в таблицах). 5. Сформулировать следующие виды запросов: симметричное внутреннее соединение с условием (два запроса с условием отбора по внешнему ключу, два – по датам); симметричное внутреннее соединение без условия (три запроса); левое внешнее соединение; правое внешнее соединение; запрос на запросе по принципу левого соединения; итоговый запрос без условия; итоговый запрос без условия c итоговыми данными вида: «всего», «в том числе»; итоговые запросы с условием на данные (по значению, по маске, с использованием индекса, без использования индекса); итоговый запрос с условием на группы; итоговый запрос с условием на данные и на группы; запрос на запросе по принципу итогового запроса; запрос с использованием объединения запросы с подзапросами (с использованием in, not in, case, операциями над итоговыми данными). 6. Запросы без параметров реализовать в виде представлений, остальные запросы – в виде хранимых процедур и/или функций. Создать, по меньшей мере, одно модифицируемое представление, используя механизм триггеров. ВСЯ логика проектируемого ПО – на сервере. 52 7. Разработать клиентское приложение, которое предоставляет следующие возможности для работы с созданной базой данных: многопользовательский режим работы (одна программа для всех ролей – ситуативный доступ к интерфейсу) наличие нескольких ролей пользователя (администратор – добавление/удаление/редактирование пользователей, их прав/ролей; пользователи_1 – …, пользователи _2 – ...) просмотр содержимого таблиц и представлений (здесь и далее – с учетом прав пользователей); добавление, редактирование и удаление записей таблиц и модифицируемых представлений; работа с наборами данных, находящимися в отношении «один-комногим» (создать составную форму для просмотра и редактирования данных родительской и дочерней таблиц); поиск и фильтрация данных отображаемых таблиц; просмотр результатов выполнения запросов; визуализация результатов одного из итоговых запросов (диаграммы, экспорт в Excell). 8. Обеспечить защиту данных, информации от несанкционированного доступа Рекомендуемое содержание пояснительной записки Введение 1. Описание предметной области, постановка задачи 2. Обоснование выбора СУБД, описание возможностей СУБД 3. Обоснование выбора инструментальные средств для написания клиентской части, проектирование структуры ПО 3.1 Невизуальные компоненты для работы с данными 3.2 Визуальные компоненты отображения данных 3.3 Разработка шаблонов приложений для работы c таблицами базы данных 4. Проектирование базы данных в выбранной СУБД 4.1 Проектирование концептуальной модели БД 4.2 Создание таблиц, доменов, индексов 4.3 Разработка триггеров 4.4 Проектирование запросов к базе данных 4.5 Создание представлений и хранимых процедур, функций 5. Разработка клиентского приложения 5.1 Формы и компоненты для работы с основными таблицами 53 5.2 Формы и компоненты для работы со справочниками 5.3 Формы и компоненты для отображения результатов запросов 6. Тестирование разработанной информационной системы (в т.ч. включая защиту от несанкционированного доступа, одновременную работы с данными, каскадное удаление) Заключение Приложение А. Техническое задание Приложение Б. Листинг шаблонов Приложение В. Листинг серверного приложения Приложение Д. Листинг клиентского приложения Приложение Е. Руководство пользователя Приложение Ж. Руководство администратора График выполнения курсовой работы Неделя Работа 1-2 Выдача и изучение задания 3 Анализ реализации требований к системе и способов 4-5 Проектирование и реализация БД (таблицы, домены, индексы) 6-7 Создание триггеров и заполнение таблиц БД 8-9 Создание представлений и хранимых процедур 10-13 Разработка клиентского приложения 14 Тестирование и отладка системы 15 Оформление пояснительной записки 16-17 Защита курсовой работы Дата выдачи задания 04.02.2021 Задание принял 04.02.2021 Руководители проекта Ногтев Е.А. Щедрин С.В. их 54 ПРИЛОЖЕНИЕ Б ЛИСТНИГ ШАБЛОНОВ 55 Рисунок Б.1 – Главная форма сотрудника, реализована только добавление кредитов и новых клиентов Рисунок Б.2 – Главная форма администратора: справочники, добавление сотрудников, банков, просмотра запросов и графика 56 Рисунок Б.4– Всплывающее окно при удалении Рисунок Б.5 – Всплывающее окно если ничего не было найдено 57 Рисунок Б.8 – Форма с графиками на форме администратора Рисунок Б.9 – Форма с запросами для администратора 58 Рисунок Б.10 – Форма входа Рисунок Б.11 – Форма добавления/изменения данных 59 ПРИЛОЖЕНИЕ В ЛИСТИНГ СЕРВЕРНОГО ПРИЛОЖЕНИЯ -- ----------------------------- Sequence structure for Bank_id_bank_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."Bank_id_bank_seq"; CREATE SEQUENCE "public"."Bank_id_bank_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1; -- ----------------------------- Sequence structure for City_id_city_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."City_id_city_seq"; CREATE SEQUENCE "public"."City_id_city_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1; -- ----------------------------- Sequence structure for Credit_id_credit_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."Credit_id_credit_seq"; CREATE SEQUENCE "public"."Credit_id_credit_seq" INCREMENT 1 MAXVALUE 2147483647 CACHE 1; -- ----------------------------- Sequence structure for Klient_id_klient_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."Klient_id_klient_seq"; CREATE SEQUENCE "public"."Klient_id_klient_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1; -- ----------------------------- Sequence structure for Repayment of a credit_id_repayment_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."Repayment of a credit_id_repayment_seq"; CREATE SEQUENCE "public"."Repayment of a credit_id_repayment_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1; -- ----------------------------- Sequence structure for Type of bank_id_type_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."Type of bank_id_type_seq"; CREATE SEQUENCE "public"."Type of bank_id_type_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1; -- ----------------------------- Sequence structure for Type of credit_id_type_seq -- ---------------------------DROP SEQUENCE IF EXISTS "public"."Type of credit_id_type_seq"; CREATE SEQUENCE "public"."Type of credit_id_type_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1; -- ----------------------------- Table structure for Bank -- ---------------------------DROP TABLE IF EXISTS "public"."Bank"; CREATE TABLE "public"."Bank" ( "id_bank" int4 NOT NULL DEFAULT nextval('"Bank_id_bank_seq"'::regclass), "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, "id_type" int4 NOT NULL, "year_open" int4 NOT NULL, "charter_capital" int4 NOT NULL, "phone" varchar(13) COLLATE "pg_catalog"."default" NOT NULL ) ; -- ----------------------------- Table structure for City -- ---------------------------DROP TABLE IF EXISTS "public"."City"; CREATE TABLE "public"."City" ( "id_city" int4 NOT NULL DEFAULT nextval('"City_id_city_seq"'::regclass), "city" varchar(255) COLLATE "pg_catalog"."default" NOT NULL ) ; -- ----------------------------- Table structure for Credit -- ---------------------------DROP TABLE IF EXISTS "public"."Credit"; CREATE TABLE "public"."Credit" ( "id_credit" int4 NOT NULL DEFAULT nextval('"Credit_id_credit_seq"'::regclass), "id_bank" int4 NOT NULL, "id_klient" int4 NOT NULL, "id_type" int4 NOT NULL, "credit_amount" int4 NOT NULL, "annual_percentage" int4 NOT NULL, "issue_date" date NOT NULL ) ; -- ----------------------------- Table structure for Employee -- ---------------------------DROP TABLE IF EXISTS "public"."Employee"; CREATE TABLE "public"."Employee" ( "login" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, "id_bank" int4 NOT NULL ) ; -- ----------------------------- Table structure for Klient -- ---------------------------DROP TABLE IF EXISTS "public"."Klient"; CREATE TABLE "public"."Klient" ( "id_klient" int4 NOT NULL DEFAULT nextval('"Klient_id_klient_seq"'::regclass), "surname" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, "name" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, "patronymic" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, 60 "id_city" int4 NOT NULL, "phone" varchar(13) COLLATE "pg_catalog"."default" NOT NULL, "account_number" varchar(255) COLLATE "pg_catalog"."default" NOT NULL ) ; -- ----------------------------- Table structure for Repayment of a credit -- ---------------------------DROP TABLE IF EXISTS "public"."Repayment of a credit"; CREATE TABLE "public"."Repayment of a credit" ( "id_repayment" int4 NOT NULL DEFAULT nextval('"Repayment of a credit_id_repayment_seq"'::regclass), "sum" int4 NOT NULL, "date" date NOT NULL, "id_credit" int4 NOT NULL, "id_bank" int4 NOT NULL ) ; -- ----------------------------- Table structure for Type of bank -- ---------------------------DROP TABLE IF EXISTS "public"."Type of bank"; CREATE TABLE "public"."Type of bank" ( "id_type" int4 NOT NULL DEFAULT nextval('"Type of bank_id_type_seq"'::regclass), "type" varchar(255) COLLATE "pg_catalog"."default" NOT NULL ) ; -- ----------------------------- Table structure for Type of credit -- ---------------------------DROP TABLE IF EXISTS "public"."Type of credit"; CREATE TABLE "public"."Type of credit" ( "id_type" int4 NOT NULL DEFAULT nextval('"Type of credit_id_type_seq"'::regclass), "type" varchar(255) COLLATE "pg_catalog"."default" NOT NULL ) ; -- ----------------------------- Function structure for 1 -- ---------------------------DROP FUNCTION IF EXISTS "public"."1"("_type" varchar); CREATE OR REPLACE FUNCTION "public"."1"("_type" varchar) RETURNS TABLE("ID" int4, "Название" varchar, "Тип банка" varchar, "Год создания" int4, "Уставной фонд" int4, "Телефон" varchar) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Bank".id_bank, "public"."Bank"."name", "public"."Type of bank"."type", "public"."Bank".year_open, "public"."Bank".charter_capital, "public"."Bank".phone FROM "public"."Bank" INNER JOIN "public"."Type of bank" ON "public"."Bank".id_type = "public"."Type of bank".id_type WHERE "Type of bank".type = _type ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 13 -- ---------------------------DROP FUNCTION IF EXISTS "public"."13"("_date" int4); CREATE OR REPLACE FUNCTION "public"."13"("_date" int4) RETURNS TABLE("ID" int8) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Credit".id_credit ) FROM "public"."Credit" WHERE "Credit".issue_date BETWEEN concat_ws ('', '''01.01.', _date, '''''') :: DATE AND concat_ws ('', '''31.12.', _date, '''''') :: DATE ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 14 -- ---------------------------DROP FUNCTION IF EXISTS "public"."14"("_name" varchar); CREATE OR REPLACE FUNCTION "public"."14"("_name" varchar) RETURNS TABLE("Кол-во клиентов" int8) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Klient".name ) FROM "public"."Klient" WHERE "name" LIKE ( concat_ws ('', '%', _name, '%') ) :: VARCHAR ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 15 -- ---------------------------DROP FUNCTION IF EXISTS "public"."15"("_city" varchar); CREATE OR REPLACE FUNCTION "public"."15"("_city" varchar) RETURNS TABLE("Количество" int8, "Город" varchar) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Klient".id_klient ), "public"."City".city FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "City".city = _city GROUP BY "City".city ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 16 -- ---------------------------DROP FUNCTION IF EXISTS "public"."16"("_id_city" int4); CREATE OR REPLACE FUNCTION "public"."16"("_id_city" int4) RETURNS TABLE("Количество" int8, "Город" varchar) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( 61 "public"."Klient".id_klient ), "public"."City".city FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "City".id_city = _id_city GROUP BY "City".city ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 18 -- ---------------------------DROP FUNCTION IF EXISTS "public"."18"("_type" varchar, "_date" int4); CREATE OR REPLACE FUNCTION "public"."18"("_type" varchar, "_date" int4) RETURNS TABLE("Количество" int8) AS $BODY$ BEGIN RETURN QUERY SELECT COUNT ( "public"."Credit".id_credit ) FROM "public"."Credit" INNER JOIN "public"."Type of credit" ON "public"."Credit".id_type = "public"."Type of credit".id_type WHERE type = _type AND "Credit".issue_date BETWEEN concat_ws ('', '''01.01.', _date, '''''') :: DATE AND concat_ws ('', '''31.12.', _date, '''''') :: DATE ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 2 -- ---------------------------DROP FUNCTION IF EXISTS "public"."2"("_city" varchar); CREATE OR REPLACE FUNCTION "public"."2"("_city" varchar) RETURNS TABLE("ID" int4, "Фамилия" varchar, "Имя" varchar, "Отчество" varchar, "Город" varchar, "Телефон" varchar, "Номер счёта" varchar) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Klient".id_klient, "public"."Klient".surname, "public"."Klient"."name", "public"."Klient".patronymic, "public"."City".city, "public"."Klient".phone, "public"."Klient".account_number FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "City".city = _city ; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 21 -- ---------------------------DROP FUNCTION IF EXISTS "public"."21"("_city1" varchar, "_city2" varchar); CREATE OR REPLACE FUNCTION "public"."21"("_city1" varchar, "_city2" varchar) RETURNS TABLE("Фамилия" varchar, "Имя" varchar, "Отчество" varchar, "Город" varchar, "Телефон" varchar, "Номер счёта" varchar) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Klient".surname, "public"."Klient"."name", "public"."Klient".patronymic, "public"."City".city, "public"."Klient".phone, "public"."Klient".account_number FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "city" IN ( SELECT "city" FROM "City" WHERE "city" IN (_city1, _city2) ); END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 22 -- ---------------------------DROP FUNCTION IF EXISTS "public"."22"("_city1" varchar, "_city2" varchar); CREATE OR REPLACE FUNCTION "public"."22"("_city1" varchar, "_city2" varchar) RETURNS TABLE("Фамилия" varchar, "Имя" varchar, "Отчество" varchar, "Город" varchar, "Телефон" varchar, "Номер счёта" varchar) AS $BODY$ BEGIN RETURN QUERY SELECT "public"."Klient".surname, "public"."Klient"."name", "public"."Klient".patronymic, "public"."City".city, "public"."Klient".phone, "public"."Klient".account_number FROM "public"."Klient" INNER JOIN "public"."City" ON "public"."Klient".id_city = "public"."City".id_city WHERE "city" IN ( SELECT "city" FROM "City" WHERE "city" NOT IN (_city1, _city2) ); END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for 3 -- ---------------------------DROP FUNCTION IF EXISTS "public"."3"("_date" int4); CREATE OR REPLACE FUNCTION "public"."3"("_date" int4) RETURNS TABLE("ID" int4, "Название" varchar, "Тип банка" varchar, "Год создания" int4, "Уставной фонд" int4, "Телефон" varchar) AS $BODY$ BEGIN 62 RETURN QUERY SELECT "public"."Bank".id_bank, "public"."Bank"."name", "public"."Type of bank"."type", "public"."Bank".year_open, "public"."Bank".charter_capital, "public"."Bank".phone FROM "public"."Bank" INNER JOIN "public"."Type of bank" ON "public"."Bank".id_type = "public"."Type of bank".id_type WHERE "Bank".year_open = _date; END $BODY$ LANGUAGE plpgsql STABLE COST 100 ROWS 1000; -- ----------------------------- Function structure for u_login -- ---------------------------DROP FUNCTION IF EXISTS "public"."u_login"("_username" varchar); CREATE OR REPLACE FUNCTION "public"."u_login"("_username" varchar) RETURNS "pg_catalog"."int4" AS $BODY$ BEGIN IF(select pg_has_role(_username, 'admin_bank', 'MEMBER')) = TRUE THEN RETURN 1; ELSE IF (select pg_has_role(_username, 'employee_bank', 'MEMBER')) = TRUE THEN RETURN 0; END if; END if; END $BODY$ LANGUAGE plpgsql VOLATILE COST 100; -- ----------------------------- View structure for 6 -- ---------------------------DROP VIEW IF EXISTS "public"."6"; CREATE VIEW "public"."6" AS SELECT "Klient".id_klient AS "ID", "Klient".surname AS "Фамилия", "Klient".name AS "Имя", "Klient".patronymic AS "Отчество", "City".city AS "Город", "Klient".phone AS "Телефон", "Klient".account_number AS "Номер счёта" FROM ("Klient" JOIN "City" ON (("Klient".id_city = "City".id_city))) ORDER BY "City".city; -- ----------------------------- View structure for 7 -- ---------------------------DROP VIEW IF EXISTS "public"."7"; CREATE VIEW "public"."7" AS SELECT "Bank".name AS "Банк", "Type of bank".type AS "Тип банка" FROM ("Bank" JOIN "Type of bank" ON (("Bank".id_type = "Type of bank".id_type))); -- ----------------------------- View structure for 8 -- ---------------------------DROP VIEW IF EXISTS "public"."8"; CREATE VIEW "public"."8" AS SELECT "Type of bank".type AS "Тип банка" FROM ("Type of bank" LEFT JOIN "Bank" ON (("Type of bank".id_type = "Bank".id_type))) WHERE ("Bank".id_type IS NULL); -- ----------------------------- View structure for 9 -- ---------------------------DROP VIEW IF EXISTS "public"."9"; CREATE VIEW "public"."9" AS SELECT "Bank".name AS "Банк", "Type of bank".type AS "Тип банка" FROM ("Bank" RIGHT JOIN "Type of bank" ON (("Bank".id_type = "Type of bank".id_type))); -- ----------------------------- View structure for 10 -- ---------------------------DROP VIEW IF EXISTS "public"."10"; CREATE VIEW "public"."10" AS SELECT "Type of bank".type FROM "Type of bank" WHERE (NOT ("Type of bank".id_type IN ( SELECT "Bank".id_type FROM "Bank"))); -- ----------------------------- View structure for 11 -- ---------------------------DROP VIEW IF EXISTS "public"."11"; CREATE VIEW "public"."11" AS SELECT "City".city AS "Город", count("Klient".id_klient) AS "Количество людей" FROM ("Klient" JOIN "City" ON (("Klient".id_city = "City".id_city))) GROUP BY "City".city; -- ----------------------------- View structure for 19 -- ---------------------------DROP VIEW IF EXISTS "public"."19"; CREATE VIEW "public"."19" AS SELECT "Type of credit".type, ( SELECT (avg("Credit".credit_amount))::integer AS avg FROM "Credit") AS avg FROM "Type of credit" GROUP BY "Type of credit".type; -- ----------------------------- View structure for 17 -- ---------------------------DROP VIEW IF EXISTS "public"."17"; CREATE VIEW "public"."17" AS SELECT count(("Credit".credit_amount - "Repayment of a credit".sum)) AS "Количество кредитов" FROM ("Repayment of a credit" JOIN "Credit" ON (("Repayment of a credit".id_credit = "Credit".id_credit))); -- ----------------------------- View structure for 20 -- ---------------------------DROP VIEW IF EXISTS "public"."20"; CREATE VIEW "public"."20" AS SELECT "Klient".phone FROM "Klient" UNION SELECT "Bank".phone FROM "Bank"; -- ----------------------------- View structure for 23 -- ---------------------------DROP VIEW IF EXISTS "public"."23"; CREATE VIEW "public"."23" AS SELECT "Repayment of a credit".id_repayment, CASE WHEN (("Credit".credit_amount - "Repayment of a credit".sum) > 0) THEN 'Кредит не закрыт'::text WHEN (("Credit".credit_amount - "Repayment of a credit".sum) < 0) THEN 'Кредит закрыт'::text ELSE NULL::text END AS "case" 63 FROM ("Repayment of a credit" JOIN "Credit" ON (("Repayment of a credit".id_credit = "Credit".id_credit))); -- ----------------------------- View structure for 12 -- ---------------------------DROP VIEW IF EXISTS "public"."12"; CREATE VIEW "public"."12" AS SELECT sum("Credit".credit_amount) AS "Общая стоимость выданных кредитов", avg("Credit".credit_amount) AS "Средняя стоимость выданных кредит" FROM "Credit"; -- ----------------------------- View structure for 4 -- ---------------------------DROP VIEW IF EXISTS "public"."4"; CREATE VIEW "public"."4" AS SELECT "Credit".id_credit AS "ID", "Bank".name AS "Банк", concat_ws(' '::text, "Klient".surname, "Klient".name, "Klient".patronymic) AS "Клиент", "Type of credit".type AS "Вид кредита", "Credit".credit_amount AS "Сумма", "Credit".annual_percentage AS "Годовой процент", "Credit".issue_date AS "Дата выдачи" FROM ((("Credit" JOIN "Bank" ON (("Bank".id_bank = "Credit".id_bank))) JOIN "Klient" ON (("Credit".id_klient = "Klient".id_klient))) JOIN "Type of credit" ON (("Credit".id_type = "Type of credit".id_type))) WHERE ("Credit".issue_date > (now() - '730 days'::interval)); -- ----------------------------- View structure for 5 -- ---------------------------DROP VIEW IF EXISTS "public"."5"; CREATE VIEW "public"."5" AS SELECT "Credit".id_credit AS "ID", "Bank".name AS "Банк", concat_ws(' '::text, "Klient".surname, "Klient".name, "Klient".patronymic) AS "Клиент", "Type of credit".type AS "Вид кредита", "Credit".credit_amount AS "Сумма", "Credit".annual_percentage AS "Годовой процент", "Credit".issue_date AS "Дата выдачи" FROM ((("Credit" JOIN "Bank" ON (("Bank".id_bank = "Credit".id_bank))) JOIN "Klient" ON (("Credit".id_klient = "Klient".id_klient))) JOIN "Type of credit" ON (("Credit".id_type = "Type of credit".id_type))) ORDER BY "Credit".credit_amount DESC LIMIT 100; -- ----------------------------- Alter sequences owned by -- ---------------------------ALTER SEQUENCE "public"."Bank_id_bank_seq" OWNED BY "public"."Bank"."id_bank"; SELECT setval('"public"."Bank_id_bank_seq"', 26, true); ALTER SEQUENCE "public"."City_id_city_seq" OWNED BY "public"."City"."id_city"; SELECT setval('"public"."City_id_city_seq"', 98, true); ALTER SEQUENCE "public"."Credit_id_credit_seq" OWNED BY "public"."Credit"."id_credit"; SELECT setval('"public"."Credit_id_credit_seq"', 3001, true); ALTER SEQUENCE "public"."Klient_id_klient_seq" OWNED BY "public"."Klient"."id_klient"; SELECT setval('"public"."Klient_id_klient_seq"', 699, true); ALTER SEQUENCE "public"."Repayment of a credit_id_repayment_seq" OWNED BY "public"."Repayment of a credit"."id_repayment"; SELECT setval('"public"."Repayment of a credit_id_repayment_seq"', 12001, true); ALTER SEQUENCE "public"."Type of bank_id_type_seq" OWNED BY "public"."Type of bank"."id_type"; SELECT setval('"public"."Type of bank_id_type_seq"', 10, true); ALTER SEQUENCE "public"."Type of credit_id_type_seq" OWNED BY "public"."Type of credit"."id_type"; SELECT setval('"public"."Type of credit_id_type_seq"', 17, true); -- ----------------------------- Primary Key structure for table Bank -- ---------------------------ALTER TABLE "public"."Bank" ADD CONSTRAINT "Bank_pkey" PRIMARY KEY ("id_bank"); -- ----------------------------- Primary Key structure for table City -- ---------------------------ALTER TABLE "public"."City" ADD CONSTRAINT "City_pkey" PRIMARY KEY ("id_city"); -- ----------------------------- Primary Key structure for table Credit -- ---------------------------ALTER TABLE "public"."Credit" ADD CONSTRAINT "Credit_pkey" PRIMARY KEY ("id_credit"); -- ----------------------------- Primary Key structure for table Employee -- ---------------------------ALTER TABLE "public"."Employee" ADD CONSTRAINT "Employee_pkey" PRIMARY KEY ("login"); -- ----------------------------- Primary Key structure for table Klient -- ---------------------------ALTER TABLE "public"."Klient" ADD CONSTRAINT "Klient_pkey" PRIMARY KEY ("id_klient"); -- ----------------------------- Primary Key structure for table Repayment of a credit -- ---------------------------ALTER TABLE "public"."Repayment of a credit" ADD CONSTRAINT "Repayment of a credit_pkey" PRIMARY KEY ("id_repayment"); -- ----------------------------- Primary Key structure for table Type of bank -- ---------------------------ALTER TABLE "public"."Type of bank" ADD CONSTRAINT "Type of bank_pkey" PRIMARY KEY ("id_type"); -- ----------------------------- Primary Key structure for table Type of credit -- ---------------------------ALTER TABLE "public"."Type of credit" ADD CONSTRAINT "Type of credit_pkey" PRIMARY KEY ("id_type"); -- ----------------------------- Foreign Keys structure for table Bank -- ---------------------------ALTER TABLE "public"."Bank" ADD CONSTRAINT "Bank_id_type_fkey" FOREIGN KEY ("id_type") REFERENCES "public"."Type of bank" ("id_type") ON DELETE CASCADE ON UPDATE CASCADE; -- ----------------------------- Foreign Keys structure for table Credit -- ---------------------------ALTER TABLE "public"."Credit" ADD CONSTRAINT "Credit_id_bank_fkey" FOREIGN KEY ("id_bank") REFERENCES "public"."Bank" ("id_bank") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "public"."Credit" ADD CONSTRAINT "Credit_id_klient_fkey" FOREIGN KEY ("id_klient") REFERENCES "public"."Klient" ("id_klient") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "public"."Credit" ADD CONSTRAINT "Credit_id_type_fkey" FOREIGN KEY ("id_type") REFERENCES "public"."Type of credit" ("id_type") ON DELETE CASCADE ON UPDATE CASCADE; 64 -- ----------------------------- Foreign Keys structure for table Klient -- ---------------------------ALTER TABLE "public"."Klient" ADD CONSTRAINT "Klient_id_city_fkey" FOREIGN KEY ("id_city") REFERENCES "public"."City" ("id_city") ON DELETE CASCADE ON UPDATE CASCADE; -- ----------------------------- Foreign Keys structure for table Repayment of a credit -- ---------------------------ALTER TABLE "public"."Repayment of a credit" ADD CONSTRAINT "Repayment of a credit_id_credit_fkey" FOREIGN KEY ("id_credit") REFERENCES "public"."Credit" ("id_credit") ON DELETE CASCADE ON UPDATE CASCADE;; 65 ПРИЛОЖЕНИЕ Г ЛИСТИНГ КЛИЕНТСКОГО ПРИЛОЖЕНИЯ Код файла Аdmin.CS button2.Text = "Добавить тип банка"; button2.Visible = true; using System; using System.Collections.Generic; using System.Data; using Npgsql; using System.Windows.Forms; } private void видКредитаToolStripMenuItem_Click(object sender, EventArgs e) namespace DataBase { public partial class Admin : Form { { string connectionString = ""; private string usersurname; private string userpassword; private NpgsqlConnection npgSqlConnection; NpgsqlCommand sqlCommand; DataTable dt; NpgsqlDataReader dataReader; private string sql = ""; private string deletesql1 = ""; String id = ""; public Admin(string usersurname, string userpassword) { InitializeComponent(); this.usersurname = usersurname; this.userpassword = userpassword; button2.Visible = false; connectionString = "Server = localhost;" + "Port = 5432;" + "Database = Песков;" + "User Id = '" + usersurname + "';" + "Password = '" + userpassword + "';"; label2.Text = "Обновить данные"; } /// <summary> /// Метод вычисления количества ячеек в таблице /// </summary> private int GetCountOfFilledCells(int columnIndex) { int count = 0; for (int i = 0; i < dataGridView1.RowCount; i++) { if (dataGridView1[columnIndex, i].Value != null && dataGridView1[columnIndex, i].Value.ToString() label1.Text = "вид кредита"; command_sql_select(); Load_dataGridView(); button4.Enabled = false; button2.Text = "Добавить вид кредита"; button2.Visible = true; } private void городToolStripMenuItem_Click(object sender, EventArgs e) { label1.Text = "город"; command_sql_select(); Load_dataGridView(); button4.Enabled = false; button2.Text = "Добавить город"; button2.Visible = true; } private void банкToolStripMenuItem_Click(object sender, EventArgs e) { label1.Text = "банк"; command_sql_select(); Load_dataGridView(); button4.Enabled = true; button2.Text = "Добавить банк"; button2.Visible = true; } != String.Empty) count++; } return count; private сотрудникиПредприятияToolStripMenuItem_Click(object sender, EventArgs e) { label1.Text = "сотрудник"; command_sql_select(); Load_dataGridView(); button4.Enabled = false; button2.Text = "Добавить сотрудника"; button2.Visible = true; } void } /// <summary> /// Метод загрузки таблицы /// </summary> public void Load_dataGridView() { try { if (npgSqlConnection != null && npgSqlConnection.State != ConnectionState.Closed) { npgSqlConnection.Close(); } npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); dataGridView1.DataSource = dt; dataGridView1.AutoResizeColumns(); npgSqlConnection.Close(); label5.Text = "Всего GetCountOfFilledCells(0).ToString() + " строк"; dataGridView1.ReadOnly = true; } catch (Exception ex) { MessageBox.Show(ex.Message); npgSqlConnection.Close(); } } private void заполненно типБанкаToolStripMenuItem_Click(object EventArgs e) { label1.Text = "тип банка"; command_sql_select(); Load_dataGridView(); button4.Enabled = false; " + sender, private void FormClosingEventArgs e) { Hide(); new Login().Show(); } Admin_FormClosing(object sender, /// <summary> /// Команды для загрузки таблицы из бд /// </summary> /// //сделал public void command_sql_select() { if (label1.Text == "тип банка") { sql = "SELECT \"Type of bank\".id_type as \"ID\", \"Type of bank\".\"type\" as \"Тип банка\" FROM \"Type of bank\""; } else if (label1.Text == "вид кредита") { sql = "SELECT \"Type of credit\".id_type as \"ID\", \"Type of credit\".\"type\" as \"Тип кредита\" FROM \"Type of credit\""; } else if (label1.Text == "город") { sql = "SELECT \"City\".id_city as \"ID\", \"City\".city as \"Город\" FROM \"City\""; } else if (label1.Text == "банк") { sql = "SELECT \"Bank\".id_bank as \"ID\", \"Bank\".\"name\" as \"Название\", \"Type of bank\".\"type\" as \"Тип банка\", \"Bank\".year_open as \"Год открытия\", \"Bank\".charter_capital as \"Уставной фонд\", \"Bank\".phone as \"Телефон\" FROM \"Bank\" INNER JOIN \"Type of bank\" ON \"Bank\".id_type = \"Type of bank\".id_type"; } else if (label1.Text == "сотрудник") { sql = "SELECT public.\"Employee\".\"login\" as \"Логин\", id_bank as \"Банк\" FROM public.\"Employee\" "; } } 66 sql = "DELETE FROM \"Type of credit\" WHERE id_type in (" /// <summary> /// Кнопка "Добавить запись в таблицу"(открытие новой формы) /// </summary> private void button2_Click(object sender, EventArgs e) { try { string id; int selectedrowindex = dataGridView1.SelectedCells[0].RowIndex; DataGridViewRow selectedRow = dataGridView1.Rows[selectedrowindex]; id = Convert.ToString(selectedRow.Cells[0].Value); string Name = label1.Text; Add_information add_information Add_information(Name, id); add_information.ShowDialog(); } catch (Exception) { MessageBox.Show("Вы таблицу"); } } = new не выбрали + delete + ");"; deletesql1 = ""; } else if (label1.Text == "город") { sql = "DELETE FROM \"City\" WHERE id_city in (" + delete + ");"; deletesql1 = ""; } else if (label1.Text == "банк") { sql = "DELETE FROM \"Bank\" WHERE id_bank in (" + delete + ");"; deletesql1 = ""; } else if (label1.Text == "сотрудник") { sql = "DELETE FROM \"Employee\" WHERE login in ('" + delete + "');"; /// <summary> /// Удаление через кнопку Delete /// </summary> private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) { if (MessageBox.Show("Вы действительно хотите удалить?", "Удаление", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel) { e.Cancel = true; command_sql_select(); Load_dataGridView(); } else { int selectedrowindex = dataGridView1.SelectedCells[0].RowIndex; DataGridViewRow selectedRow = dataGridView1.Rows[selectedrowindex]; id = Convert.ToString(selectedRow.Cells[0].Value); delete_dataGridView(); } command_sql_select(); Load_dataGridView(); } /// <summary> /// Метод удаления записи по ID /// </summary> List<int> Selected = new List<int>(); string temp = ""; string delete = ""; private void delete_dataGridView() { foreach (DataGridViewCell cell in dataGridView1.SelectedCells) { if (cell.ColumnIndex == 0) { Selected.Add((int)cell.Value); } } foreach (int temp1 in Selected) { temp += temp1.ToString() + ","; } char[] MyChar = { ',' }; delete = temp.TrimEnd(MyChar); command_sql_delete(); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand(deletesql1, npgSqlConnection); sqlCommand.ExecuteNonQuery(); sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); sqlCommand.ExecuteNonQuery(); npgSqlConnection.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); npgSqlConnection.Close(); } delete = ""; command_sql_select(); Load_dataGridView(); } /// <summary> /// Команды для удаления из БД по ID /// </summary> private void command_sql_delete() { if (label1.Text == "тип банка") { sql = "DELETE FROM \"Type of bank\" WHERE id_type in (" + delete + ");"; deletesql1 = ""; } else if (label1.Text == "вид кредита") { deletesql1 = "DROP OWNED BY \"'" + dataGridView1.CurrentRow.Cells[0].Value.ToString() + "'\"; DROP ROLE \"'" + dataGridView1.CurrentRow.Cells[0].Value.ToString() + "'\";"; } } /// <summary> /// Метод для добавления в таблицу(открытие новой формы, а там уже вся красота) /// </summary> private void dataGridView1_DoubleClick(object sender, EventArgs e) { string Name = label1.Text; int selectedrowindex = dataGridView1.SelectedCells[0].RowIndex; DataGridViewRow selectedRow = dataGridView1.Rows[selectedrowindex]; string id = Convert.ToString(selectedRow.Cells[0].Value); Add_information add_information = new Add_information(Name, id); if (Name == "тип банка") { add_information.ID.Text dataGridView1.CurrentRow.Cells[0].Value.ToString(); add_information.TextBox1.Text dataGridView1.CurrentRow.Cells[1].Value.ToString(); } else if (Name == "вид кредита") { add_information.ID.Text dataGridView1.CurrentRow.Cells[0].Value.ToString(); add_information.TextBox1.Text dataGridView1.CurrentRow.Cells[1].Value.ToString(); } else if (Name == "город") { add_information.ID.Text dataGridView1.CurrentRow.Cells[0].Value.ToString(); add_information.TextBox1.Text dataGridView1.CurrentRow.Cells[1].Value.ToString(); } else if (Name == "банк") { add_information.ID.Text dataGridView1.CurrentRow.Cells[0].Value.ToString(); add_information.TextBox1.Text dataGridView1.CurrentRow.Cells[1].Value.ToString(); add_information.ComboBox1.Text dataGridView1.CurrentRow.Cells[2].Value.ToString(); add_information.TextBox2.Text dataGridView1.CurrentRow.Cells[3].Value.ToString(); add_information.TextBox3.Text dataGridView1.CurrentRow.Cells[4].Value.ToString(); add_information.TextBox4.Text dataGridView1.CurrentRow.Cells[5].Value.ToString(); } else if (Name == "сотрудник") { add_information.TextBox1.Text dataGridView1.CurrentRow.Cells[0].Value.ToString(); add_information.ComboBox1.Text dataGridView1.CurrentRow.Cells[1].Value.ToString(); } if (dataGridView1.CurrentRow.Cells[0].Value.ToString() != "") { add_information.button1.Text = "Изменить"; } add_information.ShowDialog(); } private void label1_Click(object sender, EventArgs e) { command_sql_select(); Load_dataGridView(); } /// <summary> /// Кнопка для поиска /// </summary> private void button4_Click(object sender, EventArgs e) { string value_for_search = textBox3.Text; if (label1.Text == "банк") = = = = = = = = = = = = = = 67 { sql = "SELECT \"Bank\".id_bank as \"ID\", \"Bank\".\"name\" as \"Название\", \"Type of bank\".\"type\" as \"Тип банка\", \"Bank\".year_open as \"Год открытия\", \"Bank\".charter_capital as \"Уставной фонд\", \"Bank\".phone as \"Телефон\" FROM \"Bank\" INNER JOIN \"Type of bank\" ON \"Bank\".id_type = \"Type of bank\".id_type WHERE name = '" + value_for_search + "' or type = '" + value_for_search + "' or phone = '" + value_for_search + "'"; } Load_dataGridView(); if (label5.Text == "Всего заполненно 0 строк") { MessageBox.Show("Поиск не дал результата"); command_sql_select(); Load_dataGridView(); } textBox3.Clear(); } string Query = ""; Query = "11"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem13_Click(object sender, EventArgs e) { Query = "12"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem14_Click(object sender, EventArgs e) { Query = "13"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void label2_Click(object sender, EventArgs e) { command_sql_select(); Load_dataGridView(); } private void графикToolStripMenuItem_Click(object private void toolStripMenuItem15_Click(object sender, EventArgs e) { Query = "14"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } sender, EventArgs e) private void toolStripMenuItem16_Click(object sender, EventArgs e) { Query = "15"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } { Graphics graphics = new Graphics(usersurname, userpassword); graphics.ShowDialog(); } private void toolStripMenuItem2_Click(object sender, EventArgs e) { Query = "1"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem17_Click(object sender, EventArgs e) { Query = "16"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem3_Click(object sender, EventArgs e) { Query = "2"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem18_Click(object sender, EventArgs e) { Query = "17"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem4_Click(object sender, EventArgs e) { Query = "3"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem19_Click(object sender, EventArgs e) { Query = "18"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem5_Click(object sender, EventArgs e) { Query = "4"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem20_Click(object sender, EventArgs e) { Query = "19"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem6_Click(object sender, EventArgs e) { Query = "5"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem21_Click(object sender, EventArgs e) { Query = "20"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem7_Click(object sender, EventArgs e) { Query = "6"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem22_Click(object sender, EventArgs e) { Query = "21"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem8_Click(object sender, EventArgs e) { Query = "7"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem23_Click(object sender, EventArgs e) { Query = "22"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem9_Click(object sender, EventArgs e) { Query = "8"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem10_Click(object sender, EventArgs e) { Query = "9"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem11_Click(object sender, EventArgs e) { Query = "10"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } private void toolStripMenuItem24_Click(object sender, EventArgs e) { Query = "23"; Querys querys = new Querys(Query, usersurname, userpassword); querys.ShowDialog(); } } } Код файла Zaprosy.CS using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; private void toolStripMenuItem12_Click(object sender, EventArgs e) { using System.Text; 68 using System.Threading.Tasks; comboBox1.Visible = false; comboBox2.Visible = false; using System.Windows.Forms; } using Npgsql; else if (Query1 == "10") using Excel = Microsoft.Office.Interop.Excel; { label1.Text = "вывести не использованные типы банков"; namespace DataBase { comboBox1.Visible = false; comboBox2.Visible = false; public partial class Querys : Form } { else if (Query1 == "11") private NpgsqlConnection npgSqlConnection; { label1.Text = "количество клиентов в каждом городе"; NpgsqlCommand sqlCommand; DataTable dt; comboBox1.Visible = false; comboBox2.Visible = false; NpgsqlDataReader dataReader; } string connectionString = ""; else if (Query1 == "12") private string sql = ""; { label1.Text = "вывести общую стоимость и среднюю стоимость кредитов string Query1 = ""; string DisplayMember = ""; string ValueMember = ""; "; private string usersurname; comboBox2.Visible = false; comboBox1.Visible = false; private string userpassword; } public Querys(string Query, string usersurname, string userpassword) else if (Query1 == "13") { { label1.Text = "посчитать кол-во кредитов, выданных в указанном году"; Query1 = Query; comboBox2.Visible = false; comboBox1.Text = "Год"; this.usersurname = usersurname; this.userpassword = userpassword; } InitializeComponent(); else if (Query1 == "14") connectionString = "Server = localhost;" + "Port = 5432;" + "Database = { Песков;" + "User Id = postgres;" + "Password = postgres;"; if (Query1 == "1") label1.Text = "вывести кол-во клиентов, у которых есть такие буквы в имени"; { comboBox2.Visible = false; label1.Text = "вывести банки с указанным типом банка"; } comboBox2.Visible = false; else if (Query1 == "15") } { label1.Text = "без индекса (сколько клиентов в указанном городе)"; else if (Query1 == "2") { comboBox2.Visible = false; label1.Text = "вывести клиентов, в указанном городе"; } comboBox2.Visible = false; else if (Query1 == "16") } { label1.Text = "с индексом (сколько клиентов в указанном городе)"; else if (Query1 == "3") { comboBox2.Visible = false; label1.Text = "вывести банки, открытые в указанном году"; } comboBox1.Text = "Год"; comboBox2.Visible = false; else if (Query1 == "17") } { label1.Text = "вывести количество кредитов, которые ещё не выплатили"; else if (Query1 == "4") { comboBox2.Visible = false; comboBox1.Visible = false; label1.Text = "вывести кредиты, выданные за последние 2 года"; } comboBox1.Visible = false; comboBox2.Visible = false; else if (Query1 == "18") } { label1.Text = "вывести количество кредитов, заложенных в указанном году else if (Query1 == "5") и вид кредита"; { label1.Text = "вывести всю информацию о 100 кредитах, с наибольшей суммой"; comboBox2.Text = "Год"; } comboBox1.Visible = false; comboBox2.Visible = false; } else if (Query1 == "19") { label1.Text = "вывести среднюю цену кредита по виду кредита"; else if (Query1 == "6") { comboBox1.Visible = false; comboBox2.Visible = false; label1.Text = "вывести клиентов с сортировкой по городу"; } comboBox1.Visible = false; comboBox2.Visible = false; else if (Query1 == "20") } { label1.Text = "вывести из 2ух таблиц телефоны"; else if (Query1 == "7") { comboBox1.Visible = false; comboBox2.Visible = false; label1.Text = "вывести банк и его тип банка"; } comboBox1.Visible = false; comboBox2.Visible = false; else if (Query1 == "21") } { label1.Text = "вывести клиентов в указанном городе (2 штуки)"; else if (Query1 == "8") { } label1.Text = "вывести типы банков, которые не используются "; else if (Query1 == "22") comboBox1.Visible = false; comboBox2.Visible = false; { label1.Text = "вывести клиентов, которых нет в указанном городе (2 } else if (Query1 == "9") { штуки)"; } label1.Text = "вывести все банки и типы банков"; else if (Query1 == "23") 69 { } label1.Text = "вывести итог: закрыт кредит или нет"; else if (Query1 == "2") comboBox2.Visible = false; comboBox1.Visible = false; { } sql = "SELECT * FROM \"2\"('" + value + "')"; } } private void Loading_Combobox() else if (Query1 == "3") { { if (Query1 == "1" ) sql = "SELECT * FROM \"3\"(" + value + ")"; { } sql = "SELECT * FROM \"Type of bank\""; else if (Query1 == "4") DisplayMember = "type"; ValueMember = "id_type"; { } sql = "SELECT * FROM \"4\""; else if (Query1 == "2" || Query1 == "16" || Query1 == "15" || Query1 == "21" || Query1 == "22") } else if (Query1 == "5") { { sql = "SELECT * FROM \"City\"" ; sql = "SELECT * FROM \"5\""; DisplayMember = "city"; ValueMember = "id_city"; } } else if (Query1 == "6") else if (Query1 == "18") { { sql = "SELECT * FROM \"6\""; sql = "SELECT * FROM \"Type of credit\""; } DisplayMember = "type"; ValueMember = "id_type"; else if (Query1 == "7") } { } sql = "SELECT * FROM \"7\""; } private void Querys_Load(object sender, EventArgs e) else if (Query1 == "8") { { Loading_Combobox(); sql = "SELECT * FROM \"8\""; try } { else if (Query1 == "9") npgSqlConnection = new NpgsqlConnection(connectionString); { npgSqlConnection.Open(); sql = "SELECT * FROM \"9\""; sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); } else if (Query1 == "10") dataReader = sqlCommand.ExecuteReader(); { dt = new DataTable(); sql = "SELECT * FROM \"10\""; dt.Load(dataReader); } comboBox1.DataSource = dt; else if (Query1 == "11") comboBox1.DisplayMember = DisplayMember; { comboBox1.ValueMember = ValueMember; sql = "SELECT * FROM \"11\""; npgSqlConnection.Close(); } } else if (Query1 == "12") catch (Exception ex) { MessageBox.Show(ex.Message); { npgSqlConnection.Close(); } sql = "SELECT * FROM \"12\""; } if (Query1 == "21" || Query1 == "22") else if (Query1 == "13") { { try sql = "SELECT * FROM \"13\"(" + value + ")"; { } npgSqlConnection = new NpgsqlConnection(connectionString); else if (Query1 == "14") npgSqlConnection.Open(); { sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); sql = "SELECT * FROM \"14\"('" + value + "')"; } dataReader = sqlCommand.ExecuteReader(); else if (Query1 == "15") dt = new DataTable(); { dt.Load(dataReader); sql = "SELECT * FROM \"15\"('" + value + "')"; comboBox2.DataSource = dt; } comboBox2.DisplayMember = DisplayMember; else if (Query1 == "16") comboBox2.ValueMember = ValueMember; { npgSqlConnection.Close(); sql = "SELECT * FROM \"16\"(" + first + ")"; } catch } (Exception ex) { MessageBox.Show(ex.Message); npgSqlConnection.Close(); } else if (Query1 == "17") { } sql = "SELECT * FROM \"17\""; } } private void Loading_DataGridView() else if (Query1 == "18") { { if (Query1 == "1") { sql = "SELECT * FROM \"18\"('" + value + "', "+ comboBox2.Text + ")"; } sql = "SELECT * FROM \"1\"('" + value + "')"; else if (Query1 == "19") 70 { { sql = "SELECT * FROM \"19\""; workSheet.Rows[i].Columns[j] = dataGridView1.Rows[i - 1].Cells[j - } 1].Value; else if (Query1 == "20") } { } // Открываем созданный excel-файл sql = "SELECT * FROM \"20\""; } excelApp.Visible = true; else if (Query1 == "21") excelApp.UserControl = true; { } sql = "SELECT * FROM \"21\"('" + value + "', '" + comboBox2.Text + "')"; } } } Код файла Graphics.CS else if (Query1 == "22") { sql = "SELECT * FROM \"22\"('" + value + "', '" + comboBox2.Text + "')"; using Npgsql; } using System; else if (Query1 == "23") using System.Collections.Generic; { using System.ComponentModel; sql = "SELECT * FROM \"23\""; using System.Data; } using System.Drawing; } using System.Linq; string value = ""; string first = ""; using System.Text; private void button1_Click(object sender, EventArgs e) using System.Threading.Tasks; { using System.Windows.Forms; if (Query1 == "16") using System.Windows.Forms.DataVisualization.Charting; { first = comboBox1.SelectedValue.ToString(); namespace DataBase } { value = comboBox1.Text; public partial class Graphics : Form Loading_DataGridView(); { try private NpgsqlConnection npgSqlConnection; { NpgsqlCommand sqlCommand; if (npgSqlConnection != null && npgSqlConnection.State != DataTable dt; ConnectionState.Closed) NpgsqlDataReader dataReader; { string connectionString = ""; npgSqlConnection.Close(); List<string> city = new List<string> { }; List<string> value = new List<string> { }; } npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); List<string> family = new List<string> { }; List<string> count = new List<string> { }; public Graphics(string usersurname, string userpassword) { sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); InitializeComponent(); dataReader = sqlCommand.ExecuteReader(); this.usersurname = usersurname; dt = new DataTable(); dt.Load(dataReader); dataGridView1.DataSource = dt; dataGridView1.AutoResizeColumns(); this.userpassword = userpassword; firstGraph(); } private string usersurname; private string userpassword; void firstGraph() npgSqlConnection.Close(); } { try catch (Exception ex) { { connectionString = "Server = localhost;" + "Port = 5432;" + "Database = MessageBox.Show(ex.Message); Песков;" + "User Id = postgres;" + "Password = postgres;"; npgSqlConnection.Close(); npgSqlConnection = new NpgsqlConnection(connectionString); } npgSqlConnection.Open(); } sqlCommand = new NpgsqlCommand("SELECT \"Type of credit\".\"type\", Count(\"Credit\".id_credit) FROM \"Credit\" INNER JOIN \"Type of credit\" ON private void button2_Click(object sender, EventArgs e) { \"Credit\".id_type = \"Type of credit\".id_type GROUP BY \"Type of credit\".\"type\"", npgSqlConnection); // Создаём экземпляр нашего приложения dataReader = sqlCommand.ExecuteReader(); Excel.Application excelApp = new Excel.Application(); dt = new DataTable(); // Создаём экземпляр рабочий книги Excel dt.Load(dataReader); Excel.Workbook workBook; dataGridView1.DataSource = dt; // Создаём экземпляр листа Excel dataGridView1.AutoResizeColumns(); Excel.Worksheet workSheet; npgSqlConnection.Close(); workBook = excelApp.Workbooks.Add(); workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(1); } catch (Exception ex) { for (int i = 1; i < dataGridView1.RowCount + 1; i++) { MessageBox.Show(ex.Message); npgSqlConnection.Close(); for (int j = 1; j < dataGridView1.ColumnCount + 1; j++) 71 } public PictureBox PictureBox1 = new PictureBox(); foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.Cells[1].Value != null) CheckBox CheckBox1 = new CheckBox(); CheckBox CheckBox2 = new CheckBox(); public NumericUpDown YearBox = new NumericUpDown(); { family.Add(row.Cells[0].Value.ToString()); } } foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.Cells[1].Value != null) { count.Add(row.Cells[1].Value.ToString()); } } chart1.Titles.Add("Диаграмма количества кредитов по типу"); chart1.ChartAreas[0].AxisX.Title = "Тип кредита"; chart1.ChartAreas[0].AxisY.Title = "Количество кредитов"; } void BuildChart(string stroka, string stroka2) { chart1.Series[0].Points.AddXY(stroka, stroka2); } void build1() { for (int i = 0; i < family.Count; i++) chart1.Invoke(new Action<string, string>(BuildChart), family[i], count[i]); } private void Graphics_Load(object sender, EventArgs e) { build1(); } } } Код файла Add_information.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Npgsql; using System.IO; namespace DataBase { public partial class Add_information : Form { private NpgsqlConnection npgSqlConnection; NpgsqlCommand sqlCommand; DataTable dt; NpgsqlDataReader dataReader; string connectionString = ""; private string sql = ""; private string addsql1 = ""; string Name1 = ""; string id = ""; string first = ""; string second = ""; string third = ""; string fourth = ""; string fifth = ""; string sixth = ""; string seventh = ""; string eighth = ""; string ninth = ""; string ten = ""; //сделать его айдишником, чтобы не высвечивалось public TextBox ID = new TextBox(); public TextBox TextBox1 = new TextBox(); public TextBox TextBox2 = new TextBox(); public TextBox TextBox3 = new TextBox(); public TextBox TextBox4 = new TextBox(); public TextBox TextBox5 = new TextBox(); public TextBox TextBox6 = new TextBox(); Label Label1 = new Label(); Label Label2 = new Label(); Label Label3 = new Label(); Label Label4 = new Label(); Label Label5 = new Label(); Label Label6 = new Label(); Label Label7 = new Label(); Label Label8 = new Label(); Label Label9 = new Label(); Label Label10 = new Label(); Label Label11 = new Label(); public ComboBox ComboBox1 = new ComboBox(); public ComboBox ComboBox2 = new ComboBox(); public ComboBox ComboBox3 = new ComboBox(); public ComboBox ComboBox4 = new ComboBox(); public DateTimePicker DateTimePicker1 = new DateTimePicker(); public DateTimePicker DateTimePicker2 = new DateTimePicker(); Button Button2 = new Button(); string ideshka = ""; /// <summary> /// Это загрузка всего /// </summary> public Add_information(string Name, string id, string usersurname, string userpassword) { InitializeComponent(); Name1 = Name; ideshka = id; this.usersurname = usersurname; this.userpassword = userpassword; connectionString = "Server = localhost;" + "Port = 5432;" + "Database = Песков;" + "User Id = '" + usersurname + "';" + "Password = '" + userpassword + "';"; load_dataGridView(); } public Add_information(string Name, string id) { InitializeComponent(); Name1 = Name; ideshka = id; connectionString = "Server = localhost;" + "Port = 5432;" + "Database = Песков;" + "User Id = postgres;" + "Password = postgres;"; load_dataGridView(); } private string usersurname; private string userpassword; /// <summary> /// комманды и переменные для вставки в таблицу /// </summary> private void command_sql_insert() { if (Name1 == "тип банка") { if (TextBox1.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text; sql = "INSERT INTO \"Type of bank\"(type) VALUES('" + first + "');"; } } else if (Name1 == "вид кредита") { if (TextBox1.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text; sql = "INSERT INTO \"Type of credit\"(type) VALUES('" + first + "');"; } } else if (Name1 == "город") { if (TextBox1.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text; sql = "INSERT INTO \"City\"(city) VALUES('" + first + "');"; } } else if (Name1 == "банк") { if (TextBox1.Text == "" || ComboBox1.Text == "" || TextBox3.Text == "" || TextBox4.Text == "" || TextBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text; second = ComboBox1.SelectedValue.ToString(); third = TextBox2.Text; fourth = TextBox3.Text; fifth = TextBox4.Text; sql = "INSERT INTO \"Bank\"(name, id_type, year_open, charter_capital, phone) VALUES('" + first + "', " + second + ", '" + third + "', " + fourth + ", '" + fifth + "');"; } } else if (Name1 == "сотрудник") { if (TextBox1.Text == "" || ComboBox1.Text == "" || ComboBox2.Text == "" || TextBox2.Text == "") { 72 sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text;//логин second = ComboBox1.SelectedValue.ToString();//ломбард third = ComboBox2.Text;//роль(admin, employee) fourth = TextBox2.Text;//пароль if (third == "админ") { addsql1 = "CREATE ROLE \"" + first + "\" login PASSWORD '" + fourth + "'; GRANT \"admin_bank\" TO \"" + first + "\" WITH ADMIN OPTION;"; } else if (third == "сотрудник") { sql = "INSERT INTO \"Employee\"(login, id_bank) VALUES('" + first + "', " + second + ");"; addsql1 = "CREATE ROLE \"" + first + "\" login PASSWORD '" + fourth + "'; GRANT \"employee_bank\" TO \"" + first + "\" WITH ADMIN OPTION;"; } } } else if (Name1 == "клиент") { if (TextBox1.Text == "" || ComboBox1.Text == "" || TextBox3.Text == "" || TextBox2.Text == "" || TextBox4.Text == "" || TextBox5.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text; second = TextBox2.Text; third = TextBox3.Text; fourth = ComboBox1.SelectedValue.ToString(); fifth = TextBox4.Text; sixth = TextBox5.Text; sql = "INSERT INTO\"Klient\" (surname, name, patronymic, id_city, phone, account_number) VALUES('" + first + "', '" + second + "', '" + third + "', " + fourth + ", " + fifth + ", '" + sixth + "');"; } } else if (Name1 == "кредиты") { if (TextBox1.Text == "" || ComboBox1.Text == "" || ComboBox2.Text == "" || ComboBox3.Text == "" || TextBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = ComboBox1.SelectedValue.ToString(); second = ComboBox2.SelectedValue.ToString(); third = ComboBox3.SelectedValue.ToString(); fourth = TextBox1.Text; fifth = TextBox2.Text; sixth = DateTimePicker1.Value.ToShortDateString(); sql = "INSERT INTO \"Credit\"(id_bank, id_klient, id_type, credit_amount, annual_percentage, issue_date) VALUES(" + first + ", " + second + ", " + third + ", " + fourth + ", " + fifth + ", '" + sixth + "');"; } } else if (Name1 == "возврат кредита") { if (TextBox1.Text == "" || ComboBox1.Text == "" || ComboBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = ComboBox1.SelectedValue.ToString(); second = ComboBox2.SelectedValue.ToString(); third = TextBox1.Text; fourth = DateTimePicker1.Value.ToShortDateString(); sql = "INSERT INTO \"Repayment of a credit\"(id_credit, id_bank, sum, date) VALUES(" + first + ", " + second + ", " + third + ", '" + fourth + "');"; } } } /// <summary> /// комманды и переменные для изменения данных в таблице /// </summary> private void command_sql_update() { if (Name1 == "тип банка") { if (TextBox1.Text == "") { sql = "UPDATE \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = TextBox1.Text; sql = "INSERT INTO \"Type of bank\" SET (type) =('" + first + "') WHERE id_type='" + id + "';"; } } else if (Name1 == "вид кредита") { if (TextBox1.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = TextBox1.Text; sql = "UPDATE \"Type of credit\" SET (type) =('" + first + "') WHERE id_type='" + id + "';"; } } else if (Name1 == "город") { if (TextBox1.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = TextBox1.Text; sql = "UPDATE \"City\" SET (city) =('" + first + "') WHERE id_city='" + id + "';"; } } else if (Name1 == "банк") { if (TextBox1.Text == "" || ComboBox1.Text == "" || TextBox3.Text == "" || TextBox4.Text == "" || TextBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = TextBox1.Text; second = ComboBox1.SelectedValue.ToString(); third = TextBox2.Text; fourth = TextBox3.Text; fifth = TextBox4.Text; sql = "UPDATE \"Bank\" SET (name, id_type, year_open, charter_capital, phone) =('" + first + "', " + second + ", '" + third + "', " + fourth + ", '" + fifth + "' WHERE id_bank='" + id + "';"; } } else if (Name1 == "сотрудник") { if (TextBox1.Text == "" || ComboBox1.Text == "" || ComboBox2.Text == "" || TextBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { first = TextBox1.Text;//логин second = ComboBox1.SelectedValue.ToString();//ломбард third = ComboBox2.Text;//роль(admin, employee) fourth = TextBox2.Text;//пароль if (third == "админ") { addsql1 = "REVOKE \"admin_bank\" FROM \"" + first + "\"; REVOKE \"employee_bank\" FROM \"" + first + "\"; GRANT \"admin_bank\" TO \"" + first + "\" WITH ADMIN OPTION; ALTER ROLE \"" + first + "\" LOGIN PASSWORD '" + fourth + "'; "; } else if (third == "сотрудник") { sql = "UPDATE \"Employee\" SET (login, id_bank) =('" + first + "', " + second + ") WHERE login ='" + first + "';"; addsql1 = "REVOKE \"admin_bank\" FROM \"" + first + "\"; REVOKE \"employee_bank\" FROM \"" + first + "\"; GRANT \"employee_bank\" TO \"" + first + "\" WITH ADMIN OPTION; ALTER ROLE \"" + first + "\" LOGIN PASSWORD '" + fourth + "'; "; } } } else if (Name1 == "клиент") { if (TextBox1.Text == "" || ComboBox1.Text == "" || TextBox3.Text == "" || TextBox2.Text == "" || TextBox4.Text == "" || TextBox5.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = TextBox1.Text; second = TextBox2.Text; third = TextBox3.Text; fourth = ComboBox1.SelectedValue.ToString(); fifth = TextBox4.Text; sixth = TextBox5.Text; sql = "UPDATE\"Klient\" SET (surname, name, patronymic, id_city, phone, account_number) =('" + first + "', '" + second + "', '" + third + "', " + fourth + ", " + fifth + ", '" + sixth + "') WHERE id_klient='" + id + "';"; } } 73 else if (Name1 == "кредиты") { if (TextBox1.Text == "" || ComboBox1.Text == "" || ComboBox2.Text == "" || ComboBox3.Text == "" || TextBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = ComboBox1.SelectedValue.ToString(); second = ComboBox2.SelectedValue.ToString(); third = ComboBox3.SelectedValue.ToString(); fourth = TextBox1.Text; fifth = TextBox2.Text; sixth = DateTimePicker1.Value.ToShortDateString(); sql = "UPDATE \"Credit\" SET (id_bank, id_klient, id_type, credit_amount, annual_percentage, issue_date) =(" + first + ", " + second + ", " + third + ", " + fourth + ", " + fifth + ", '" + sixth + "') WHERE id_credit='" + id + "';"; } } else if (Name1 == "возврат кредита") { if (TextBox1.Text == "" || ComboBox1.Text == "" || ComboBox2.Text == "") { sql = "INSERT INTO \"Company name\"(company_name) VALUES(" + first + ")"; } else { id = ID.Text; first = ComboBox1.SelectedValue.ToString(); second = ComboBox2.SelectedValue.ToString(); third = TextBox1.Text; fourth = DateTimePicker1.Value.ToShortDateString(); sql = "UPDATE \"Repayment of a credit\" SET (id_credit, id_bank, sum, date) =(" + first + ", " + second + ", " + third + ", '" + fourth + "') WHERE id_repayment='" + id + "';"; } } } /// <summary> /// метод для определения элементов, которые необходимы для каждой таблицы /// </summary> private void load_dataGridView() { if (Name1 == "тип банка") { ClientSize = new Size(200, 120); MaximumSize = new Size(216, 158); MinimumSize = new Size(216, 158); button1.Location = new Point(12, 60); Label1.Location = new Point(45, 10); Label1.Size = new Size(150, 20); Label1.Text = "Тип банка"; Controls.Add(Label1); TextBox1.Location = new Point(25, 30); TextBox1.Size = new Size(150, 20); Controls.Add(TextBox1); } else if (Name1 == "вид кредита") { ClientSize = new Size(200, 120); MaximumSize = new Size(216, 158); MinimumSize = new Size(216, 158); button1.Location = new Point(12, 60); Label1.Location = new Point(45, 10); Label1.Size = new Size(150, 20); Label1.Text = "Вид кредита"; Controls.Add(Label1); TextBox1.Location = new Point(25, 30); TextBox1.Size = new Size(150, 20); Controls.Add(TextBox1); } else if (Name1 == "город") { ClientSize = new Size(200, 120); MaximumSize = new Size(216, 158); MinimumSize = new Size(216, 158); button1.Location = new Point(12, 60); Label1.Location = new Point(45, 10); Label1.Size = new Size(150, 20); Label1.Text = "Город"; Controls.Add(Label1); TextBox1.Location = new Point(25, 30); TextBox1.Size = new Size(150, 20); Controls.Add(TextBox1); } else if (Name1 == "сотрудник") { ClientSize = new Size(200, 259); MaximumSize = new Size(216, 287); MinimumSize = new Size(216, 287); button1.Location = new Point(15, 190); Label1.Location = new Point(60, 10); Label1.Size = new Size(130, 20); Label1.Text = "Где работает"; Controls.Add(Label1); ComboBox1.Location = new Point(35, 30); ComboBox1.Size = new Size(130, 18); ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox1); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * public.\"Bank\"", npgSqlConnection); FROM dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox1.DataSource = dt; ComboBox1.DisplayMember = "name"; ComboBox1.ValueMember = "id_bank"; npgSqlConnection.Close(); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox1.SelectedIndex = -1; { MessageBox.Show(ex.Message); Label2.Location = new Point(60, 53); Label2.Size = new Size(130, 20); Label2.Text = "Роль"; Controls.Add(Label2); ComboBox2.Location = new Point(35, 73); ComboBox2.Size = new Size(130, 18); ComboBox2.Items.AddRange(new string[] { "сотрудник", "админ" }); ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox2); ComboBox2.SelectedIndex = -1; Label3.Location = new Point(60, 96); Label3.Size = new Size(130, 20); Label3.Text = "Логин"; Controls.Add(Label3); TextBox1.Location = new Point(25, 116); TextBox1.Size = new Size(160, 20); Controls.Add(TextBox1); Label4.Location = new Point(60, 136); Label4.Size = new Size(130, 20); Label4.Text = "Пароль"; Controls.Add(Label4); TextBox2.Location = new Point(35, 156); TextBox2.Size = new Size(130, 20); Controls.Add(TextBox2); } else if (Name1 == "банк") { ClientSize = new Size(270, 239); MaximumSize = new Size(286, 267); MinimumSize = new Size(286, 267); button1.Location = new Point(45, 170); Label1.Location = new Point(25, 19); Label1.Size = new Size(120, 20); Label1.Text = "Название банка"; Controls.Add(Label1); TextBox1.Location = new Point(15, 39); TextBox1.Size = new Size(120, 18); Controls.Add(TextBox1); Label2.Location = new Point(140, 19); Label2.Size = new Size(130, 20); Label2.Text = "Тип банка"; Controls.Add(Label2); ComboBox1.Location = new Point(140, 39); ComboBox1.Size = new Size(120, 18); ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox1); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * FROM public.\"Type of bank\"", npgSqlConnection); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox1.DataSource = dt; ComboBox1.DisplayMember = "type"; ComboBox1.ValueMember = "id_type"; npgSqlConnection.Close(); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox1.SelectedIndex = -1; Label3.Location = new Point(25, 65); Label3.Size = new Size(100, 20); { MessageBox.Show(ex.Message); 74 Label3.Text = "Год создания"; Controls.Add(Label3); { ClientSize = new Size(200, 350); button1.Location = new Point(15, 285); TextBox2.Location = new Point(15, 85); TextBox2.Size = new Size(120, 20); Controls.Add(TextBox2); Label1.Location = new Point(60, 10); Label1.Size = new Size(100, 20); Label1.Text = "Банк"; Controls.Add(Label1); Label4.Location = new Point(140, 65); Label4.Size = new Size(100, 20); Label4.Text = "Уставной фонд"; Controls.Add(Label4); ComboBox1.Location = new Point(35, 30); ComboBox1.Size = new Size(130, 20); ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox1); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * public.\"Bank\"", npgSqlConnection); TextBox3.Location = new Point(140, 85); TextBox3.Size = new Size(120, 20); Controls.Add(TextBox3); Label5.Location = new Point(25, 107); Label5.Size = new Size(100, 20); Label5.Text = "Телефон"; Controls.Add(Label5); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox1.DataSource = dt; ComboBox1.DisplayMember = "name"; ComboBox1.ValueMember = "id_bank"; npgSqlConnection.Close(); TextBox4.Location = new Point(15, 127); TextBox4.Size = new Size(120, 20); Controls.Add(TextBox4); } else if (Name1 == "клиент") { ClientSize = new Size(200, 350); button1.Location = new Point(15, 280); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox1.SelectedIndex = -1; Label1.Location = new Point(60, 10); Label1.Size = new Size(100, 20); Label1.Text = "Фамилия"; Controls.Add(Label1); TextBox2.Location = new Point(35, 70); TextBox2.Size = new Size(130, 20); Controls.Add(TextBox2); Label3.Location = new Point(60, 90); Label3.Size = new Size(100, 20); Label3.Text = "Отчество"; Controls.Add(Label3); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox2.DataSource = dt; ComboBox2.DisplayMember = "ФИО"; ComboBox2.ValueMember = "id"; npgSqlConnection.Close(); TextBox3.Location = new Point(35, 110); TextBox3.Size = new Size(130, 20); Controls.Add(TextBox3); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox2.SelectedIndex = -1; Label4.Location = new Point(60, 130); Label4.Size = new Size(100, 20); Label4.Text = "Город"; Controls.Add(Label4); ComboBox1.Location = new Point(35, 150); ComboBox1.Size = new Size(130, 20); ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox1); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * FROM public.\"City\"", npgSqlConnection); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox1.DataSource = dt; ComboBox1.DisplayMember = "city"; ComboBox1.ValueMember = "id_city"; npgSqlConnection.Close(); Label5.Location = new Point(40, 175); Label5.Size = new Size(120, 20); Label5.Text = "Телефон"; Controls.Add(Label5); TextBox4.Location = new Point(35, 195); TextBox4.Size = new Size(130, 20); Controls.Add(TextBox4); Label6.Location = new Point(60, 215); Label6.Size = new Size(100, 20); Label6.Text = "Номер счёта"; Controls.Add(Label6); TextBox5.Location = new Point(35, 235); TextBox5.Size = new Size(130, 20); Controls.Add(TextBox5); } else if (Name1 == "кредиты") MessageBox.Show(ex.Message); ComboBox2.Location = new Point(5, 75); ComboBox2.Size = new Size(190, 18); ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox2); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT id_klient as \"id\", concat_ws(' ',surname,\"name\",patronymic) as \"ФИО\" FROM public.\"Klient\" ", npgSqlConnection); Label2.Location = new Point(60, 50); Label2.Size = new Size(100, 20); Label2.Text = "Имя"; Controls.Add(Label2); { { Label2.Location = new Point(60, 55); Label2.Size = new Size(100, 20); Label2.Text = "Клиент"; Controls.Add(Label2); TextBox1.Location = new Point(35, 30); TextBox1.Size = new Size(130, 20); Controls.Add(TextBox1); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox1.SelectedIndex = -1; FROM MessageBox.Show(ex.Message); { MessageBox.Show(ex.Message); Label3.Location = new Point(60, 100); Label3.Size = new Size(100, 20); Label3.Text = "Вид кредита"; Controls.Add(Label3); ComboBox3.Location = new Point(35, 120); ComboBox3.Size = new Size(130, 20); ComboBox3.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox3); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * FROM public.\"Type of credit\"", npgSqlConnection); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox3.DataSource = dt; ComboBox3.DisplayMember = "type"; ComboBox3.ValueMember = "id_type"; npgSqlConnection.Close(); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox3.SelectedIndex = -1; { Label4.Location = new Point(60, 145); Label4.Size = new Size(100, 20); Label4.Text = "Сумма"; Controls.Add(Label4); TextBox1.Location = new Point(35, 165); TextBox1.Size = new Size(130, 20); Controls.Add(TextBox1); Label5.Location = new Point(40, 185); Label5.Size = new Size(120, 20); Label5.Text = "Годовой процент"; Controls.Add(Label5); TextBox2.Location = new Point(35, 205); MessageBox.Show(ex.Message); 75 TextBox2.Size = new Size(130, 20); Controls.Add(TextBox2); { if (ID.Text == "") { command_sql_insert(); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand(addsql1, npgSqlConnection); sqlCommand.ExecuteNonQuery(); sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); sqlCommand.ExecuteNonQuery(); npgSqlConnection.Close(); MessageBox.Show("Добавленно"); } catch (Exception) { MessageBox.Show("Проверьте вводимые данные"); npgSqlConnection.Close(); } } else if (ID.Text != "") { command_sql_update(); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand(addsql1, npgSqlConnection); sqlCommand.ExecuteNonQuery(); sqlCommand = new NpgsqlCommand(sql, npgSqlConnection); sqlCommand.ExecuteNonQuery(); npgSqlConnection.Close(); MessageBox.Show("Измененно"); } catch (Exception) { MessageBox.Show("Проверьте вводимые данные"); npgSqlConnection.Close(); } } Label6.Location = new Point(60, 225); Label6.Size = new Size(100, 20); Label6.Text = "Дата выдачи"; Controls.Add(Label6); DateTimePicker1.Location = new Point(35, 245); DateTimePicker1.Size = new Size(130, 20); DateTimePicker1.Format = DateTimePickerFormat.Custom; DateTimePicker1.CustomFormat = " "; DateTimePicker1.ValueChanged += EventHandler(dateTimePicker3_ValueChanged); Controls.Add(DateTimePicker1); } else if (Name1 == "возврат кредита") { ClientSize = new Size(200, 260); button1.Location = new Point(15, 200); new Label1.Location = new Point(60, 10); Label1.Size = new Size(100, 20); Label1.Text = "Банк"; Controls.Add(Label1); ComboBox2.Location = new Point(35, 30); ComboBox2.Size = new Size(130, 20); ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox2); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * public.\"Bank\"", npgSqlConnection); FROM dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox2.DataSource = dt; ComboBox2.DisplayMember = "name"; ComboBox2.ValueMember = "id_bank"; npgSqlConnection.Close(); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox2.SelectedIndex = -1; { MessageBox.Show(ex.Message); Label2.Location = new Point(60, 50); Label2.Size = new Size(100, 20); Label2.Text = "Номер кредита"; Controls.Add(Label2); ComboBox1.Location = new Point(35, 70); ComboBox1.Size = new Size(100, 18); ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList; Controls.Add(ComboBox1); try { npgSqlConnection = new NpgsqlConnection(connectionString); npgSqlConnection.Open(); sqlCommand = new NpgsqlCommand("SELECT * FROM public.\"Credit\" ", npgSqlConnection); dataReader = sqlCommand.ExecuteReader(); dt = new DataTable(); dt.Load(dataReader); ComboBox1.DataSource = dt; ComboBox1.DisplayMember = "id_credit"; ComboBox1.ValueMember = "id_credit"; npgSqlConnection.Close(); } catch (Exception ex) npgSqlConnection.Close(); } ComboBox1.SelectedIndex = -1; { MessageBox.Show(ex.Message); Label3.Location = new Point(60, 90); Label3.Size = new Size(100, 20); Label3.Text = "Сумма"; Controls.Add(Label3); TextBox1.Location = new Point(35, 110); TextBox1.Size = new Size(130, 20); Controls.Add(TextBox1); Label4.Location = new Point(60, 130); Label4.Size = new Size(100, 20); Label4.Text = "Дата возврата"; Controls.Add(Label4); DateTimePicker1.Location = new Point(35, 150); DateTimePicker1.Size = new Size(130, 20); DateTimePicker1.Format = DateTimePickerFormat.Custom; DateTimePicker1.CustomFormat = " "; DateTimePicker1.ValueChanged += EventHandler(dateTimePicker3_ValueChanged); Controls.Add(DateTimePicker1); } } /// <summary> /// Метод вставки значений в БД /// </summary> private void button1_Click(object sender, EventArgs e) new } void TextBox1KeyPress(object sender, KeyPressEventArgs e) { if (!(Char.IsDigit(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Delete)) { e.Handled = true; } } private void dateTimePicker3_ValueChanged(object sender, EventArgs e) { DateTimePicker1.Format = DateTimePickerFormat.Short; DateTimePicker2.Format = DateTimePickerFormat.Short; } } } 76 ПРИЛОЖЕНИЕ Д РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ При запуске программы запускается окно авторизации. Если ввести правильные данные авторизации, программа пропустит пользователя в окно с таблицами. Для того, чтобы удалить запись в таблице, необходимо выбрать её(нажать, чтобы она стала выделенной) и нажать на клавиатуре кнопку «Delete», если же вы хотите удалить группу записей необходимо зажать «Ctrl» и нажать на записи( чтобы они стали выделенными), а после нажать на клавиатуре кнопку «Delete». Если нажатие на кнопку «Delete» было ошибочно, то сперва у Вас спросят: “Вы действительно хотите удалить запись?”, если нажмёте «Да», то записи удалятся, «Нет» - удаление не произойдёт. Для того, чтобы добавить запись в таблицу, необходимо нажать на кнопку «Добавить запись». В новом окне заполнить все данные. Если формат данных будет соблюден, запись добавится в базу данных. Для того, чтобы редактировать запись в таблице, необходимо выбрать ее в таблице, нажать на ячейку в нужной колонке два раза и ввести данные. Для поиска, на основной форме необходимо ввести в поле текст и поиск произведётся автоматически. Для отображения графика, нужно нажать на меню «Графики», которое находится вверху главной формы. Для того, чтобы экспортировать результат запроса в Excel, необходимо зайти на форму с запросами и нажать «Экспортировать в Excel» и выбрать путь сохранения файла. Для просмотра графиков в окне с запросами необходимо в самом низу нажать на кнопку с графиками. 77 ПРИЛОЖЕНИЕ Ж РУКОВОДСТВО АДМИНИСТРАТОРА При запуске программы запускается окно авторизации. Если ввести правильные данные авторизации, программа пропустит пользователя в окно с таблицами. Для того, чтобы удалить запись в таблице, необходимо выбрать её(нажать, чтобы она стала выделенной) и нажать на клавиатуре кнопку «Delete», если же вы хотите удалить группу записей необходимо зажать «Ctrl» и нажать на записи( чтобы они стали выделенными), а после нажать на клавиатуре кнопку «Delete». Если нажатие на кнопку «Delete» было ошибочно, то сперва у Вас спросят: “Вы действительно хотите удалить запись?”, если нажмёте «Да», то записи удалятся, «Нет» - удаление не произойдёт. Для того, чтобы добавить запись в таблицу, необходимо нажать на кнопку «Добавить запись». В новом окне заполнить все данные. Если формат данных будет соблюден, запись добавится в базу данных. Для того, чтобы редактировать запись в таблице, необходимо выбрать ее в таблице, нажать на ячейку в нужной колонке два раза и ввести данные. Для поиска, на основной форме необходимо ввести в поле текст и поиск произведётся автоматически. Для того, чтобы экспортировать результат запроса в Excel, необходимо зайти на форму с запросами и нажать «Экспортировать в Excel» и выбрать путь сохранения файла.