Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П.КОРОЛЕВА (национальный исследовательский университет) Факультет информатики Кафедра информационных систем и технологий ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту по курсу «Проектирование баз данных» на тему “База данных «Статистика о предприятиях района»” Вариант №24 Выполнила: студентка гр.651 Телегина Д.Д. Руководитель проекта: доц. Чигарина Е.И. Самара 2011 РЕФЕРАТ Курсовой проект Пояснительная записка:28 с., 14 рис., 2 источника, 2 приложения ПРЕДПРИЯТИЕ, ОРГАНИЗАЦИЯ, ПРОДУКТ, ПОСТАВКИ, СЫРЬЕ, ОТРАСЛЬ, ФОРМА СОБСТВЕННОСТИ, БАЗА ДАННЫХ В курсовом проекте разработана программная система «Статистика о предприятиях района», которая позволяет хранить данные о предприятиях : персонале, организацияхпоставщиках, организациях-потребителях, занимаемой площади, выпускаемых продуктах и покупаемом сырье. Также предусмотрена возможность ведения справочников типов площадей, форм собственности, типов организаций, типов продукции, типов отраслей. Программа написана на языке J2SE в среде Intellij IDEA 10.0 с применением технологии JDBC. База данных системы реализована под управлением СУБД Oracle 10g. 2 СОДЕРЖАНИЕ РЕФЕРАТ .......................................................................................................................................2 СОДЕРЖАНИЕ..............................................................................................................................3 1 ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ................................................................................4 2 ОПИСАНИЕ ЛОГИЧЕСКОЙ МОДЕЛИ ДАННЫХ ...............................................................5 3 НОРМАЛИЗАЦИЯ БАЗЫ ДАННЫХ ......................................................................................8 4 ВЫБОР СРЕДСТВ РЕАЛИЗАЦИИ ........................................................................................10 5 ОПИСАНИЕ ФИЗИЧЕСКОЙ МОДЕЛИ ДАННЫХ .............................................................11 5.1 Физическая модель данных ...............................................................................................11 5.2 Ограничения целостности..................................................................................................13 6 ОПИСАНИЕ ИНТЕРФЕЙСА ПРОГРАММЫ .......................................................................14 7 ОПИСАНИЕ ОСНОВНЫХ МОДУЛЕЙ ПРОГРАММЫ .....................................................19 8 ТЕКСТ ЗАПРОСОВ .................................................................................................................19 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ..................................................................22 ПРИЛОЖЕНИЕ A .......................................................................................................................23 3 1 ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ Исходные данные: Cтатистическое управление района хранит информацию о каждом предприятии – регистрационный номер, тип отрасли (сельское хозяйство, транспорт, лёгкая, тяжёлая промышленность, строительство, материально-техническое снабжение), наименование, адрес, телефон, факс, форма собственности (государственно-федеральная, муниципально-городская, тоо, частная, акционерная), кол-во работающих (всего, мужчин, женщин, ИТР, рабочих), общая площадь, площадь помещений (занятая, свободная), площадь участка под возможное строительство. Каждое предприятие может иметь несколько поставщиков сырья и комплектующих, (которые делятся на местных и внешних, которые в свою очередь делятся на РФ, СНГ и зарубежных), может изготавливать несколько видов продукции с указанием его наименования и ежемесячного объёма выпуска, может иметь несколько потребителей продукции (деление такое же) на различные виды продукции Реализовать запросы к базе данных: 1. Выдать в виде отчета все сведения о конкретном предприятии. 2. Выдать информацию обо всех поставщиках сырья предприятий указанной категории. 3. Вывести сведения обо всех предприятиях, выпускающих продукцию указанного вида. 4. Сформировать сводный отчет с группировкой по типу отрасли, по форме собственности, указав количество предприятий, число работающих. Постановка задачи: По описанию предметной области построить логическую модель базы данных по методологии IDEF1X. Построить физическую модель. По физической модели сгенерировать схему базы данных. Создать приложение для доступа к данным. Обеспечить удобные для пользователя средства ведения базы данных (добавление, удаление, модификация данных), просмотра, защиту информации от несанкционированного доступа, логическую целостность данных. 4 2 ОПИСАНИЕ ЛОГИЧЕСКОЙ МОДЕЛИ ДАННЫХ Для хранения данных в проектируемой системе будет использоваться реляционная база данных. База данных – структурированный организованный набор данных, описывающих характеристики какой-либо физической или виртуальной системы. В реляционных базах данных все данные представлены в виде простых таблиц, разбитых на строки и столбцы, на пересечении которых расположены данные; запросы к таким таблицам возвращают таблицы, которые сами могут становиться предметом дальнейших запросов. Общепринятым стандартом языка работы с реляционными базами данных является язык SQL, который позволяет делать запрос на выдачу информации, объединённой по любому принципу. Логическая модель данных будет построена по методологии IDEF1X. Рассмотрим основные понятия используемой методологии. Сущность (entity) – это «предмет», который может быть идентифицирован некоторым способом, отличающим его от других «предметов» (определение Питера Чена). Каждая сущность обладает набором атрибутов. Атрибут – отдельная характеристика сущности. Сущность состоит из экземпляров, каждый из которых должен отличаться от другого экземпляра. Связь (relationship) – это логическая ассоциация, устанавливаемая между сущностями, которая представляет бизнес-правило или ограничение. Связи отображаются как линии между сущностями. В зависимости от роли в связи сущность может быть родительской или дочерней. В методике IDEF1X у дочерней сущности на связи присутствует точка. Мощность связи обозначается буквами P (1 или N экземпляров сущностей) или Z (0 или 1 экземпляров сущностей), если мощность не указана, то подразумевается от 0 до N экземпляров сущностей. В модели по методологии IDEF1X нельзя использовать связи между сущностями типа N:M, поэтому необходимо разбиение на две связи (обязательно идентифицирующие) и введение дополнительной сущности. Существует два типа сущностей: зависимая сущность. Для определения экземпляра такой сущности необходимо сослаться на экземпляр независимой сущности, с которой связана зависимая сущность; независимая сущность. Для определения экземпляра сущности нет необходимости ссылаться на другие сущности. Для создания логической модели данных, рассмотрим предметную область. Нам понадобятся следующие сущности: 5 Предприятие (имеет регистрационный номер предприятия, наименование, адрес, телефон, факс, тип отрасли и форму собственности); Персонал (идентификатор списка персонала, регистрационный номер предприятия, число женщин, мужчин, ИТР, рабочих и общее число сотрудников ); Форма собственности (идентификатор формы собственности, наименование); Тип отрасли (идентификатор типа отрасли, наименование); Тип внешней организации (идентификатор типа, наименование); Продукция -Сырье (идентификатор типа продукции, наименование); Тип площади (идентификатор типа площади, наименование); Организация (идентификатор организации, наименование организации, адрес организации); Внешняя организация (идентификатор организации, идентификатор типа организации); Местная организация (идентификатор организации); Тип внешней организации (идентификатор типа внешней организации, наименование типа организации); Площадь (идентификатор площади, номер предприятия, размер площади, идентификатор типа площади); Предприятие/Продукция-Сырье (регистрационный номер предприятия , идентификатор продукции-сырья, идентификатор продукции, ежемесячный объем выпуска, идентификатор организации, месяц, год, тип материала); Логическая модель базы данных разработана с помощью Erwin Data Modeler. Представлена на рисунке 1. Между сущностями установлены связи: Предприятие - Организация. Идентифицирующая связь, т.к. сущности, между которыми она проводится, являются зависимыми. Мощность связи M:N, т.к. предприятие может работать с ни одной, одной или несколькими организациями, а организация может быть поставщиком и/или потребителем для нескольких предприятий; Предприятие - Отрасль. Не идентифицирующая связь, т.к. сущности, между которыми она проводится, являются независимыми. Мощность связи 1:N, т.к. предприятие должно обязательно относится к одному типу отрасли, а отрасль может относится к ни одному, одному или нескольким предприятиями; 6 Рисунок 1 – Логическая модель данных Предприятие – Форма собственности. Не идентифицирующая связь, т.к. сущности, между которыми она проводится, являются независимыми. Мощность связи 1:N, т.к. предприятие должно обязательно относится к одной форме собственности, форма собственности может относится к ни одному, одному или нескольким предприятиями; Предприятие – Площадь. Идентифицирующая связь, т.к. сущности, между которыми она проводится, являются зависимыми. Мощность связи 1:1, т.к. предприятие должно обязательно иметь площадь, хотя бы вида «Общая площадь», а площади обязательно должны относиться к предприятию; Предприятие - Персонал. Идентифицирующая связь, т.к. сущности, между которыми она проводится, являются зависимыми. Мощность связи 1:1, т.к. предприятие должно обязательно иметь список сотрудников, а список сотрудников обязательно должен относиться к предприятию. 3 НОРМАЛИЗАЦИЯ БАЗЫ ДАННЫХ В ходе курсового проектирования был проведен анализ отношений базы данных на нормальные формы. Отношения «Форма собственности», «Тип отрасли», «Тип площади», «Продукция/Сырье», «Внешняя организация», «Тип внешней организации», «Местная организация» находятся в первой нормальной форме, т.к. все значения полей данных отношений определены (не null) и атомарны (не являются списком, группой или множеством значений). Отношения «Форма собственности», «Тип отрасли», «Тип площади», «Продукция/Сырье», «Внешняя организация», «Тип внешней организации» , «Местная организация» находятся во второй нормальной форме, потому что они находятся в первой нормальной форме и в них отсутствуют частичные функциональные зависимости атрибутов, не входящих в ключ, от ключа, т.к. в отношениях нет составных ключей. Отношения «Форма собственности», «Тип отрасли», «Тип площади», «Продукция/Сырье», «Внешняя организация», «Тип внешней организации», «Местная организация» находятся в третьей нормальной форме, потому что они находятся во второй нормальной форме и в них отсутствуют транзитивные функциональные зависимости атрибутов, не входящих в ключ, от ключа. Это легко доказывается, т.к. в данных отношениях меньше трех атрибутов, наличие которых необходимо для возникновения транзитивных функциональных зависимостей. Отношения «Предприятие-Организация» и «Организация поставщик/потребитель» находятся в первой нормальной форме, т.к. все значения полей данных отношений определены (не null) и атомарны (не являются списком, группой или множеством значений). Отношения «Предприятие-Организация» и «Организация поставщик/потребитель» находятся во второй нормальной форме, потому что они находятся в первой нормальной форме и в них отсутствуют частичные функциональные зависимости атрибутов, не входящих в ключ, от ключа. В отношении «Организация поставщик/потребитель» нет составного ключа, в отношении «Предприятие-Организация» не ключевой атрибут «тип организации» не зависит от частей ключа. Отношения «Предприятие-Организация» и «Организация поставщик/потребитель» находятся в третьей нормальной форме, потому что они находятся во второй нормальной форме и в них отсутствуют транзитивные функциональные зависимости атрибутов, не входящих в ключ, от ключа. В отношении «Предприятие-Организация» не ключевой атрибут один, а в отношении «Организация поставщик/потребитель» реквизиты организации не зависят от наименования организации, и наоборот. Отношения «Площадь» и «Предприятие/Продукция-Сырье» находятся в первой нормальной форме, т.к. все значения полей данных отношений определены (не null) и атомарны (не являются списком, группой или множеством значений). Отношения «Площадь» и «Предприятие/Продукция-Сырье» находятся во второй нормальной форме, потому что они находятся в первой нормальной форме и в них отсутствуют частичные функциональные зависимости атрибутов, не входящих в ключ, от ключа, т.к. не ключевые атрибуты не зависят от частей ключа. Отношение «Персонал» находится в третьей нормальной форме, т.к. оно находится во второй нормальной форме и в нем отсутствуют транзитивные функциональные зависимости атрибутов, не входящих в ключ, от ключа. Значения атрибутов «число женщин», «число мужчин», «число итр», «число рабочих», «общее число» не зависят друг от друга. Каждый из них не зависит от идентификатора списка персонала и регистрационного номера предприятия по отдельности. Отношение «Предприятие/Продукция-Сырье» находится в третьей нормальной форме, т.к. оно находится во второй нормальной форме и в нем отсутствуют транзитивные функциональные зависимости атрибутов, не входящих в ключ, от ключа. Значения атрибутов «объем выпуска», «месяц», «год», «идентификатор организации» не зависят друг от друга, и каждый из них не зависит от регистрационного номера предприятия и от идентификатора продукции по отдельности. 9 Отношения «Персонал», «Предприятие» находится в первой нормальной форме, , т.к. все значения полей данных отношений определены (не null) и атомарны (не являются списком, группой или множеством значений). Отношения «Персонал», «Предприятие» находятся во второй нормальной форме, потому что они находятся в первой нормальной форме и в них отсутствуют частичные функциональные зависимости атрибутов, не входящих в ключ, от ключа, т.к. не ключевые атрибуты не зависят от частей ключа. Отношения «Персонал», «Предприятие» находятся в третьей нормальной форме, т.к. они находятся во второй нормальной форме и в них отсутствуют транзитивные функциональные зависимости атрибутов, не входящих в ключ, от ключа. Таким образом, все отношения базы данных нормализованы (находятся в третьей нормальной форме). 4 ВЫБОР СРЕДСТВ РЕАЛИЗАЦИИ Для проектирования и работы с базой данных необходимо выбрать СУБД. При выборе учитывается, что база данных статистики предприятий может быть установлена как на локальном компьютере, так и на удаленном сервере. Данный курсовой проект не является web-приложением. СУБД должна надежно обеспечивать целостность данных, хранение сравнительно большого количества информации (планируется использовать данную программу для ведения статистики о многих предприятиях и организациях). В настоящее время на рынке программных продуктов существует большое количество различных СУБД, имеющих разные возможности, назначение, стоимость. К наиболее распространенным СУБД относятся SQL Server, MS SQL, Oracle. В качестве целевой СУБД была выбрана Oracle, т.к. она полностью отвечает требованиям к функциональности курсового проекта и версия Oracle XE является свободно распространяемой. К достоинствам СУБД Oracle Database относится то, что она обеспечивает рекордные показатели производительности и масштабируемости при работе на серверах под управлением Windows, Linux и UNIX, улучшенные характеристики за счет автоматизации задач администрирования и обеспечения лучших в отрасли возможностей по безопасности и соответствию нормативно-правовым актам в области защиты информации. 10 5 ОПИСАНИЕ ФИЗИЧЕСКОЙ МОДЕЛИ ДАННЫХ 5.1 Физическая модель данных Перейдем от логической модели данных к физической. Физическая модель базы данных также была разработана с помощью Erwin Data Modeler. По физической модели будем генерировать схему базы данных в СУБД Oracle. На основании полученной после нормализации схемы отношений с учетом особенности реализации и типа полей была получена структура таблиц базы данных: Predpr (predpr_id, predpr_name, address, phone, fax, otrasl_id, id_form); Personal (id_employee_list, predpr_id, women_count, men_count, itr_count, workers_count, all_count); FormSobstv (id_form, name_form); OtraslType (otrasl_id, otrasl_name); Production_Material (product_id, product_name); SquareType (square_type_id, square_type_name); Organization (org_id, org_name, org_info); OuterOrganization (org_id, outer_org_type_id); InnerOrganization (org_id); TypeOuterOrganization (outer_org_type_id, name_outer_org_type); Square (square_id, predpr_id, square_size, square_type_id); Предприятие/Продукция-Сырье (predpr_id, id, product_id, amount,org_id, month_num, year_num, product_type); 11 Рисунок 2 – Физическая модель данных 5.2 Ограничения целостности После анализа предметной области «Статистика предприятий» и построения модели базы данных были добавлены следующие ограничения целостности (помимо первичных и внешних ключей): 1. Строковые значения (например, «Наименование предприятия», «Адрес, «Наименование формы собственности» и др.) были ограничены по длине 50 символами. Запрещены следующие символы: : «^», «/», «?», «!», «?», «.», «,». 2. Числовые значения «месяц» - от 1 до 12. При вводе чисел запрещены символы. 3. Запрещены одинаковые значения в справочниках, а также при ведении оперативных данных (названия предприятий и организаций уникальны). 4. В таблице «Персонал» учитывается, что сумма женщин и мужчин на предприятии равна общему числу работников. Список персонала для каждого предприятия один. 5. В таблице «Площадь» учитывается, что сумма значений для каждого типа площади на предприятии не должна превышать значение общей площади. У каждой сущности есть первичные ключи (Primary key) для поддержания ссылочной целостности данных. Они обеспечивают уникальность данных. Также для поддержания ссылочной целостности и связи таблиц введены внешние ключи (Foreign key). FORMSOBSTV (PRIMARY KEY id_form NUMBER not null, name_form NUMBER not null, org_name VARCHAR2(90) not null); ORGANIZATION(PRIMARY KEY org_id VARCHAR2(50) not null); INNERORGANIZATION (PRIMARY KEY org_id NUMBER not null, IS_A2 foreign key (ORG_ID) references ORGANIZATION (ORG_ID) on delete cascade); TYPEOUTERORGANIZATION (PRIMARY KEY outer_org_type_id NUMBER not null, name_foreign_organization_type VARCHAR2(50)); OUTERORGANIZATION(PRIMARY KEY org_id NUMBER not null, outer_org_type_id NUMBER, IS_A foreign key (ORG_ID) delete cascade, R_20 foreign references ORGANIZATION (ORG_ID) on key (OUTER_ORG_TYPE_ID) references TYPEOUTERORGANIZATION (OUTER_ORG_TYPE_ID) on delete set null); TYPEOTRASL (PRIMARY KEY otrasl_id VARCHAR2(90) not null); NUMBER not null, otrasl_name PREDPR (PRIMARY KEY predpr_id NUMBER not null, predpr_name VARCHAR2(90) not null, otrasl_id NUMBER not null, id_form NUMBER not null, R_6 foreign key (OTRASL_ID) references TYPEOTRASL (OTRASL_ID), R_8 foreign key (ID_FORM) references FORMSOBSTV (ID_FORM)); PERSONAL(PRIMARY KEY personal_id NUMBER not null, PRIMARY KEY predpr_id NUMBER not null, constraint R_21 foreign key (PREDPR_ID) references PREDPR (PREDPR_ID) on delete cascade); PREDPR_ORGANIZATION( org_type VARCHAR2(90) not null, predpr_id NUMBER not null, PRIMARY KEY org_id PRIMARY KEY NUMBER not null, K_PREDPR_ORGANIZATION1 foreign key (ORG_ID) references ORGANIZATION (ORG_ID) on delete cascade, foreign key (PREDPR_ID) references PREDPR (PREDPR_ID) on delete cascade); PRODUCTION_MATERIAL (PRIMARY KEY product_id NUMBER not null) PREDPR_PRODUCTION_MATERIAL(type_product NUMBER(2) not null, PRIMARY KEY id NUMBER(38) not null, PRIMARY KEY predpr_id NUMBER not null, FK_PREDPR_PRODUCTION_MATERIAL2 foreign key (PRODUCT_ID), references PRODUCTION_MATERIAL (PRODUCT_ID) on delete cascade, R_27 foreign key (ORG_ID) references ORGANIZATION (ORG_ID) on delete set null, R_28 foreign key (PREDPR_ID) references PREDPR (PREDPR_ID) on delete cascade); SQUARETYPE (PRIMARY KEY square_type_id NUMBER not null); SQUARE(PRIMARY KEY square_id NUMBER not null, PRIMARY KEY predpr_id NUMBER not null, FK_SQUARE_PREDPR foreign key (PREDPR_ID) references PREDPR (PREDPR_ID) on delete cascade, R_35 foreign key (SQUARE_TYPE_ID) references SQUARETYPE (SQUARE_TYPE_ID) on delete cascade); 6 ОПИСАНИЕ ИНТЕРФЕЙСА ПРОГРАММЫ После запуска на экране появляется главная форма приложения, которая представлена на рисунке 3. 14 Рисунок 3 – Главная форма На главной форме есть следующие пункты меню: 1. Статистика 2. Справочники 3. Запросы 4. Отчеты 5. Справка При выборе пункта меню «Статистика» (рисунок 4) отображаются пункты подменю для просмотра и редактирования оперативных данных: «Предприятия» (рисунок 5), «Персонал» (рисунок 6), «Площадь» (рисунок 7), «Поставщики» (рисунок 8), «Потребители»(рисунок 5), «Продукт» (рисунок 9), «Сырье». Когда выбирается предприятие в списке зарегистрированных предприятий, становятся доступными остальные пункты подменю с данными для этого предприятия. Данные можно добавлять, удалять и редактировать, для чего на каждой форме есть соответствующие кнопки. Рисунок 4 – Форма ведения статистики предприятий 15 Рисунок 5 – Форма ведения данных об организациях-потребителях Рисунок 6 – Форма ведения данных о персонале предприятия Рисунок 7 – Форма ведения данных о площади предприятия 16 Рисунок 8 – Форма ведения данных о поставщиках предприятия Рисунок 9 – Форма ведения данных о продуктах предприятия При выборе пункта меню «Справочники» (рисунок 10) отображаются кнопки для ведения данных справочников, например справочника «Тип продукции» (рисунок 11). Рисунок 10 – Форма ведения данных справочников 17 Рисунок 11 – Форма ведения данных справочника «Тип продукции» При выборе пункта меню «Запросы» (рисунок 12) отображаются кнопки для отображения данных по запросам пользователя. Рисунок 12 – Форма для запросов При выборе пункта меню «Отчеты» (рисунок 13) отображаются кнопки для генерации отчетов (типа «.docx»). Рисунок 13 – Форма для отчетов При выборе пункта меню «Справка» (рисунок 14) отображается информация о техническом задании к курсовому проекту, а также о разработчике. 18 Рисунок 14 – Форма отображения справки 7 ОПИСАНИЕ ОСНОВНЫХ МОДУЛЕЙ ПРОГРАММЫ Программа составлена из нескольких модулей: 1. Database - в данном модуле осуществляется доступ к базе данных. Классы: OracleConnector.java Settings.java 2. Dao – содержит классы, в которых осуществляется редактирование, добавление и удаление данных из справочников(FormSobstvDAO.java), оперативных данных (PredprDAO.java и т.д.) 3. Model – содержит классы, отображающие основные сущности (Catalog.java, Personal.java и т.д.) 4. Util – содержит вспомогательные классы (Constants.java, Converter.java и т.д.). 5. View – содержит формы для отображения данных (MainDialog.java, FAddOrg.java, FAddPredpr.java) 6. Connection.properties. 8 ТЕКСТ ЗАПРОСОВ 1. Выдать в виде отчета все сведения о конкретном предприятии. select all_info.predpr_id, all_info.predpr_name, all_info.address, all_info.phone, all_info.fax,all_info.otrasl_name,all_info.name_form from (select pr.predpr_id as predpr_id, pr.predpr_name as predpr_name, pr.address as address, pr.phone as phone, pr.fax as fax, pr.otrasl_name as otrasl_name, f.name_form as name_form from FormSobstv f, Predpr predp, ( select p.predpr_id predpr_id, p.predpr_name predpr_name, p.address address, p.phone phone, p.fax fax, o.otrasl_name otrasl_name from predpr p 19 left join TypeOtrasl o on p.otrasl_id = o.otrasl_id where p.predpr_id = $P{pr_id}/*?pr.predpr_id */ )pr where predp.predpr_id = $P{pr_id}/*?pr.predpr_id */ and f.id_form = predp.id_form )all_info order by all_info.predpr_id; select pers.women_count as womencount, pers.men_count as mencount, pers.itr_count as itrcount, pers.workers_count as workerscount, pers.all_count as allcount from Personal pers join Predpr p on pers.predpr_id = p.predpr_id where p.predpr_id = $P{pr_id}/*?predpr_id?*/ select o.org_id as postav_org_id, o.org_name as postav_org_name, o.org_info as postav_org_info, too.name_foreign_organization_type as postav_type from Organization o join PREDPR_ORGANIZATION po on po.org_id = o.org_id join OuterOrganization oo on o.org_id = oo.org_id join TypeOuterOrganization too on oo.OUTER_ORG_TYPE_ID = too.OUTER_ORG_TYPE_ID where po.predpr_id = $P{pr_id}/*?predpr_id?*/ and (po.org_type = 0 or po.org_type = 2) select o.org_id as potreb_org_id, o.org_name as potreb_org_name, o.org_info as potreb_org_info, too.name_foreign_organization_type as potreb_type from Organization o join PREDPR_ORGANIZATION po on po.org_id = o.org_id join OuterOrganization oo on o.org_id = oo.org_id join TypeOuterOrganization too on oo.OUTER_ORG_TYPE_ID = too.OUTER_ORG_TYPE_ID where po.predpr_id = $P{pr_id} /*?predpr_id?*/ and (po.org_type = 1 or po.org_type = 2) select s.square_size, s.square_type_id, st.square_type_name from Square s join SquareType st on s.square_type_id = st.square_type_id where predpr_id = $P{pr_id}/*?predpr_id?*/ 2. Выдать информацию обо всех поставщиках сырья предприятий указанной категории. select o.org_id, o.org_name, o.org_info, too.name_foreign_organization_type as type_name,p.predpr_name from Organization o join PREDPR_ORGANIZATION po on po.org_id = o.org_id join Predpr p on p.predpr_id = po.predpr_id join OuterOrganization oo on o.org_id = oo.org_id join TypeOuterOrganization too on oo.OUTER_ORG_TYPE_ID = too.OUTER_ORG_TYPE_ID where too.OUTER_ORG_TYPE_ID = ? /*?*/ and (po.org_type = 0 or po.org_type = 2) 3. Вывести сведения обо всех предприятиях, выпускающих продукцию указанного вида. select distinct pr.predpr_id predpr_id, pr.predpr_name predpr_name, pr.address address, pr.phone phone, pr.fax fax, tot.otrasl_name, f.name_form from FormSobstv f, Predpr pr join Predpr_Production_Material ppm on pr.predpr_id = ppm.predpr_id join Production_Material pm on ppm.product_id = pm.product_id join Organization o on o.org_id = ppm.org_id left join TypeOtrasl tot on pr.otrasl_id = tot.otrasl_id where ppm.type_product = 0 and pm.product_id = ? and f.id_form = pr.id_form 20 4. Сформировать сводный отчет с группировкой по типу отрасли, по форме собственности, указав количество предприятий, число работающих, размер площадей. select ot.otrasl_name as otrasl, NVL(f.name_form, '-') as form, count(p.predpr_id) as predprcount /*количество предприятий*/, sum(pers.all_count) as allcount/*число работающих*/ from Predpr p full join Typeotrasl ot on ot.otrasl_id = p.otrasl_id full join Personal pers on pers.predpr_id = p.predpr_id left join Formsobstv f on f.id_form = p.id_form group by ot.otrasl_name, f.name_form order by ot.otrasl_name, f.name_form 21 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Чигарина Е.И. Лекции по курсу Базы данных. Самара, 2011 2. СТО СГАУ 02068410 -004-2007. Общие требования к оформлению учебных текстовых документов: Методические указания. – Самара, 2007 22 ПРИЛОЖЕНИЕ A Листинг основных классов программы public class OrgDAO { protected static int org_id_COL_NUM = 0; protected static int org_name_COL_NUM = 1; protected static int org_info_COL_NUM = 2; protected static int org_type_COL_NUM = 3; private static final String GET_OUTER = " select o.org_id, o.org_name, o.org_info, too.OUTER_ORG_TYPE_ID type_id\n" + " from Organization o join PREDPR_ORGANIZATION po on po.org_id = o.org_id \n" + " join OuterOrganization oo on o.org_id = oo.org_id\n" + " join TypeOuterOrganization too on oo.OUTER_ORG_TYPE_ID = too.OUTER_ORG_TYPE_ID \n" + " where po.predpr_id = ? \n" + " and (po.org_type = ? or po.org_type = 2)"; private static final String GET_ALL_ORG = " select distinct o.org_id, o.org_name, o.org_info, too.OUTER_ORG_TYPE_ID type_id\n" + "from Organization o full join PREDPR_ORGANIZATION po on po.org_id = o.org_id \n" + " join OuterOrganization oo on o.org_id = oo.org_id\n" + " join TypeOuterOrganization too on oo.OUTER_ORG_TYPE_ID = too.OUTER_ORG_TYPE_ID\n" + " order by o.org_name "; private static final String INSERT_ORG_PROC = "begin insertOrg(?,?,?,?,?,?); end;"; private static final String UPDATE_ORG_PROC = "begin updateOrg(?,?,?,?,?,?); end;"; private static final String DEL_ORG_PROC = "begin deleteOrg(?,?); end;"; private static final String GET_REPORT_2 = " select o.org_id, o.org_name, o.org_info," + " too.name_foreign_organization_type as type_name,p.predpr_name\n" + " from Organization o join PREDPR_ORGANIZATION po on po.org_id = o.org_id \n" + " join Predpr p on p.predpr_id = po.predpr_id\n" + " join OuterOrganization oo on o.org_id = oo.org_id\n" + " join TypeOuterOrganization too on oo.OUTER_ORG_TYPE_ID = too.OUTER_ORG_TYPE_ID \n" + " where \n" + " too.OUTER_ORG_TYPE_ID = ? /*?*/\n" + " and (po.org_type = 0 or po.org_type = 2)"; private static final String DEL = " delete from Organization where org_id =?"; private static final String NEXT_ID = " select max(org_id) from Organization"; private static final String GET_ID_OUTER_TYPE_ORG = " select outer_org_type_id\n" + " from Typeouterorganization \n" + " where name_foreign_organization_type = ?"; public static final String FIND_SUCH_NAME = "SELECT org_id from Organization where org_name = ?"; public static final String FIND_SUCH_NAME2 = "SELECT org_id from Organization where org_name = ? and org_id != ?"; private boolean isValidString(String name) { if (!StringValidator.isValid(name)) { return false; } if (isExistSuch(name)) 23 { JOptionPane.showMessageDialog(new Frame(), "Организация с именем '" +name +"' уже зарегистрирована", "Ошибка при создании записи", JOptionPane.ERROR_MESSAGE); return false; } return true; } private boolean isExistSuch(String name) { Object[] list = JDBCTemplate.getInstance().executeSelectForObjectOrNull(FIND_SUCH_NAME, new Object[][]{ {JDBCType.VARCHAR2, name} }); if ((list != null) && (list.length > 0)) { return true; } return false; } private boolean isValidString(String name, int org_id) { if (!StringValidator.isValid(name)) { return false; } if (isExistSuch(name, org_id)) { JOptionPane.showMessageDialog(new Frame(), "Организация с именем '" +name +"' уже зарегистрирована", "Ошибка при создании записи", JOptionPane.ERROR_MESSAGE); return false; } return true; } private boolean isExistSuch(String name, int org_id) { Object[] list = JDBCTemplate.getInstance().executeSelectForObjectOrNull(FIND_SUCH_NAME2, new Object[][]{ {JDBCType.VARCHAR2, name}, {JDBCType.NUMBER, org_id} }); if ((list != null) && (list.length > 0)) { return true; } return false; } public int insert(Integer org_id, String org_name, String org_info, Integer org_type/*0 postav, 1 product*/, Integer outerorgtypeid, Integer predpr_id) { //insert in Organization if (!isValidString(org_name)) return -1; if (org_id == null) org_id = nextID(); int res = JDBCTemplate.getInstance().executeCall(INSERT_ORG_PROC, new Object[][]{ 24 {JDBCType.NUMBER, org_id}, {JDBCType.VARCHAR2, org_name}, {JDBCType.VARCHAR2, org_info}, {JDBCType.NUMBER, org_type}, {JDBCType.NUMBER, outerorgtypeid}, {JDBCType.NUMBER, predpr_id} }); if (res <0) { JOptionPane.showMessageDialog(new Frame(), "Не удалось создать запись с id \"" + org_id + "\" в базе.", "Ошибка при создании записи ", JOptionPane.ERROR_MESSAGE); } return res; } public int insertExist(Integer org_id, String org_name, String org_info, Integer org_type/*0 postav, 1 product*/, Integer outerorgtypeid, Integer predpr_id) { //insert in Organization if (org_id == null) if (isExistSuch(org_name)) org_id = getIDforName(org_name); else org_id = nextID(); String typ = ""; if (org_type == 0) typ = "поставщика"; else typ = "потребителя"; int res = JDBCTemplate.getInstance().executeCall(INSERT_ORG_PROC, new Object[][]{ {JDBCType.NUMBER, org_id}, {JDBCType.VARCHAR2, org_name}, {JDBCType.VARCHAR2, org_info}, {JDBCType.NUMBER, org_type}, {JDBCType.NUMBER, outerorgtypeid}, {JDBCType.NUMBER, predpr_id} }); if (res <0) { JOptionPane.showMessageDialog(new Frame(), "Не удалось добавить организацию-\"" + typ + "\" в базе.", "Ошибка при создании записи ", JOptionPane.ERROR_MESSAGE); } return res; } public int del(Integer org_id, Integer org_type /*0 postav 1 potreb*/) { int res = JDBCTemplate.getInstance().executeCall(DEL_ORG_PROC, new Object[][]{ {JDBCType.NUMBER, org_id}, {JDBCType.NUMBER, org_type} }); if (res <0) { 25 JOptionPane.showMessageDialog(new Frame(), "Не удалось удалить запись с id \"" + org_id + "\" в базе.", "Ошибка при создании записи ", JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(new Frame(), "Организация успешно удалена ", "", JOptionPane.INFORMATION_MESSAGE); } return res; } //TODO: update public void update(Integer org_id, String org_name, String org_info, Integer org_type/*0 postav, 1 product*/, Integer outerorgtypeid, Integer predpr_id) { if (!isValidString(org_name, org_id)) return ; int res = JDBCTemplate.getInstance().executeCall(UPDATE_ORG_PROC, new Object[][]{ {JDBCType.NUMBER, org_id}, {JDBCType.VARCHAR2, org_name}, {JDBCType.VARCHAR2, org_info}, {JDBCType.NUMBER, org_type}, {JDBCType.NUMBER, outerorgtypeid}, {JDBCType.NUMBER, predpr_id} }); if (res <0) { JOptionPane.showMessageDialog(new Frame(), "Не удалось редактировать запись с id \"" + org_id + "\" в базе.", "Ошибка при создании записи ", JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(new Frame(), "Организация успешно изменена ", "", JOptionPane.INFORMATION_MESSAGE); } } public static Integer getIDforName(String name) { Object[] result = JDBCTemplate.getInstance().executeSelectForObjectOrNull(FIND_SUCH_NAME, new Object[][]{ {JDBCType.VARCHAR2, name} }); return new Integer(Converter.toInteger(result[0] == null ? -1 : result[0]).intValue()); } public static Integer nextID() { Object[] result = JDBCTemplate.getInstance().executeSelectForObjectOrNull(NEXT_ID, new Object[][]{}); if (null != result) return new Integer(Converter.toInteger(result[0] == null ? -1 : result[0]).intValue() + 1); else return new Integer(0); } public static Object[] getOrgTypesWithUnknown() { Collection<Catalog> orgs = OuterOrgDAO.getOuterOrganizations(); orgs.add(new Catalog(-1, "unknown")); return orgs.toArray(); } 26 public static Object[] getOrgTypes() { Collection<Catalog> orgs = OuterOrgDAO.getOuterOrganizations(); return orgs.toArray(); } public static Object[][] getReport2Data(int org_type_id) { ArrayList<ArrayList> res = JDBCTemplate.getInstance().executeSelect(GET_REPORT_2, new Object[][]{ {JDBCType.NUMBER, org_type_id} } ); Object[][] data = new Object[res.size()][]; //get - o.org_id, o.org_name, o.org_info, too.name_foreign_organization_type as type_name,p.predpr_name for (int i = 0; i< res.size(); i++) { ArrayList arrayList = res.get(i); Object [] array = new Object[5]; array[0] = Converter.toInteger(arrayList.get(0)); array[1] = arrayList.get(1) == null ? "" : arrayList.get(1).toString(); array[2] = arrayList.get(2) == null ? "" : arrayList.get(2).toString(); array[3] = arrayList.get(3) == null ? "" : arrayList.get(3).toString(); array[4] = arrayList.get(4) == null ? "" : arrayList.get(4).toString(); data[i] = array; } return data; } /* orgType o - postav, 1 - potreb * */ public static Object[] getOrgForPredpr(int orgType) { int predpr_id = CurrentValues.getPredprId(); Collection<Org> result = new ArrayList<Org>(); ArrayList<ArrayList> res = JDBCTemplate.getInstance().executeSelect(GET_OUTER, new Object[][]{ {JDBCType.NUMBER, predpr_id}, {JDBCType.NUMBER, orgType} } ); if (res != null) for (ArrayList arrayList : res) { result.add(new Org( Converter.toInteger(arrayList.get(org_id_COL_NUM)), arrayList.get(org_name_COL_NUM) == null ? "" : arrayList.get(org_name_COL_NUM).toString(), arrayList.get(org_info_COL_NUM) == null ? "" : arrayList.get(org_info_COL_NUM).toString(), Converter.toInteger(arrayList.get(org_type_COL_NUM)), predpr_id )); 27 } return result.toArray(); } public static Object[] getAllOrgs() { int predpr_id = CurrentValues.getPredprId(); Collection<Org> result = new ArrayList<Org>(); ArrayList<ArrayList> res = JDBCTemplate.getInstance().executeSelect(GET_ALL_ORG, new Object[][]{ } ); if (res != null) for (ArrayList arrayList : res) { result.add(new Org( Converter.toInteger(arrayList.get(org_id_COL_NUM)), arrayList.get(org_name_COL_NUM) == null ? "" : arrayList.get(org_name_COL_NUM).toString(), arrayList.get(org_info_COL_NUM) == null ? "" : arrayList.get(org_info_COL_NUM).toString(), Converter.toInteger(arrayList.get(org_type_COL_NUM)), predpr_id )); } return result.toArray(); } public static Integer getIDforOuterOrgType(String name) { Object[] result = JDBCTemplate.getInstance().executeSelectForObjectOrNull(GET_ID_OUTER_TYPE_ORG, new Object[][]{ {JDBCType.VARCHAR2, name} } ); return new Integer(Converter.toInteger(result[0] == null ? -1 : result[0]).intValue()); } 28