Курсовой проект (548453), страница 3
Текст из файла (страница 3)
В случае если запрос будет неправильным или присутствует какая-нибудь ошибка, будет выдано сообщение и при этом указано что за ошибка, как если бы мы делали запрос на полноценной СУБД.
-
Реализация создания отчетов
Отчеты создаются с помощью стандартного компонента ReportViewer в Microsoft Visual Studio 2005. Он позволяет получать файлы XML, выбирать набор нужных колонок для показа пользователю, отображать их в табличном виде, производить поиск по словам, посылать отчет на печать, а также экспортировать таблицу отчета в Excel.
-
Создание 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, а также личным редактированием
-
Интерфейс отчета
Когда пользователь нажимает на кнопку создания отчета в главном MDI окне, происходит выполнение SQL запроса, результатом которого являются данные будущего отчета. Эти данные сохраняются в форме XML документа, и уже по этим данным ReportViewer отображает отчет в понятной форме.
В первую очередь, вызывается класс OptionsDialogReport. Пользователю показывается следующее окно,
в котором он может выбрать нужные поля для отображения их в отчете. В нашем примере, выберем все поля и нажмем кнопку «ок».
Появляется следующее окно – это окно является потомком класса BaseReport – базового класса создания отчетов. В этом окне есть возможность переопределить набор отображаемых полей (колонок) в меню «Опции», а также экспортировать данные в Excel, где пользователь сможет по своему желанию изменить внешний вид отчета. Например, изменить заголовок.
-
Приложение
Приведем исходный код базового класса редактирования таблиц БД (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 "";
}
// ----------- Обработка событий фрейма ------------------------------------------------
/** Нажатие на кнопку "Применить" */