Разработка клиентского приложения - Разработка и тестирование автоматизированной системы контроля успеваемости студентов

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

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

При открытии нового окна, старое либо исчезает, либо блокируется, позволяя тем самым сохранить целостность данных и избежать различных проблем при работе пользователя с интерфейсом. Каждая форма имеет свои особенности. Рассмотрим их по отдельности. Начальное окно выбора учебного года, курса и группы представлено на рис. 6.

начальное окно выбора учебного года, курса и группы

Рис. 6. Начальное окно выбора учебного года, курса и группы

На данном рисунке представлено пять элементов управления:

    - три выпадающих списка; - кнопка подтверждения выбора; - верхнее меню, в котором скрывается кнопка "Управление курсами".

Данное окно нельзя расширить, что сделано для сохранения интерфейса, но можно свернуть.

Выпадающие списки реализованы примерно одинаковым способом. Сначала задается SQL-запрос к базе данных, затем полученная информация загружается в источник информации к выпадающему списку. Затем задается столбец, из которого будут браться значения, и столбец, значения которого будут отображаться. Таким способом возможно выбрать нужный ID, хотя с виду пользователь будет выбирать именно нужное ему название, а не некую цифру. Изначально загружается выпадающий список выбора учебного года. После этого, в зависимости от выбранного года, выбираются подходящие учебные курсы. А в зависимости от курса выбираются доступные группы. Таким образом загружается вся информация. При смене значения из выпадающего списка выбора года происходит событие, заставляющее обновиться источник информации для выпадающего списка выбора предмета. Аналогичное событие имеется для списка выбора предмета и списка выбора группы. При каждом подобном событии и начальной загрузке данных происходит проверка на то, что по SQL-запросу была найдена информация, иначе списки выбора остаются пустыми.

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

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

окно отображения оценок

Рис. 7. Окно отображения оценок

Следующим по важности окном является форма отображения оценок, которая изображена на рис. 7.

На данной форме находятся следующие элементы управления:

    - DataGridView, отображающее студентов, их оценки и итоги; - выпадающие списки выбора модуля и занятия; - кнопка перехода к редактированию выбранного занятия; - кнопка перехода к управлению занятиями; - кнопка экспорта данных в Excel; - нижняя информационная строка с актуальной датой и временем; - верхнее меню с кнопкой справки.

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

Форма представления оценок, основанная на DataGridView, отличается сложностью создания таблицы из-за вида представления данных в реляционных базах данных. Дело в том, что благодаря SQL запросу нельзя получить таблицу, где напротив Ф. И.О. студента будут находиться оценки по всем существующим занятиям. Количество занятий постоянно меняется, они делятся на разные типы, а в реляционной модели нельзя построить таблицу, количество столбцов которой будет меняться в течение работы с ней. По этой причине формирование данных для отображения представляет из себя процесс создания запросов по каждому занятию для базы данных, после чего полученные результаты переносятся в главную таблицу, где расположение оценок зависит от студента, которому принадлежит строка.

Занятия изначально располагаются изначально в алфавитном порядке по типу занятия, а далее по дате проведения, тем самым обеспечивая группировку занятий, что удобно для пользователя.

После занесения всех занятий в таблицу, создается столбец "Qн" для накопленной оценки. Составляется SQL-запрос для получения информации из таблицы "Формулы", где хранятся веса для каждого типа занятия. В след за этими действиями для каждого студента по каждому типу занятий производятся расчеты, описанные в главе 7, пункт 7.1. Здесь же необходимо отметить, что для тех типов занятий, для которых предусматривается deadline, создается дополнительный SQL-запрос на выборку дат deadline и коэффициентов понижения для данного занятия. Дата сдачи сравнивается поочередно со датами deadlines, вследствие чего выбирается необходимый коэффициент, на который умножается оценка. Если работа сдана вовремя, но никаких понижений полученного студентом балла не производится. В итоге, в столбец Qн включается окончательно рассчитанный балл.

При дальнейшем построении учитывается то, поставлен ли для выбранного модуля экзамен. Наличие экзамена и его вес из итоговой оценки хранятся в базе данных в таблице "Формулы". Отсутствие в таблице в заданном модуле записи с типом занятия "Экзамен" означает, что итогового контроля по данному курсу в конце выбранного модуля не предполагается. Если же такой результат найден, то создается столбец "Qэ", который содержит оценки для экзамена.

Последним шагом построения таблицы является добавления столбца "Qи", который предназначается для хранения результирующих за модуль оценок, и расчет этой самой итоговой оценки для каждого студента. При наличии экзамена в модуле, оценка за экзамен умножается на соответствующий вес, накопленная оценка умножается на (10 - вес экзамена). Их сумма, предварительно округленная, заносится в колонку итога. Если же экзамен для данного модуля не предусмотрен, то в колонку "Итог" переносятся округленные накопленные оценки за модуль. Итоговый результат не предназначен для хранения в базе данных, поскольку всегда высчитывается в клиентском приложении, то есть с использованием средств устройства пользователя.

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

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

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

Кнопка "Управление занятиями" вызывает окно добавления занятий, которое будет описано ниже.

Кнопка "Экспорт" вызывает функцию переноса данных по выбранному модулю для всех групп, проходящих курс, в файл формата. xlsx, который связан с приложением Office Excel. Для работы данной функции необходимо наличие приложения Microsoft Office Excel версии 2003 версии или выше.

В начале открывается диалоговое окно с предложением выбрать место для сохранения данных и имя файла, при этом имеется возможность перезаписать информацию уже в существующий файл. В функции создается копия приложения, после этого рабочая книга, а затем рабочий лист. Лист меняет название. Изначально результаты записываются последнюю по счету группу в силу того, что автоматическое добавление листа в книгу происходит перед предыдущим листом, а не после него. Вызывается функция, аналогичная созданию таблицы оценок для DataGridView, с небольшими модификациями. Организуется цикл по столбцам полученной таблицы, при этом в первую ячейку изначально записывается в первую ячейку название столбца, а после нее - значения. Результат оформляется в виде таблицы, поделенной на ячейки. Первый листом содержит информацию о формуле расчета для данного модуля и имеет название "Дополнительные данные". Пример созданного файла показан на рис. 8.

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

В следующем окне, которое будет рассмотрено, происходит редактирование оценок (рис. 10). Переход осуществляется с окна представления оценок.

На представленном на рис. 10 окне имеются следующие элементы управления:

    - таблица DataGridView для отображения Ф. И.О. студентов, даты сдачи и оценки; - кнопка сохранения результатов; - нижняя полоса состояния.

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

Ввод оценок или их редактирование происходит напрямую в таблице DataGridView. Она заполняется при помощи запроса на соединение нескольких таблиц баз данных. Для нее был разработан триггер для автоматического создания пустых оценок для каждого студента при добавления нового занятия. Для колонок "ID", "Фамилия", "Имя", "Отчество" и "Поставил(а)" нет возможности редактирования, поскольку изменять их нет необходимости.

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

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

Оценку можно не только поставить или исправить, но и удалить. При этом не происходит физического удаления данных. В базу данных, в которой для каждого студента каждой группы всегда должна быть оценка, записывается пустое значение, допустимое для хранения в базе. Таким образом при любых действиях с оценками работа с СУБД происходит благодаря SQL-запросу на обновление данных.

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

    - тип занятия; - дату проведения занятия; - вес занятия, иначе говоря его относительную максимальную оценку; - дату и вес до трех deadlines, если таковые относятся к занятию.

Нижняя строка состояния ничем не отличается от той, что была показана в окне представления оценок.

Окно добавления новых занятий, их удаления и изменения представлено на рис. 11. Для простоты оно называется "Управления занятиями" и открывается из формы представления оценок. Данное окно относится исключительно к выбранному ранее модулю. Это позволяет автоматически использовать для обработки данных формулы текущего модуля. При этом сохраняется целостность данных.

Данное окно содержит следующие элементы управления:

    - группа radio button для выбора типа занятия; - календарь для выбора даты проведения занятия; - поле для ввода названия занятия; - поле для ввода веса, то есть относительной максимальной оценки за занятие; - три календаря для выбора даты deadline; - три поля ввода для процентов понижения оценки; - кнопка добавления нового занятия в базу данных; - выпадающий список выбора существующих занятий; - кнопка для удаления занятия, выбранного из выпадающего списка; - кнопка для редактирования занятия, выбранного из выпадающего списка; - кнопка для обновления информации по выбранному занятию, которая отображается после использования кнопки редактирования (на рис. 11 не представлена).

Группа radio button обеспечивает выбор типа занятия для нового или редактируемого занятия. Возможность выбора типов занятия зависит от того, какие типы были отведены для данного учебного курса в данном модуле. Эта информация извлекается из таблицы базы данных "Формула". При этом обеспечивается целостность информации, хранимой в базе данных. От выбора определенного типа (как это описано в главе 7, пунктом 7.2) зависит доступность назначения дат deadline и установка значения понижающего коэффициента, который будет применен к полученной оценке в случае сдачи задания позже намеченного срока.

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

Календари deadline тесно связаны между собой. Первый календарь за минимальную дату для добавления занятия принимает дату проведения занятия. Последующие календари считают этим значением дату предыдущего deadline и добавляют один день. Максимально возможная дата для deadline с некоторым номером равна последнему дню модуля минус номер deadline.

Далее рассмотрим поле ввода понижающего коэффициента, который будет применен к оценке при подсчете результатов в случае сдачи работы после даты deadline. Коэффициент должен находится в диапазоне от 0% до 99%. В данные поля возможно записать лишь цифры. При этом наличие этой величины влияет на доступность даты и поля ввода коэффициента для следующего deadline.

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

Если все данные верны, то составляется SQL-запрос на добавление новой записи в таблицу "Занятия". При этом вычисление ID для нового занятия производится здесь же с целью экономии возможных значений первичного ключа.

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

После выполнения всех запросов к СУБД на добавление, форма очищается от введенных данных, а список существующих занятий обновляется.

Выпадающий список выбора существующих занятий разработан тем же методом, что и все выпадающие списки, описанные ранее.

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

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

Однако при работе с deadlines все сложнее, поскольку в них могут быть обновления даты или процента. Так же возможно удаление, а иногда требуется добавить новую дату. Из-за этого при работе с полями процентов производится сверка со значениями, которые были сформированы во время нажатия кнопки редактирования. После этого формируется запрос на обновление информации, создание новой строки в таблице или удаления определенного deadline. В конце происходит очистка формы.

После закрытия окна управления занятиями, открывается окно отображения оценок, которое полностью обновляется с целью отобразить изменения, произошедшие с занятиями.

Следующее окно имеет аналогичное назначение, но работает с целыми курсами. Окно добавления, изменения и удаления новых курсов представлено на рис. 12. Для удобства данное окно будет называться "Управление курсами".

окно управления курсами

Рис. 12. Окно управления курсами

Это окно содержит следующие элементы управления:

    - поле ввода названия курса; - выпадающий список выбора учебного года; - список выбора модулей; - список выбора групп; - хранилище элементов определения формул; - текстовые поля для ввода весов занятий и экзамена; - check box для указания наличия экзамена; - кнопку сохранения курса; - выпадающие списки для выбора учебного года и соответствующих учебных курсов; - кнопку удаления курса; - кнопку изменения курса; - кнопку обновления информации о курсе.

Выпадающие списки обрабатываются теми же способами, что и в других окнах.

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

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

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

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

При использовании кнопки "Сохранить курс" начинается проверка данных, введенных и назначенных пользователем. При этом последовательно выполняются следующие действия:

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

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

Если ошибок нет, то начинается создание множества процессов. Первым шагом является составление SQL-запроса на включение нового курса в базу данных, при этом ID для курса вычисляется здесь же. Далее составляются запросы на включение связей курс-год и курс-группы для соответствующих таблиц.

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

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

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

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

Кнопка обновления информации является самой сложной для реализации в данном окне из-за большого количества проверок на измение информации. Изначально производится стандартная процедура проверок, описанная для кнопки сохранения курса. Если ошибок нет, то начинается сверка каждого поля с его исходными значениями, сформированными при заполнении формы из базы данных.

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

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

Описание всех пяти окон завершено. Остальные файлы формируются средой разработки Microsoft Visual Studio 2010 Express автоматически, что позволяет сосредоточиться непосредственно на основной работе по разработке необходимого функционала, описанного выше.

Похожие статьи




Разработка клиентского приложения - Разработка и тестирование автоматизированной системы контроля успеваемости студентов

Предыдущая | Следующая