Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект (2007) / Курсовой проект.doc
Скачиваний:
77
Добавлен:
28.06.2014
Размер:
485.89 Кб
Скачать
      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, а также личным редактированием 