Курсовой проект (2007) (Курсовой проект)

Посмотреть архив целиком

московский энергетический институт (технический университет)












Курсовой проект

по дисциплине «Распределенные ИС и БД»




Подготовил студент группы А-13-03 Трофимов В.С.






Москва, 2007



Оглавление

1. Задание 3

2. Уточнение задания 3

3. Проектирование БД и ПО 3

3.1. Проектирование базы данных 3

3.1.1. Логическая модель базы данных 3

3.2. Проектирование программного обеспечения 5

3.2.1. Проектирование архитектуры 5

3.2.2. Рассмотрение базового класса редактирования таблиц 6

3.3. Вывод 7

4. Реализация 8

4.1. Реализация базы данных 8

4.1.1. Физическая модель базы данных 8

4.1.2. Соединение с сервером 9

4.1.3. Реализация базы данных средствами Visual Studio 9

4.1.4. Редактирование данных в БД средствами Visual Studio 14

4.1.5. Реализация отображения базы данных 14

4.2. Реализация программного обеспечения 15

4.2.1. Интерфейс программы 16

4.2.2. Окно редактирования таблиц БД 17

4.2.3. Дополнительная возможность – консоль 18

4.3. Реализация создания отчетов 18

4.3.1. Создание SQL запроса для отчета 19

4.3.2. Интерфейс отчета 22

5. Приложение 24

Список литературы 33

  1. Задание

Необходимо создать базу данных для хранения семестровых планов, а также программный модуль, позволяющий редактировать данные в БД и рассчитывать учебную нагрузку на преподавателей.

  1. Уточнение задания

Для каждого предстоящего учебного года необходимо выполнять расчет плановой нагрузки, с учетом структуры преподаваемых дисциплин и нормативов нагрузки.

Сведения о плановой госбюджетной нагрузке поступают на кафедру в виде документа, именуемого семестровым планом. Необходимо реализовать базу данных для хранения семестровых планов, реализовать ее на Microsoft SQL Server 2005, а также построить модуль выполнения расчета объема плановой нагрузки. Необходимы интерфейсы пользователя для работы и редактирования хранимых данных.

В качестве языка программирования для реализации данной задачи будем использовать Microsoft Visual Studio 2005.

  1. Проектирование БД и ПО

Итак, для того, чтобы реализовать нашу задачу, нам необходимо выполнить следующие пункты:

• Создать модель будущей базы данных

• Реализовать базу данных на MS SQL Server 2005

• Реализовать модуль для редактирования данных в базе данных на MS Visual Studio 2005.

• Реализовать составление отчетов (отчет о нагрузке преподавателей)



    1. Проектирование базы данных

Входящими данными являются данные семестрового плана. Для ввода и хранения этих данных смоделируем базу данных.

Создадим логическую и физическую модели базы данных. В этом нам поможет Erwin.

      1. Логическая модель базы данных

Логическая модель нашей базы данных будет выглядеть в следующем виде:

Видно, что модель содержит следующие сущности:

• Преподаватели

Данная сущность содержит список имен преподавателей, а также их должности, ученые степени и категории. Последние, находятся в разных сущностях для того, чтобы избежать лишних повторений (избытка данных) у преподавателей (первая нормальная форма).

• Должности, Ученые степени, Категории

Названия говорят сами за себя – содержат данные (должности, ученые степени, категории), необходимые для каждого преподавателя

• Дисциплины

В данной сущности хранятся все дисциплины (их короткое и полное названия)

• Учебный план, Специальности

Содержит номер, год, номер семестра, количество недель и код специальности. Все коды специальности хранятся в отдельной таблице.

• Группы

Содержит группы, а также другую информацию для каждой группы – название, год приема, количество студентов и номер/идентификатор кафедры.

• Кафедры

Содержит все названия кафедр

• Институты

Содержит все названия институтов (факультетов)

• Виды расчетных работ

Содержит названия расчетных работ

• Дисциплины учебного плана

Эта сущность, по сути, отображает данные семестрового плана. Т.е. она содержит номер учебного плана, все дисциплины, которые находятся в этом семестровом плане, все часы для каждой преподаваемой дисциплины, а также информацию, какой преподаватель читает ту или иную дисциплину.

    1. Проектирование программного обеспечения

Целью данного программного обеспечения является, в первую очередь, редактирование данных в базе данных. Для этого необходимо иметь возможность редактирования данных в каждой таблице.

Создадим базовый класс, который будет являться «основой» для редактирования таблицы. Все остальные классы смогут наследоваться от базового. Появляется возможность простого подхода к реализации программного обеспечения. Ведь если нам понадобится добавить какую-нибудь таблицу в базу данных, то легко можно будет создать и редактирование этой таблицы, всего лишь унаследовавшись от базового класса и перекрыть некоторые нужные методы.

      1. Проектирование архитектуры

Покажем схематично архитектуру программного обеспечения.





















































Здесь схематично изображены классы программного обеспечения, которые отвечают за редактирование данных в базе данных, и их назначения. Кроме того, имеется главная форма (класс MainForm), которая является MDI приложением и вызывает все классы (при необходимости, т.е. их можно вызвать при нажатии на соответствующую кнопку – компонент формы), редактирующие таблицы базы данных (Примечание: из главной формы нельзя вызвать базовый класс. Он предназначен только для его наследников).

Связь означает наследование, т.е. «класс А наследуется от класса В».

      1. Рассмотрение базового класса редактирования таблиц

Базовый класс BaseFormEditor имеет следующие методы:

  • Виртуальный метод getDataTable()

Данный метод возвращает данные таблицы. Как и все виртуальные методы, он должен быть перекрыт в классе-наследнике.

  • Виртуальный метод getFormCaption()

Этот метод возвращает название заголовка формы.

  • Виртуальный метод updateTables()

Предназначен для сохранения данных в таблице. Также перекрывается в потомках.

На форме имеется кнопка для применения произведенных действий с данными таблицы, при нажатии на которую вызывается этот метод (функция), которая изменяет все данные таблицы в базе данных.

  • Виртуальный метод fillTables()

Заполняет таблицу нужными данными – данными из таблицы базы данных

  • Виртуальный метод initDataTable()

Предназначен для инициализации таблицы (тут значение слова таблица означает компонент формы, куда выводятся данные для отображения их пользователю и изменения/редактирования)

  • Виртуальный метод getTableColumns()

Возвращает колонки таблицы (компонент формы).

В этом методе можно указать нужные названия для каждой колонки таблицы, а также тип колонки и ее содержимое. Содержимое в смысле отображение той или иной информации. Понятно, что содержимым будут являться данные из таблицы базы данных, однако информация, выводимая в компоненты формы представляет из себя только значения – идентификаторы. Например, если нужно вывести список дисциплин в каком-то сложном запросе (где используется от двух таблиц и больше), то этот список будет представлять из себя не названия дисциплин, а их уникальные идентификаторы. Чтобы упростить жизнь пользователю программы и вообще, для красивого/информационного вида, необходимо указать в полях таблицы (компонента), какую информацию стоит выводить.

  • А также другие методы (init(), saveToXML())

Прочие методы (функции) предназначены для инициализации компонентов формы, обработки событий нажатия на компоненты формы, сохранения данных таблицы в XML файл (кстати в дальнейшем, этот XML файл возможно использовать для отображения отчета, а также экспортирования отчета в Excel средствами MS Visual Studio 2005)

    1. Вывод

Вышеизложенный подход к реализации программного обеспечения и базы данных предоставляет гибкость в создании дополнительных «наворотов» в структуре базы данных, а также удобство редактирования данных возможностями программы. Если посмотреть с точки зрения программирования, то любое добавление или улучшение программного кода не преподнесет больших сложностей разработчику.

  1. Реализация

Рассмотрим реализацию нашего программного продукта по порядку.

    1. Реализация базы данных

Реализацию базы данных будем выполнять на Visual Studio 2005, причем, он подключится к серверу и можно создавать и менять БД в очень удобной форме.

      1. Физическая модель базы данных

Физическая модель данных, напротив по отношению к логической модели, зависит от конкретной реализации СУБД, фактически являясь отображением системного каталога. В физической модели содержится информация о всех объектах БД. В ней важно описать всю информацию о конкретных физических объектах – таблицах, колонках, индексах и т.п.

Физическая модель нашей базы зависит от реализации СУБД Microsoft SQL Server 2000 (это объясняется тем, что более новых версий в Erwin’е нет) и принимает следующий вид:

В этой модели используются только два типа данных: int и nchar().

При существовании пустых значений в базе данных, она теряет как смысл хранения этих данных, так и надежность этой базы. Именно поэтому, почти все данные не могут принимать значения NULL. Имеется исключение, как, например, в таблице Disciplines_learning_plan (Дисциплины учебного плана) значение поля vid_rash_zadaniya_id (вид расчетного задания) может быть NULL, т.к. возможны отсутствия видов расчетных заданий. Также, отсутствия количества часов тоже возможны, однако в этом случае необходимо вводить 0. Подобная ситуация есть и в таблице vid_rash_rabot (Виды расчетных работ) – там можно создать отдельное значение, например, <пусто> и использовать его в качестве «отсутствия». При редактировании данных с помощью программного обеспечения (будет описано позже) необходимо использовать именно такой способ заполнения БД, т.к. в ней не предусмотрено вносить пустые данные.

      1. Соединение с сервером

При помощи MS Visual Studio 2005 у нас есть возможность подключиться к серверу следующим образом. В меню Data выбрать Add new Data Source и там создать новое подключение к серверу или к уже созданному файлу SQL Server’а. В нашем случае сейчас уже имеется файл базы данных и это окно подключения будет иметь вид:

Видно, что подключение прошло успешно, а это значит что сделано правильно.

Вообще говоря, если подключаться через сервер, а не файл, это позволяет обращаться к базе данных с нескольких рабочих мест, что расширяет возможности использования базы данных.

      1. Реализация базы данных средствами Visual Studio

Наша модель базы данных, а далее – уже реализация это базы будет представлена в таком виде (это база данных на MS SQL Server 2005 средствами MS Visual Studio 2005).



Рассмотрим каждую таблицу в отдельности, чтобы понять ее структуру (строковые размеры данных соответствуют размерам, приведенные в физической модели базы данных):



Эта таблица включает в себя такие поля как:



- идентификатор (уникальный номер)

- идентификатор таблицы Дисциплины

- идентификатор таблицы Учебный план

- идентификатор таблицы Преподаватели

- часы занятий в неделю: обязат.

- часы занятий в неделю: лаб.пр.

- часы занятий в неделю: самост.

- экзамены

- зачеты

- часы учеб. занятий в неделю: лекции

- часы учеб. занятий в неделю: лабор.

- часы учеб. занятий в неделю: практ.

- идентификатор таблицы вид расчетного задания

- консульт.

- идентификатор таблицы Группы

- идентификатор таблицы Кафедры





Включает поля:

- идентификатор (уникальный номер)

- имя преподавателя

- идентификатор таблицы Должности

- идентификатор таблицы Ученые степени

- идентификатор таблицы Категории





Включает поля:

- идентификатор (уникальный номер)

- название должности





Включает поля:

- идентификатор (уникальный номер)

- название ученой степени





Включает поля:

- идентификатор (уникальный номер)

- название категории

Включает поля:

- идентификатор (уникальный номер)

- идентификатор таблицы Специальности

- номер учебного плана

- год

- номер семестра

- количество недель





Включает поля:

- идентификатор (уникальный номер)

- код специальности

- название специальности





Включает поля:

- идентификатор (уникальный номер)

- условное обозначение вида работы

- полное название вида работы





Включает поля:

- идентификатор (уникальный номер)

- название группы

- год приема

- количество студентов

- идентификатор таблицы Кафедры





Включает поля:

- идентификатор (уникальный номер)

- название кафедры (аббревиатура)

- полное название кафедры

- идентификатор таблицы Институты (факультеты)





Включает поля:

- идентификатор (уникальный номер)

- название института/факультета (аббревиатура)

- полное название института/факультета









      1. Редактирование данных в БД средствами Visual Studio



Рис. 4.1.













Рис. 4.2.

В окне Server Explorer, где представлены таблицы базы данных на Microsoft SQL Server в виде дерева (см. рис. 4.1.), для каждой таблицы можно открыть окно, нажатием на кнопку Show Table Data. Именно в этом окне предоставляется возможность редактирования данных таблицы. Выглядит это окно редактирования приблизительно так, как представлено на рис. 4.2. Приблизительно, потому что полный объем не вошел в рисунок в виду большого количества колонок.

      1. Реализация отображения базы данных

Отображение базы данных (компонент DataSet) необходим для того, чтобы исключить лишние обращения к базе данных и к серверу. Это очень важная особенность, ведь если с базой работают множество пользователей, нагрузка на сервер может быть довольно большой – количество запросов во много раз больше, что приведет к замедлению работы исполнения запросов.

Поэтому, за счет DataSet на компьютере клиента находится отображение базы, с которой он работает. По завершении работы базы клиента и сервера синхронизируются (вернее, в серверную базу вносятся изменения, сделанные в базе данных клиента)

Отображение нашей базы данных на MS Visual Studio 2005 выглядит следующим образом:



Все числовые данные имеют тип Int32, строковые – String. Размеры строковых данных соответствуют тем, которые приведены в физической модели базы данных.

На скрине видно, что в каждой таблице имеются еще и TableAdapter’ы. Это своего рода мосты для соединения DataSet и источником данных. Здесь имеются такие методы, как Fill и GetData()

  • Метод Fill

Этот метод предназначен для того, чтобы заполнять таблицу нужными данными из источника (файл базы данных)

  • Метод GetData()

Предназначен для того, чтобы брать данные из таблицы отображения.

    1. Реализация программного обеспечения

Главной особенностью в реализации программного обеспечения является тот факт, что все классы, отвечающие за редактирования таблиц базы данных, наследуются от одного базового класса, что придает удобство в реализации. Методы этого базового класса были описаны выше. Виртуальные методы базового класса необходимо перекрыть в классе-потомке. Все эти методы позволяют менять у потомка такие параметры как: название заголовка формы, заполнение и сохранение нужной таблицы базы данных (один класс-потомок работает только с одной таблицей, в смысле редактирование данных; однако при отображении данных пользователю, возможно использования нескольких таблиц базы данных с целью показывать данные в понятной пользователю форме).

      1. Интерфейс программы

Главное окно представляет собой MDI приложение, которое имеет следующее меню:

  • Файл

    • Выход

  • Таблицы

    • Институты

    • Кафедры

    • Группы

    • Дисциплины

    • Специальности

    • Преподаватели

    • Учебные планы

    • Должности

    • Ученые степени

    • Категории

    • Виды расчетных заданий

    • Дисциплины учебных планов

  • Отчеты

    • Нагрузка на преподавателей

  • Инструменты

    • Консоль

Каждая из таблиц для редактирования БД вызывается соответствующим пунктом меню «Таблицы».

Отчет о нагрузке на преподавателей, также создается по нажатию на соответствующий пункт меню «Отчеты».

Как дополнительная возможность программного обеспечения, существует пункт меню «Консоль», которая позволяет исполнять SQL запросы к базе данных, введенные пользователем и выводить результат в таблицу (компонент DataTable). Для этого, конечно, необходимо знать названия таблиц и полей, и, в основном, создавалась с целью удобства в реализации программного обеспечения, но также этим могут воспользоваться и другие «посвященные» пользователи.

      1. Окно редактирования таблиц БД

Рассмотрим одно из окон, предназначенное для редактирования данных в одной из таблиц. Возьмем, к примеру, окно «Преподаватели». С помощью данной формы возможно редактирование и отображение таблицы Преподаватели в базе данных.

Итак, при открытии данного окна, вызывается метод Fill (из TableAtapter’а необходимой таблицы базы данных). Этот метод получает данные таблицы БД и заполняет ими таблицу (компонент) на форме. После внесенных изменений, пользователь может нажать на кнопку «применить», чтобы все изменения были внесены в базу. Если же просто закрыть окно программы, то изменения будут держаться только до тех пор, пока программа не будет выгружена полностью. Т.е. пока программа работает, все вносимые изменения она производит с образом базы (DataSet), который хранится у клиента (пользователя). По сути, нажатие на кнопку «применить» вызывает метод GetData() (в TableAdapter’е), который берет данные из таблицы на форме и сохраняет их в базе данных.

Также, в этом окне находится кнопка «Сохранить в XML». Она вызывает диалоговое окно сохранения, где можно выбрать куда сохранить XML файл. В этом XML файле хранятся данные текущей таблицы. Впоследствии, этот файл можно будет открыть модулем создания отчетов и просмотреть в нормальном виде.

«Загрузить из XML» обратная функция сохранению, она загружает из указанного места XML файл и отображает его в таблице на форме.

      1. Дополнительная возможность – консоль

В качестве дополнительного «бонуса» была реализована «Консоль», которая позволяет пользователю вводить свои запросы к базе данных и получать результат в виде таблицы на форме. В первую очередь, это удобство затрагивает разработчика программы, т.к. простому непосвященному пользователю необходимо будет знать названия баз данных и их полей.

Приведем пример работы данного модуля. Построим такой SQL запрос, который должен вывести все данные о Группах. В таблице Группы у нас содержится идентификатор на таблицу Кафедры, поэтому необходимо связать эти две таблицы (можно, конечно и не связывать, но тогда результат запроса будет не очень красивым).

Приведем пример SQL запроса:

select group_id, group_name, group_year, kol_students, kafedra_name, kafedra_longname from Groups

join Kafedras on Groups.kafedra_id=Kafedras.kafedra_id



В программе это выглядит следующим образом:

В случае если запрос будет неправильным или присутствует какая-нибудь ошибка, будет выдано сообщение и при этом указано что за ошибка, как если бы мы делали запрос на полноценной СУБД.

    1. Реализация создания отчетов

Отчеты создаются с помощью стандартного компонента ReportViewer в Microsoft Visual Studio 2005. Он позволяет получать файлы XML, выбирать набор нужных колонок для показа пользователю, отображать их в табличном виде, производить поиск по словам, посылать отчет на печать, а также экспортировать таблицу отчета в Excel.

      1. Создание SQL запроса для отчета

Для реализации поставленной задачи необходимо составить отчет о нагрузке преподавателей. Т.е. эта задача сводится к тому, чтобы создать такой SQL запрос, который бы позволял составить необходимый отчет.

Этот SQL запрос будет выглядеть в таком виде:

SELECT Teachers_1.teacher_name AS ФИО_преподавателя, Posts.post_name AS Должность, Degrees.degree_name AS Ученая_степень,

Category.category_name AS Категория, subQueryLections.[Лекции: количество групп] AS Лекции_количество_групп,

SUM(Disciplines_learning_plan_1.week_lections_hours) * Learning_plan.weeks_number AS Лекции_число_часов,

COALESCE (subQuerySeminars.[Семинары: количество групп], 0) AS Семинары_количество_групп,

SUM(Disciplines_learning_plan_1.week_prakt_hours) * Learning_plan.weeks_number AS Семинары_число_часов,

COALESCE (subQueryLabs.[Лабораторные: количество групп], 0) AS Лабораторные_количество_групп,

SUM(Disciplines_learning_plan_1.week_labs_hours) * Learning_plan.weeks_number AS Лабораторные_число_часов,

COALESCE (subQueryKP.[Курсовой проект: количество групп], 0) AS Курсовой_проект_количество_групп,

COALESCE (subQueryKP.[Курсовой проект: число студентов], 0) AS Курсовой_проект_число_студентов,

COALESCE (subQueryTR.[Типовые расчеты: количество групп], 0) AS Типовые_расчеты_количество_групп,

COALESCE (subQueryTR.[Типовые расчеты: число студентов], 0) AS Типовые_расчеты_число_студентов,

SUM(Disciplines_learning_plan_1.consultation) AS Консультации, SUM(Disciplines_learning_plan_1.exams) AS Экзамены,

SUM(Disciplines_learning_plan_1.tests) AS Зачеты, (SUM(Disciplines_learning_plan_1.week_lections_hours)

+ SUM(Disciplines_learning_plan_1.week_prakt_hours) + SUM(Disciplines_learning_plan_1.week_labs_hours)

+ SUM(Disciplines_learning_plan_1.consultation)) * Learning_plan.weeks_number AS Всего_учебных_часов

FROM Disciplines_learning_plan AS Disciplines_learning_plan_1 INNER JOIN

Teachers AS Teachers_1 ON Disciplines_learning_plan_1.teacher_id = Teachers_1.teacher_id INNER JOIN

Posts ON Teachers_1.post_id = Posts.post_id INNER JOIN

Degrees ON Teachers_1.degree_id = Degrees.degree_id INNER JOIN

Category ON Teachers_1.category_id = Category.category_id INNER JOIN

Groups AS Groups_1 ON Disciplines_learning_plan_1.group_id = Groups_1.group_id INNER JOIN

Vid_rasch_rabot ON Disciplines_learning_plan_1.vid_rasch_zadaniya_id = Vid_rasch_rabot.vid_rasch_zadaniya_id INNER JOIN

Learning_plan ON Disciplines_learning_plan_1.id_learning_plan = Learning_plan.id_learning_plan LEFT OUTER JOIN

(SELECT Teachers_3.teacher_id, Teachers_3.teacher_name, COUNT(Disciplines_learning_plan_3.group_id)

AS [Курсовой проект: количество групп], SUM(Groups_3.kol_students) AS [Курсовой проект: число студентов]

FROM Disciplines_learning_plan AS Disciplines_learning_plan_3 INNER JOIN

Teachers AS Teachers_3 ON Disciplines_learning_plan_3.teacher_id = Teachers_3.teacher_id INNER JOIN

Groups AS Groups_3 ON Disciplines_learning_plan_3.group_id = Groups_3.group_id FULL OUTER JOIN

Vid_rasch_rabot AS Vid_rasch_rabot_1 ON

Disciplines_learning_plan_3.vid_rasch_zadaniya_id = Vid_rasch_rabot_1.vid_rasch_zadaniya_id

WHERE (Vid_rasch_rabot_1.vid_rasch_zadaniya_name = 'КП')

GROUP BY Teachers_3.teacher_id, Teachers_3.teacher_name, Vid_rasch_rabot_1.vid_rasch_zadaniya_name) AS subQueryKP ON

Teachers_1.teacher_id = subQueryKP.teacher_id LEFT OUTER JOIN

(SELECT Teachers_3.teacher_id, Teachers_3.teacher_name, COUNT(Disciplines_learning_plan_3.group_id)

AS [Типовые расчеты: количество групп], SUM(Groups_3.kol_students) AS [Типовые расчеты: число студентов]

FROM Disciplines_learning_plan AS Disciplines_learning_plan_3 INNER JOIN

Teachers AS Teachers_3 ON Disciplines_learning_plan_3.teacher_id = Teachers_3.teacher_id INNER JOIN

Groups AS Groups_3 ON Disciplines_learning_plan_3.group_id = Groups_3.group_id FULL OUTER JOIN

Vid_rasch_rabot AS Vid_rasch_rabot_1 ON

Disciplines_learning_plan_3.vid_rasch_zadaniya_id = Vid_rasch_rabot_1.vid_rasch_zadaniya_id

WHERE (Vid_rasch_rabot_1.vid_rasch_zadaniya_name = 'Р')

GROUP BY Teachers_3.teacher_id, Teachers_3.teacher_name, Vid_rasch_rabot_1.vid_rasch_zadaniya_name) AS subQueryTR ON

Teachers_1.teacher_id = subQueryTR.teacher_id LEFT OUTER JOIN

(SELECT Disciplines_learning_plan_2.teacher_id, Teachers_2.teacher_name, COUNT(DISTINCT Groups_2.group_id)

AS [Лабораторные: количество групп]

FROM Disciplines_learning_plan AS Disciplines_learning_plan_2 INNER JOIN

Groups AS Groups_2 ON Disciplines_learning_plan_2.group_id = Groups_2.group_id INNER JOIN

Teachers AS Teachers_2 ON Disciplines_learning_plan_2.teacher_id = Teachers_2.teacher_id

WHERE (Disciplines_learning_plan_2.week_labs_hours > 0)

GROUP BY Disciplines_learning_plan_2.teacher_id, Teachers_2.teacher_name) AS subQueryLabs ON

Teachers_1.teacher_id = subQueryLabs.teacher_id LEFT OUTER JOIN

(SELECT Disciplines_learning_plan_2.teacher_id, Teachers_2.teacher_name, COUNT(DISTINCT Groups_2.group_id)

AS [Семинары: количество групп]

FROM Disciplines_learning_plan AS Disciplines_learning_plan_2 INNER JOIN

Groups AS Groups_2 ON Disciplines_learning_plan_2.group_id = Groups_2.group_id INNER JOIN

Teachers AS Teachers_2 ON Disciplines_learning_plan_2.teacher_id = Teachers_2.teacher_id

WHERE (Disciplines_learning_plan_2.week_prakt_hours > 0)

GROUP BY Disciplines_learning_plan_2.teacher_id, Teachers_2.teacher_name) AS subQuerySeminars ON

Teachers_1.teacher_id = subQuerySeminars.teacher_id LEFT OUTER JOIN

(SELECT Disciplines_learning_plan.teacher_id, Teachers.teacher_name, COUNT(DISTINCT Groups.group_id) AS [Лекции: количество групп]

FROM Disciplines_learning_plan INNER JOIN

Groups ON Disciplines_learning_plan.group_id = Groups.group_id INNER JOIN

Teachers ON Disciplines_learning_plan.teacher_id = Teachers.teacher_id

WHERE (Disciplines_learning_plan.week_lections_hours > 0)

GROUP BY Disciplines_learning_plan.teacher_id, Teachers.teacher_name) AS subQueryLections ON

Teachers_1.teacher_id = subQueryLections.teacher_id

GROUP BY Teachers_1.teacher_name, Posts.post_name, Degrees.degree_name, Category.category_name, Learning_plan.weeks_number,

subQueryLections.[Лекции: количество групп], subQuerySeminars.[Семинары: количество групп],

subQueryLabs.[Лабораторные: количество групп], subQueryTR.[Типовые расчеты: количество групп],

subQueryTR.[Типовые расчеты: число студентов], subQueryKP.[Курсовой проект: количество групп],

subQueryKP.[Курсовой проект: число студентов]



Данный запрос был сделан средствами MS Visual Studio 2005, а также личным редактированием

      1. Интерфейс отчета

Когда пользователь нажимает на кнопку создания отчета в главном MDI окне, происходит выполнение SQL запроса, результатом которого являются данные будущего отчета. Эти данные сохраняются в форме XML документа, и уже по этим данным ReportViewer отображает отчет в понятной форме.

В первую очередь, вызывается класс OptionsDialogReport. Пользователю показывается следующее окно,



в котором он может выбрать нужные поля для отображения их в отчете. В нашем примере, выберем все поля и нажмем кнопку «ок».

Появляется следующее окно – это окно является потомком класса BaseReport – базового класса создания отчетов. В этом окне есть возможность переопределить набор отображаемых полей (колонок) в меню «Опции», а также экспортировать данные в Excel, где пользователь сможет по своему желанию изменить внешний вид отчета. Например, изменить заголовок.



  1. Приложение

Приведем исходный код базового класса редактирования таблиц БД (BaseFormEditor)

namespace Mpei.Editors

{

public partial class BaseFormEditor : Form

{

public BaseFormEditor()

{

// Инициализирует компоненты фомры

InitializeComponent();

// Заполняет таблицу

init();

}



// ----------- Методы, которые надо перекрыть ------------------------------------------

/** Возвращает данные таблицы */

virtual protected System.Data.DataTable getDataTable()

{

MessageBox.Show("Перекройте метод getDataTable()!");

return null;

}

/** Возвращает заголовок формы */

virtual protected String getFormCaption()

{

MessageBox.Show("Перекройте метод getFormCaption()!");

return "Базовая форма";

}



/** Сохраняет данные для всех таблиц. Должен быть перекрыт в потомках! */

virtual protected void updateTables()

{

MessageBox.Show("Перекройте метод updateTables()!");

}



/** Заполняет таблицы данными */

virtual protected void fillTables()

{

MessageBox.Show("Перекройте метод fillTables()!");

}



/** Инициализирует таблицы */

virtual protected void initDataTable()

{

MessageBox.Show("Перекройте метод initDataTable()!");

}



/** Возвращает колонки таблицы */

virtual protected DataGridViewColumn[] getTableColumns()

{

MessageBox.Show("Перекройте метод getTableColumn()!");

return new DataGridViewColumn[0];

}



virtual protected String getMainSourceName()

{

MessageBox.Show("Перекройте метод getMainSourceName()!");

return "";

}



// ----------- Обработка событий фрейма ------------------------------------------------

/** Нажатие на кнопку "Применить" */

private void applayButton_Click(object sender, EventArgs e)

{

try

{

updateTables();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}



/** Нажатие кнопки "Сохранить в XML" */

private void saveToXMLButton_Click(object sender, EventArgs e)

{

try

{

saveToXMLDialog.DefaultExt = "xml";

saveToXMLDialog.Filter = "XML files (*.xml)|*.xml|All files|*.*";

if (saveToXMLDialog.ShowDialog() == DialogResult.OK)

{

getDataTable().WriteXml(saveToXMLDialog.FileName);

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}



// ---------- События формы -----------------------------------------------------

/** Обрабатывает загрзку формы. Вызывает заполнение наборов данных */

private void BaseFormEditor_Load(object sender, EventArgs e)

{

fillTables();

}



// ----------- Мои методы --------------------------------------------------------------

/** Инициализирует программу */

private void init()

{

// Выставляет имя

this.Text = getFormCaption();

this.MaximizeBox = true;

}



#region Windows Form Designer generated code



/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

private void InitializeComponent()

{

// Создание новых компонентов

//

// MainDataSet

//

this.mainDataSet = new Mpei.Editors.mainDataSet();

((System.ComponentModel.ISupportInitialize)(this.mainDataSet)).BeginInit();

this.mainDataSet.DataSetName = "mainDataSet";

this.mainDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;

((System.ComponentModel.ISupportInitialize)(this.mainDataSet)).EndInit();

this.components = new System.ComponentModel.Container();

this.controlPanel = new System.Windows.Forms.FlowLayoutPanel();

this.buttonPanel = new System.Windows.Forms.FlowLayoutPanel();

this.applayButton = new System.Windows.Forms.Button();

saveToXmlButton = new Button();

loadFromXmlButton = new Button();

getReportButton = new Button();

this.mainPanel = new System.Windows.Forms.Panel();

controlLabel = new Label();

this.buttonPanel.SuspendLayout();

this.mainPanel.SuspendLayout();

this.SuspendLayout();



// ---------- Инициализация таблицы ---------------------------------------------------

// Создание таблицы

mainGrid = new System.Windows.Forms.DataGridView();

// Признак начала иницаилизации

((System.ComponentModel.ISupportInitialize)(this.mainGrid)).BeginInit();

mainGrid.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;

mainGrid.Dock = System.Windows.Forms.DockStyle.Fill;

mainGrid.Location = new System.Drawing.Point(0, 0);

mainGrid.Name = "mainGrid";

mainGrid.Size = new System.Drawing.Size(492, 359);

mainGrid.TabIndex = 0;

mainGrid.ColumnHeadersHeight = 50;


Случайные файлы

Файл
рпз.doc
140705.doc
23557-1.rtf
29114-1.rtf
112412.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.