Информационная система "Электронный журнал" вуза
Разработка информационной системы "Электронный журнал" вуза для непрерывного мониторинга текущей успеваемости с учетом движения контингента студентов на основе интеграции с семестровыми сетками. Рейтинговая модель мониторинга текущей успеваемости.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 08.10.2018 |
Размер файла | 6,9 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Задача: Внесение изменения по движению студентов.
Операция 1: Внести изменения по движению студента.
Условия, при соблюдении которых возможно выполнение операции:
1. Компьютер пользователя подключен к сети Интернет.
2. Портал информационной системы «Электронный журнал» доступен.
Основные действия в требуемой последовательности:
1. Выбрать пункт главного меню системы «Движение студентов».
2. На отобразившейся странице в части компонентов приказа установить соответствующие фильтры по контингенту студентов, например «Факультет» и «Группы».
3. Щелкнуть кнопку «Показать». На экране отобразится таблица с информацией по студентам выбранного факультета и группы
4. Щелкнуть по ячейкам с нужными фамилиями студентов.
5. Выбрать в фильтрах «Действие», например «Отчислить за академическую неуспеваемость», выбрать дату действия и место учебы
6. Ввести номер соответствующего приказа, дату и щелкнуть «Внести данные». На экране появится окно аутентификации, заходим под правами декана факультета, на котором проводятся изменения и нажимаем кнопку «Ок». Система проверяет логин и пароль, если они верны, то внесенные изменения проверяются на их допустимость в зависимости от предыдущего состояния студента. Выполнив все проверки, система сообщает пользователю о внесении изменений в базу.
Задача: Формирование отчета о количестве студентов.
Операция 1: Формировать отчет о количестве студентов.
Условия, при соблюдении которых возможно выполнение операции:
1. Компьютер пользователя подключен к сети Интернет.
2. Портал информационной системы «Электронный журнал» доступен.
Основные действия в требуемой последовательности:
1. Выбрать пункт главного меню «Статистика количества студентов». На экране отобразится страница статистики количества студентов.
2. Установить нужные фильтры, например «Дата актуализации», «Факультет» и группировку по группе, и нажать кнопку «Показать». Появляется таблица с группами выбранного факультета, количеством студентов по группам и долей от количества всех студентов в вузе на заданную дату (рисунок А.10).
Задача: Формирование отчета об успеваемости.
Операция 1: Формировать отчет об успеваемости.
Условия, при соблюдении которых возможно выполнение операции:
1. Компьютер пользователя подключен к сети Интернет.
2. Портал информационной системы «Электронный журнал» доступен.
Основные действия в требуемой последовательности:
2. Для просмотра отчета по студентам установить следующие фильтры: «Дата актуализации», «Факультет», поставить группировку по студентам и нажать кнопку «Показать»
3. Чтобы сформировать отчет об успеваемости по группам, поставить группировку по группам и нажать кнопку «Показать»
Если ввести дату, на которую в БД нет данных об аттестации, например 01.02.2015. Система выдает сообщение, что по заданным фильтрам нет аттестации
Задача: Просмотр ранжирования по типовым траекториям и график успеваемости.
Операция 1: Формировать отчет ранжирования по типовым траекториям и график успеваемости.
Условия, при соблюдении которых возможно выполнение операции:
1. Компьютер пользователя подключен к сети Интернет.
2. Портал информационной системы «Электронный журнал» доступен.
Основные действия в требуемой последовательности:
1. Выбрать пункт главного меню «Ранжирование и график успеваемости».
2. На открывшейся странице установить нужные фильтры, например «Факультет», «Интервал отображения графика», поставить группировку по группам и нажать кнопку «Показать».
А.5 Аварийные ситуации
В случае возникновения ошибок при работе информационной системы «Электронный журнал», не описанных в данном разделе, необходимо обращаться к разработчику системы либо к ответственному Администратору ИС «Электронный журнал» (таблица А.1).
Таблица А.1 - Аварийные ситуации
Класс ошибки |
Ошибка |
Описание ошибки |
Требуемые действия пользователя при возникновении ошибки |
|
Ошибки, выдаваемые ИС «Электронный журнал» |
Аутентификация в системе не проходит. |
Неверно введено имя пользователя или пароль, либо такая учетная запись не зарегистрирована. |
Нужно повторить ввод имени пользователя и пароля, либо обратиться к администратору. |
|
Ошибка: file not found |
Файл по введенному пути не найден. Путь указан неверно либо страница может быть удалена или перемещена. |
Необходимо проверить правильность введенного адреса, либо обратиться к администратору. |
||
Ошибка: по заданным фильтрам данных не найдено |
В БД отсутствует информация по запрошенным данным, возможно, данные еще не заносились либо стали неактуальны. |
Установить актуальные фильтры, либо обратиться к администратору. |
||
Ошибка: группа не найдена |
Информация о группе на заданную дату в БД отсутствует. Возможно, данные устарели либо еще не заносились. |
Установить актуальную дату в фильтре, либо обратиться к администратору. |
||
Сбой в электропитании рабочей станции |
Нет электропитания рабочей станции или произошел сбой в электропитании |
Рабочая станция выключилась или перезагрузилась |
Перезагрузить рабочую станцию |
ПРИЛОЖЕНИЕ Б
Проект распоряжения
РАСПОРЯЖЕНИЕ
Внести изменения в «Положением о проведении текущего контроля успеваемости и промежуточной аттестации обучающихся» СГАСУ раздел 3 «Порядок проведения текущего контроля успеваемости» в пункты 3.3 и 3.4.
- 3.3: «Результаты текущего контроля успеваемости, представленные по форме Приложения 1, ежемесячно выставляются в ведомостях текущей успеваемости кафедры, на которой проводится учебная дисциплина, и передаются в соответствующие деканаты. Результаты текущего контроля оцениваются по системе: «отлично», «хорошо», «удовлетворительно», «неудовлетворительно» или в форме «аттестован» и «не аттестован». Итоги текущего контроля в деканате отражаются в ведомостях текущей успеваемости по форме Приложения 2 и на сайте iac.samgasu.ru. В случае если обучающийся не аттестован, в ведомостях текущего контроля указывается и количество часов пропущенных занятий.»
- 3.4: «Деканы факультетов подают сведения о текущем контроле успеваемости обучающихся факультета в учебный отдел Учебного управления СГАСУ (далее - учебный отдел) с 05 ноября по 10 ноября и с 05 апреля по 10 апреля соответствующего года по форме Приложения 3. Также сведения можно посмотреть на сайте iac.samgasu.ru в разделе отчетов об успеваемости. Отчеты об успеваемости являются публичными и доступны для просмотра любым пользователям.»
Кафедрам в июне 2016 года провести аттестацию студентов по дисциплинам.
Представить отчет об итогах аттестации в отдел управления СГАСУ.
ПРИЛОЖЕНИЕ В
Листинг программы
jurnalReport.cpp
#include <QtSql>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include "../_INCLUDE/z_main.h"
#include "../_INCLUDE/z_json.h"
#include "../_INCLUDE/z_week.h"
#include "../_INCLUDE/z_filter.h"
#include "../_INCLUDE/z_sql.h"
#include "../_INCLUDE/all_sql.h"
#include "../_INCLUDE/subject.h"
#include <QSqlRecord>
extern const char *DATA;
QJsonArray getMarkForReport(const QJsonObject& author, const QUrlQuery& url, QSqlDatabase *db){
int cathedraID=url.queryItemValue("cathedraID").toInt(); //Получаем cathedraID из URL
QDate D=Z::Date; // Берем по-умолчанию текущую дату
int Y=Z::Year(D); // текущий год
int week=Z::WEEK::Week(D); //текущую неделю
//week=24;
QString d=QString("DateSerial(%1,%2,%3)").arg(D.year())
.arg(D.month())
.arg(D.day()+1);
struct _Z {
int T; //Интервал
//Структура студент
struct _STUD {
QString studGroupName;
QString studName;
int gridID;
int studGroupID;
int studID;
int studIsBudget;
int studKurs;
static _STUD clone(const QSqlRecord& r) {
_STUD t;
t.studGroupName=r.value("studGroupName").toString();
t.studName=r.value("studName").toString();
t.gridID=r.value("gridID").toInt();
t.studGroupID=r.value("studGroupID").toInt();
t.studID=r.value("studID").toInt();
t.studIsBudget=r.value("studIsBudget").toInt();
t.studKurs=r.value("studKurs").toInt();
return t;
}
};
QList <int> studID; //Список studID
QSet <int> gridID; // Список сеток
QList <_STUD> stud; // Список структур студентов
//Оценка
struct _MARK {
int studID;
int semestre;
QString subjectName;
int cathedraID;
int mark;
int T;
static _MARK clone(const QSqlRecord& r) {
_MARK t;
t.studID=r.value("studID").toInt();
t.semestre=r.value("semestre").toInt();
t.subjectName=r.value("subjectName").toString();
t.cathedraID=r.value("cathedraID").toInt();
t.mark=r.value("mark").toInt();
t.T=r.value("T").toInt();
return t;
}
//Ключ: семестр, дисциплина, id студента
static QString key(const int semestre,
const QString& subjectName,
const int studID) {
return QString("%1~%2~%3").arg(semestre)
.arg(subjectName)
.arg(studID);
}
static QString key(const _MARK& m) {
return key(m.semestre,m.subjectName,m.studID);
}
};
QHash <QString, _MARK> mark; //Хэш оценка с ключом(семестр, дисциплина, студент)
QHash <int, _GRID> grid; //Хэш сеток с ключом()
QMultiHash <int, _SUBJECT> subject; //Мультихэш дисциплин с ключом()
//Фильтры
struct {
bool stud;
bool studGroup;
bool studIsBudget;
bool faculty;
bool gridKurs;
bool bep;
bool direct;
bool formaName;
bool generationName;
bool gradeName;
bool cathedra;
bool subjectName;
bool subjectCode;
} flag;
//Статистика?
struct _STAT {
int good; //Количество 1
int bad; //Количество -1
int none; //Количество пустых оценок
int old; // Время просроченности оценки
static _STAT empty() { //Возврат пустой статистики
return {0,0,0,0};
}
};
QHash <QUrlQuery, _STAT> stat;// Хэш статистики с ключом(Url фиьтра)
//Заполнение статистики в соотвествии полученным Url
void addStat(const QUrlQuery key) {
_STAT m=stat.value(key,_STAT::empty()); //Возврат пустой статитстики
m.none++; //Увеличение количества пустых оценок
stat.insert(key,m); //Обновление статистики
}
//Заполнение статистики в соответствии с оценкой и Url
void addStat(const _Z::_MARK& mark, const QUrlQuery key) {
_STAT m=stat.value(key,_STAT::empty());
if(mark.T>T)m.old++; //Если время действия оценки>заданного периода, увеличиваем время просроченности оценки
if(mark.mark>0)m.good++;//Если оценка>0 увеличение количества положительных оценок
if(mark.mark<0)m.bad++;//Если оценка<0 увеличение количества неаттестации
stat.insert(key,m); //Обновление статистики
}
//Формирование ключа по студенту и Url
QUrlQuery key(const _Z::_STUD& stud, const QUrlQuery& u) {
QUrlQuery t(u);//??
if(flag.stud)t.addQueryItem("studID",QString::number(stud.studID));//Если выбран фильтр по студенту, добавление в url id студента
if(flag.studGroup)t.addQueryItem("studGroupID",QString::number(stud.studGroupID));//Если выбран фильтр по группам, добавление в url id группы
if(flag.studIsBudget)t.addQueryItem("studIsBudget",QString::number(stud.studIsBudget));
return t;
}
QUrlQuery key(const _GRID& grid, const QUrlQuery& u) {
QUrlQuery t(u);
if(flag.faculty)t.addQueryItem("facultyID",QString::number(grid.facultyID));
if(flag.gridKurs)t.addQueryItem("gridKurs",QString::number(grid.gridKurs));
if(flag.bep)t.addQueryItem("bepID",QString::number(grid.bepID));
if(flag.direct)t.addQueryItem("directID",QString::number(grid.directID));
if(flag.formaName)t.addQueryItem("formaName",grid.formaName);
if(flag.generationName)t.addQueryItem("generationName",grid.generationName);
if(flag.gradeName)t.addQueryItem("gradeName",grid.gradeName);
return t;
}
QUrlQuery key(const _SUBJECT& subject, const QUrlQuery& u) {
//return u;
QUrlQuery t(u);
if(flag.cathedra)t.addQueryItem("cathedraID",QString::number(subject.cathedra));
if(flag.subjectName)t.addQueryItem("subjectName",subject.subjectName);
if(flag.subjectCode) {
QString s;
for(QChar x: subject.subjectCode)
if(x.isLetter())s.append(x);
t.addQueryItem("subjectCode",s);
}
return t;
}
struct {
QHash <int, QString> stud;
QHash <int, QString> studGroup;
QHash <int, QString> faculty;
QHash <int, QString> bep;
QHash <int, QString> direct;
QHash <int, QString> cathedra;
} text;
} z;
//Инициализация фильтра z
QStringList flag=url.queryItemValue("mode").split(',');
z.flag.stud=flag.contains("stud");
z.flag.studGroup=flag.contains("studGroup");
z.flag.studIsBudget=flag.contains("studIsBudget");
z.flag.faculty=flag.contains("faculty");
z.flag.gridKurs=flag.contains("gridKurs");
z.flag.bep=flag.contains("bep");
z.flag.direct=flag.contains("direct");
z.flag.formaName=flag.contains("formaName");
z.flag.generationName=flag.contains("generationName");
z.flag.gradeName=flag.contains("gradeName");
z.flag.cathedra=flag.contains("cathedra");
z.flag.subjectName=flag.contains("subjectName");
z.flag.subjectCode=flag.contains("subjectCode");
z.T=(url.hasQueryItem("T"))?url.queryItemValue("T").toInt():14;
QUrlQuery U=url;
U.addQueryItem("studIsLearn","1");
U.addQueryItem("gridYear",QString::number(Y));
Z::sqlSelectCallback(db,
SQL::sql(Z::Date,
SQL::MODE::studList,
U),
&z,
[] (const QSqlRecord &r,
void *h)->int {
_Z *z=static_cast<_Z *>(h);
z->studID.append(r.value("studID").toInt());
z->gridID.insert(r.value("gridID").toInt());
z->stud.append(_Z::_STUD::clone(r));
return 0;
});
int j, L=0;
while(L!=z.studID.length()) {
j=z.stud.length()-L;
if(j>100)j=100;
Z::sqlSelectCallback(db,
SQL::sql(Z::Date,
SQL::MODE::jurnalMarkSimple,
QString("studID in (%1)").arg(Z::ListToString(z.studID.mid(L,j)))).replace("#DATE#",d),
&z,
[] (const QSqlRecord &r,
void *h)->int {
_Z *z=static_cast<_Z *>(h);
_Z::_MARK m=_Z::_MARK::clone(r);
z->mark.insert(_Z::_MARK::key(m),m);
return 0;
});
L+=j;
}
Z::sqlSelectCallback(db,
SQL::sql(Z::Date,
SQL::MODE::gridList,
QString("gridID in (%1)").arg(Z::ListToString(z.gridID.toList()))),
&z,
[] (const QSqlRecord &r,
void *h)->int {
_Z *z=static_cast<_Z *>(h);
z->grid.insert(r.value("gridID").toInt(),
_GRID::clone(r));
return 0;
});
QJsonObject setka;
QJsonArray h;
_SUBJECT subject;
for(auto grid: z.grid) {
setka=Z::jsonFromFile(grid.fileCurrent()).object();
if(setka.isEmpty())continue;
h=setka.value("subject").toArray();
grid.semestre=2*(grid.gridKurs-1)+Z::WEEK::Semestre(setka,week);
z.grid.insert(grid.gridID,grid);
for(int i=0;i<h.size();i++) {
subject=_SUBJECT::getSubject2(grid,h.at(i).toObject(),2-grid.semestre%2);
if(!subject.subjectControl.isEmpty())
if(cathedraID==0 ||
subject.cathedra==cathedraID)
z.subject.insertMulti(grid.gridID,subject);
}
}
QUrlQuery keyEmpty;
QUrlQuery keyStud,keyGrid;
_GRID grid;
QString s;
for(_Z::_STUD stud: z.stud) {
keyStud=z.key(stud,keyEmpty);
grid=z.grid.value(stud.gridID);
keyGrid=z.key(grid,keyStud);
for(_SUBJECT subject: z.subject.values(grid.gridID)) {
s=_Z::_MARK::key(grid.semestre,subject.subjectName,stud.studID);
if(z.mark.contains(s))
z.addStat(z.mark.value(s),z.key(subject,keyGrid));
else z.addStat(z.key(subject,keyGrid));
}
}
for(auto stud: z.stud) {
z.text.studGroup.insert(stud.studGroupID,stud.studGroupName);
z.text.stud.insert(stud.studID,stud.studName);
}
for(auto grid: z.grid) {
z.text.faculty.insert(grid.facultyID,grid.facultyName);
z.text.bep.insert(grid.bepID,grid.bepName);
}
Z::sqlSelectCallback(db,
SQL::sql(Z::Date,
SQL::MODE::directListSimple),
&z,
[] (const QSqlRecord &r,
void *h)->int {
_Z *z=static_cast<_Z *>(h);
z->text.direct.insert(r.value("directID").toInt(),
r.value("directName").toString());
return 0;
});
Z::sqlSelectCallback(db,
SQL::sql(Z::Date,
SQL::MODE::cathedraListSimple),
&z,
[] (const QSqlRecord &r,
void *h)->int {
_Z *z=static_cast<_Z *>(h);
z->text.cathedra.insert(r.value("cathedraID").toInt(),
r.value("cathedraName").toString());
return 0;
});
//Формирование ответа
QJsonArray anser;
QJsonObject t;
_Z::_STAT stat;
for(auto key: z.stat.keys()) {
t=QJsonObject();
stat=z.stat.value(key);
t.insert("good",stat.good);
t.insert("bad",stat.bad);
t.insert("none",stat.none);
t.insert("old",stat.old);
if(z.flag.stud)t.insert("studName",
z.text.stud.value(key.queryItemValue("studID").toInt()));
if(z.flag.studGroup ||
z.flag.stud)t.insert("studGroupName",
z.text.studGroup.value(key.queryItemValue("studGroupID").toInt()));
if(z.flag.studIsBudget)t.insert("studIsBudget",
key.queryItemValue("studIsBudget").toInt());
if(z.flag.faculty)t.insert("facultyName",
z.text.faculty.value(key.queryItemValue("facultyID").toInt()));
if(z.flag.gridKurs)t.insert("gridKurs",
key.queryItemValue("gridKurs").toInt());
if(z.flag.bep)t.insert("bepName",
z.text.bep.value(key.queryItemValue("bepID").toInt()));
if(z.flag.direct)t.insert("directName",
z.text.direct.value(key.queryItemValue("directID").toInt()));
if(z.flag.formaName)t.insert("formaName",
key.queryItemValue("formaName"));
if(z.flag.generationName)t.insert("generationName",
key.queryItemValue("generationName"));
if(z.flag.gradeName)t.insert("gradeName",
key.queryItemValue("gradeName"));
if(z.flag.cathedra)t.insert("cathedraName",
z.text.cathedra.value(key.queryItemValue("cathedraID").toInt()));
if(z.flag.subjectName)t.insert("subjectName",
key.queryItemValue("subjectName"));
if(z.flag.subjectCode)t.insert("subjectCode",
key.queryItemValue("subjectCode"));
anser.append(t);
}
return anser;
}
//Отчет успеваемости по проставленной аттестации
void markReport(const QJsonObject& author, const QUrlQuery& url, QSqlDatabase *db) {
QJsonArray anser = getMarkForReport(author,url,db);
Z::Exit(200,anser);
}
void markReportGraph(const QJsonObject& author, const QUrlQuery& url, QSqlDatabase *db) {
//цикл от начальной даты до конечной
QJsonArray anser = getMarkForReport(author,url,db);
}
jurnalStat.html
<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title># Статистикауспеваемости</title></head><script type="text/javascript" src="/jsscript?XXX&/_lib/base64-utf8.js&/_lib/ajax.js&/_lib/table_sort.js&/_lib/get.js&/_lib/list.js&/_lib/util.js"></script>
<script>
"use strict";
var Filter;
function onFlash(e,f) {
if(f)e.setAttribute('bgcolor','#FFFF80');
else e.removeAttribute('bgcolor');
}function compare(a,b) {
var _a=Util.Text(a.innerHTML); var _b=Util.Text(b.innerHTML);
if(parseInt(_a) && parseInt(_b)) return _a-_b;
if(_a==_b)return 0;if(_a>_b)return 1;if(_a<_b)return -1; }
function show(get) {
function H(v,n,f) {
if(n==0)return "";
var p=parseInt(100*Math.abs(v)/n);
if(f)p=100-p;
return "<div style='float: left; height: 100%; background: #00FF00; "+ "width: "+p+"%;'>"+p+"</div>"+
"<div style='float: left; height: 100%; background: #FF0000; "+ "width: "+(100-p)+"%;'> </div>";
};
try {
var table=document.getElementById('jurnalStat');
table.innerHTML="<caption>"+"Загружаю..."+"</caption>"; table.compare=compare;
var mode="";
var title="";
var e=[];
var t=document.getElementById('mode').getElementsByTagName("input"); for(var i=0;i<t.length;i++) {
if(!t[i].checked)continue;
e[t[i].value]=1;
mode+=t[i].value+",";
if(t[i].value=="stud")title+="<th>студент</th>";
if(t[i].value=="studGroup")title+="<th>группа</th>";
if(t[i].value=="studIsBudget")title+="<th>бюджет</th>";
if(t[i].value=="faculty")title+="<th>факультет</th>";
if(t[i].value=="gridKurs")title+="<th>курс</th>";
………………………………………………..if(t[i].value=="bep")title+="<th>ОПВО</th>";
………………………………………………..if(t[i].value=="direct")title+="<th>направление</th>";
………………………………………………..if(t[i].value=="formaName")title+="<th>форма</th>";i
………………………………………………..if(t[i].value=="generationName")title+="<th>поколение</th>";
……………………………………………… if(t[i].value=="gradeName")title+="<th>уровень</th>";
if(t[i].value=="cathedra")title+="<th>кафедра</th>";
if(t[i].value=="subjectName")title+="<th>дисциплина</th>"; if(t[i].value=="subjectCode")title+="<th>типдисциплины</th>";
}
title+="<th>Аттестация</th>"+"<th>Своевременность</th>"+"<th>Выполнение</th>"; var D=document.getElementById('actDate').value; var t=Ajax.runEval("/aaa.$$$?res&cmd=markReport"+Filter.get()+"&date="+D+"&mode="+mode);
if(t.error) return alert("Неудалосьполучитьданныессервера. Ошибка:"+(t.error)); var s="";
var mkol=t.length;
var none=0;
for(i=0;i<t.length;i++) { s+="<tr>";
if(e.stud) s+="<td>"+t[i].studName+"</td>";
if(e.studGroup) s+="<td>"+t[i].studGroupName +"</td>";
if(e.studIsBudget) s+="<td>"+t[i].studIsBudget +"</td>";i
if(e.faculty) s+="<td>"+t[i].facultyName +"</td>";
if(e.gridKurs) s+="<td>"+t[i].gridKurs +"</td>";
if(e.bep) s+="<td>"+t[i].bepName +"</td>";if(e.direct) s+="<td>"+t[i].directName+"</td>";
if(e.formaName) s+="<td>"+t[i].formaName +"</td>";
if(e.generationName)s+="<td>"+t[i].generationName +"</td>";
if(e.gradeName) s+="<td>"+t[i].gradeName +"</td>";
if(e.cathedra) s+="<td>"+t[i].cathedraName +"</td>";
if(e.subjectName) s+="<td>"+t[i].subjectName +"</td>";
if(e.subjectCode) s+="<td>"+t[i].subjectCode +"</td>";
s+="<td title='"+t[i].good+" / "+(t[i].good+t[i].bad)+"'>"+H(t[i].good,t[i].good+t[i].bad)+"</td>"+
"<td title='-"+t[i].old+" / "+(t[i].good+t[i].bad)+"'>"+H(-t[i].old,t[i].good+t[i].bad,true)+"</td>"+
"<td title='-"+t[i].none+" / "+(t[i].good+t[i].bad+t[i].none)+"'>"+H(-t[i].none,t[i].good+t[i].bad+t[i].none,true)+"</td>";
if((t[i].good+t[i].bad)==0) none++;
s+="</tr>";
}
if(none==mkol){ alert("Позаданнымфильтрамнетаттестации. Возможно, назаданнуюдатуаттестацияещенепроставлялась.");
table.innerHTML= "<tr>Позаданнымфильтрамненайденоданныхобаттестации.</tr>";
} else{
table.innerHTML= "<caption>"+D+"</caption>"+"<tr>"+title+"</tr>"+s; TABLE_SORT(table);
}
}
catch(e) { return alert("Неизвестнаяошибка"); }
} function onLoadContinue(){
Filter=LIST; Filter.div.generation=document.getElementById('generation'); Filter.div.year=document.getElementById('year'); Filter.div.forma=document.getElementById('forma'); Filter.div.bep=document.getElementById('bep'); Filter.div.faculty=document.getElementById('faculty'); Filter.div.grade=document.getElementById('grade'); Filter.div.direct=document.getElementById('direct');
Filter.init(); if(GET().filter){} //document.getElementById('filter').style.display = 'block'; show(GET()); } function onLoad(n) {
if(n==0)alert('Превышеновремяожидания');
else if(typeof(XXX)=='object')onLoadContinue();
else setTimeout('onLoad('+(n-1)+');',1000); }
function enter(){
var users = {"sekr":"123", "rector":"111"};
var login = document.getElementById('login').value;
var pass = document.getElementById('pass').value;
if(login=="" || pass==""){
alert("Пожалуйстазаполнитеполялогинипароль!");
}else {
if(typeof users[login]!= 'undefined') {
if(users[login]==pass){
document.getElementById('tab').remove(); alert("Входуспешновыполнен."); document.getElementById('filter').style.display = 'block'; document.getElementById('mode').style.display = ''; document.getElementById('head').style.display = ''; document.getElementById('jurnalStat').style.display = '';
}else { alert("Неверныйлогинилипароль! Пожалуйста, обратитесь к администратору."); }
}else{
alert("Неверный логин или пароль!Пожалуйста, обратитесь к администратору.");
}
}
}</script><body onload="onLoad(10)"><div id="tab"> <table width="250" height="150" align="left" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" align="center">
<b>Аутентификация</b>
</td>
</tr>
<tr>
<td align="right">
<b>Логин:</b><input type="text" name="login" id="login" /> </td>
</tr>
<tr>
<td align="right"><b>Пароль:</b><input type="password" name="pass" id="pass" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" onClick='enter()' value="Войти" /> </td>
</tr>
</table></div> <div id='filter' style="display: none">
Дата актуализации <input type="date" id=actDate>
Год <select id=year></select>
Поколение <select id=generation></select>
Форма <select id=forma></select>
Уровень <select id=grade></select>
Направление <select id=direct></select>
ООП <select id=bep></select>
Факультет <select id=faculty></select>
<input type=button onClick='show()' value='Показать'><br>
</div> <div id='mode' style="display: none">
Выделять:<br><input type="checkbox" value="stud">студент<br><input type="checkbox" value="studGroup">группа<br><input type="checkbox" value="studIsBudget">бюджет<br><input type="checkbox" value="faculty">факультет<br><input type="checkbox" value="gridKurs">курс<br><input type="checkbox" value="bep">ОПВО<br><input type="checkbox" value="direct">направление<br><input type="checkbox" value="formaName">форма<br><input type="checkbox" value="generationName">поколение<br><input type="checkbox" value="gradeName">уровень<br><input type="checkbox" value="cathedra">кафедра<br><input type="checkbox" value="subjectName">дисциплина <br><input type="checkbox" value="subjectCode">блок дисциплин </div> <div id="head" style="display: none"> <h2>Статистика успеваемости</h2> <p> </div> <table border=1 id='jurnalStat' style="display: none"> <caption>не выбрано</caption> <tr title='Сортировать'> </tr> </table> </body></html>
stud.cpp
#include"../_INCLUDE/z_main.h"
#include"../_INCLUDE/z_json.h"
#include"../_INCLUDE/z_week.h"
#include"../_INCLUDE/z_filter.h"
#include"../_INCLUDE/z_sql.h"
#include"../_INCLUDE/all_sql.h"
#include"t.h"
#include<QtXml>
#include<QDomElement>
#include<QVariantList>
#include"../_include/all_sql.h"
#include"../_INCLUDE/sqlStud.h"
#include"../_INCLUDE/sqlStudGroup.h"
#include"../_INCLUDE/sqlOrder.h"
#include"../_INCLUDE/sqlDirect.h"
externconstchar*DATA;
voidstudListRaw(constQJsonObject&author,constQUrlQuery&url,QSqlDatabase*db){
QStringsql=SQL::sql(Z::Date,SQL_T::studListRaw,url);
QJsonArrayx=Z::sqlSelect(sql,db);
Z::Exit(200,x);
}
voidstudList(constQJsonObject&author,constQUrlQuery&url,QSqlDatabase*db){
QStringsql=SQL::sql(Z::Date,SQL_T::studList,url);
if(url.hasQueryItem("password")){
QStringtable=author.value("table").toString();
if(!Z::isDEBUG)
if(table!="prorektor"&&table!="decane")Z::Exit(401);
sql.replace("Stud.studBook,",
"Stud.studBook,"
"Stud.studBook+'@stud'ASstudLogin,"
"Stud.studPas,");
}
QJsonArrayx=Z::sqlSelect(sql,db);
if(url.hasQueryItem("rins"))rinsCalc(&x,"studID",url,db);
Z::Exit(200,x);
}
voidstudHistErase(constQJsonObject&author,constQUrlQuery&url,QSqlDatabase*db){
intstudHistID=url.queryItemValue("studHistID").toInt();
if(studHistID==0)
Z::Error("незаданапроводкапостуденту");
QStringtable=author.value("table").toString();
if(false||Z::isDEBUG);
elseif(table=="prorektor");
elseZ::Exit(401);
if(!Z::sqlExec(Z::sqlV(":studHistID",studHistID),
SQL::sql(Z::Date,
SQL_T::studHistErase),
db,
true))Z::Error("Ошибкаудаления");
Z::Exit(200,QString("{\"studHistID\":%1}").arg(studHistID));
}
voidstudHistList(constQJsonObject&auth,
constQUrlQuery&url,
QSqlDatabase*db){
QStringf;
if(url.hasQueryItem("last"))
//f="StudHist.studHistDate=studHist_.studHistDate_";
f="studHist_Z.studHistID=studHist.studHistID";
QStringsql=SQL::sql(Z::Date,SQL_T::studHistList,url,f);
Z::Exit(200,Z::sqlSelect(sql,db));
}
voidstudMoveList(constQJsonObject&author,constQUrlQuery&url,QSqlDatabase*db){
Z::Exit(200,
Z::sqlSelect(SQL::sql(Z::Date,
SQL_T::studMoveList,
url),
db));
}
voidstudMove(constQJsonObject&author,constQUrlQuery&url,QSqlDatabase*db){
QStringorderName=Z::strSimple(url.queryItemValue("orderName",QUrl::FullyDecoded),"-").toUpper();
if(orderName.isEmpty())
Z::Error("незаданномерприказа");
QDateorderDate=QDate::fromString(url.queryItemValue("orderDate",QUrl::FullyDecoded),"yyyy-MM-dd");
if(!orderDate.isValid())
Z::Error("незаданадатаприказа");
QJsonArrayorderContent=Z::JSON64(url.queryItemValue("orderContent")).array();
if(orderContent.isEmpty())
Z::Error("нетконтингента");
boolisAdmin=url.hasQueryItem("admin");
QStringtable=author.value("table").toString();
if(Z::isDEBUG);
elseif(isAdmin&&table!="prorektor")Z::Exit(401);
elseif(table=="prorektor");
elseif(table=="decane");
elseZ::Exit(401);
intorderID=Z::sqlRecord(SQL::sql(Z::Date,
SQL_T::orderList,
SQL::optionForce(orderName,"Order","orderName")+
SQL::optionForce(orderDate,"Order","orderDate")),
db,
true).value("orderID").toInt();
if(orderID==0)
Z::Error(QString("Приказ%1от%2ненайден").arg(orderName)
.arg(orderDate.toString(Z::DateFMT)));
struct_OLD{
QList<int>setStudID;
QList<int>setStudGroupID;
QHash<int,QJsonObject>studRaw;
QHash<int,QJsonObject>studHist;
QHash<int,QJsonObject>studGroup;
QHash<QString,int>direct;
QSet<QDate>zzz;
}old;
QDatezzz;
for(autok:orderContent){
if(k.toObject().contains("studHistDate"))
zzz=QDate::fromString(k.toObject().value("studHistDate").toString(),"yyyy-MM-dd");
elsezzz=orderDate;
if(!zzz.isValid())
Z::Error(QString("Дата(%1)неверна").arg(k.toObject().value("studHistDate").toString()));
old.zzz.insert(zzz);
old.direct.insert(k.toObject().value("directCode").toString(),0);
old.setStudID.append(k.toObject().value("studID").toInt());
old.setStudGroupID.append(k.toObject().value("studGroupID").toInt());
}
if(old.zzz.size()>1)
Z::Error(QString("Длярегистрацииприказасодержащего%1датиспользутенесколькоиттерацийсОДНОЙдатой").arg(old.zzz.size()));
old.setStudID=old.setStudID.toSet().toList();
QStrings;
inti,n;
i=0;
s=old.direct.keys().join("','");
old.direct.clear();
if(!s.isEmpty())
Z::sqlSelectCallback(SQL::sql(zzz,////СобакаstudHistDate
SQL_T::directList,
QString("ANDDirect.directCodein('%1')").arg(s)),
db,
&old,
[](constQSqlRecord&r,
void*h)->int{
_OLD*t=static_cast<_OLD*>(h);
t->direct.insert(r.value("directCode").toString(),
r.value("directID").toInt());
return0;
});
while(i<old.setStudID.length()){
n=(old.setStudID.length()-i>100)?100:(old.setStudID.length()-i);
s=Z::ListToString(old.setStudID.mid(i,n));
Z::sqlSelectCallback(SQL::sql(zzz,////СобакаstudHistDate
SQL_T::studList,
QString("ANDStud.studIDin(%1)").arg(s)),
db,
&old,
[](constQSqlRecord&r,
void*h)->int{
_OLD*t=static_cast<_OLD*>(h);
t->studHist.insert(r.value("studID").toInt(),Z::sqlRecord(r));
t->setStudGroupID.append(r.value("studGroupID").toInt());
return0;
});
Z::sqlSelectCallback(SQL::sql(zzz,////СобакаstudHistDate
SQL_T::studListRaw,
QString("ANDStud.studIDin(%1)").arg(s)),
db,
&old,
[](constQSqlRecord&r,
void*h)->int{
_OLD*t=static_cast<_OLD*>(h);
t->studRaw.insert(r.value("studID").toInt(),Z::sqlRecord(r));
return0;
});
i+=n;
}
old.setStudGroupID=old.setStudGroupID.toSet().toList();
i=0;
while(i<old.setStudGroupID.length()){
n=(old.setStudGroupID.length()-i>100)?100:(old.setStudGroupID.length()-i);
Z::sqlSelectCallback(SQL::sql(zzz,////СобакаstudHistDate
SQL_T::studGroupList,
QString("ANDstudGroup.studGroupIDin(%1)").arg(Z::ListToString(old.setStudGroupID.mid(i,n)))),
db,
&old,
[](constQSqlRecord&r,
void*h)->int{
_OLD*t=static_cast<_OLD*>(h);
t->studGroup.insert(r.value("studGroupID").toInt(),Z::sqlRecord(r));
return0;
});
i+=n;
}
struct_ORDER{
intstudMoveID;
QStringstudMoveName;
intisLearn,isAcadem,isBudget,isTG,isINO;
intprevLearn,prevAcadem,prevBudget;
intrecLearn,recAcadem,recBudget,recTG,recINO,recGender;
intrecKurs,recStudGroup,recStudName,recDirect,recBep;
static_ORDERclone(constQSqlRecord&b){
_ORDERt;
t.studMoveID=b.value("studMoveID").toInt();
t.studMoveName=b.value("studMoveName").toString();
t.isLearn=b.value("isLearn").toInt();
t.isAcadem=b.value("isAcadem").toInt();
t.isBudget=b.value("isBudget").toInt();
t.isTG=b.value("isTG").toInt();
t.isINO=b.value("isINO").toInt();
t.prevLearn=b.value("prevLearn").toInt();
t.prevAcadem=b.value("prevAcadem").toInt();
t.prevBudget=b.value("prevBudget").toInt();
t.recKurs=b.value("recKurs").toInt();
t.recStudGroup=b.value("recStudGroup").toInt();
t.recStudName=b.value("recStudName").toInt();
t.recBep=b.value("recBep").toInt();
t.recDirect=b.value("recDirect").toInt();
t.recBudget=b.value("recBudget").toInt();
t.recLearn=b.value("recLearn").toInt();
t.recAcadem=b.value("recAcadem").toInt();
t.recTG=b.value("recTG").toInt();
t.recINO=b.value("recINO").toInt();
t.recGender=b.value("recGender").toInt();
returnt;
}
};
QHash<int,_ORDER>order;
Z::sqlSelectCallback(SQL::sql(orderDate,SQL_T::studMoveList),
db,
&order,
[](constQSqlRecord&r,
void*h)->int{
QHash<int,_ORDER>*t=static_cast<QHash<int,_ORDER>*>(h);
t->insert(r.value("studMoveID").toInt(),_ORDER::clone(r));
return0;
});
QMultiMap<QString,QVariant>z;
QJsonObjectb,q,e;
intstudMoveID,studID,studGroupID,bepID,directID,kurs,kcp,gender;
QStringstudName;
QDatestudHistDate;
_ORDERt;
for(inti=0;i<orderContent.size();i++){
b=orderContent.at(i).toObject();
studMoveID=b.value("studMoveID").toInt();
if(!order.contains(studMoveID))
Z::Error(QString("Приказстипом%1ненайден").arg(studMoveID));
t=order.value(studMoveID);
if(t.recKurs==1&&!b.contains("kurs"))Z::Error("Незаданкурс");
if(t.recStudGroup==1&&!b.contains("studGroupID"))Z::Error("Незаданагруппа");
if(t.recStudName==1&&!b.contains("studName"))Z::Error("НезаданоФИО");
if(t.recBep==1&&!b.contains("bepID"))Z::Error("НезаданоОПВО");
if(t.recDirect==1&&!b.contains("directID"))Z::Error("Незаданонаправление");
if(t.recBudget==1&&!b.contains("isBudget"))Z::Error("Незаданкурс");
if(t.recLearn==1&&!b.contains("isLearn"))Z::Error("Незадано:учится/неучится");
if(t.recAcadem==1&&!b.contains("isAcadem"))Z::Error("Незадано:академ/учится");
if(t.recTG==1&&!b.contains("isTG"))Z::Error("Незадано:целевик/ОО");
if(t.recINO==1&&!b.contains("isINO"))Z::Error("Незадано:иностранец/россиянин");
if(t.recGender==1&&!b.contains("isGender"))Z::Error("Незадано:пол");
studID=b.value("studID").toInt();
if(b.contains("directID")&&b.contains("directCode"))
Z::Error(QString("Длястудентасid=%1заданыодновременнокодиIDнаправления").arg(studID));
if(b.contains("directCode"))
b.insert("directID",old.direct.value(b.value("directCode").toString()));
q=(old.studHist.contains(studID))?old.studHist.value(studID)
:old.studRaw.value(studID);
if(q.value("studIsLearn").toInt()==0&&q.value("studIsAcadem").toInt()==0)//?????лишнее
q=old.studRaw.value(studID);
if(q.isEmpty())
Z::Error(QString("Студентсid=%1ненайден").arg(studID));
kcp=(b.contains("kcp"))?b.value("kcp").toInt():q.value("kcp").toInt();
if(kcp==0)
Z::Error(QString("Студентсid=%1неимеетКЦП").arg(studID));
studName=(t.recStudName&&b.contains("studName"))?b.value("studName").toString()
:q.value("studName").toString();
if(studName.isEmpty())
Z::Error(QString("Длястудента%1требуетсяФИО").arg(studID));
gender=(t.recGender)?b.value("isGender").toInt()
:q.value("studGender").toInt();
if(gender!=1&&gender!=2)
Z::Error(QString("Длястудента%1незаданпол").arg(studID));
if(!((q.value("studIsLearn").toInt()==t.prevLearn||t.prevLearn==-1)&&
(q.value("studIsAcadem").toInt()==t.prevAcadem||t.prevAcadem==-1)&&
(q.value("studIsBudget").toInt()==t.prevBudget||t.prevBudget==-1)))
Z::Error(QString("Длястудентас%2(%1)"
"приказ(%3)неприменим").arg(studID)
.arg(studName)
.arg(t.studMoveName));
if(b.contains("studHistDate"))
studHistDate=QDate::fromString(b.value("studHistDate").toString(),
"yyyy-MM-dd");
elsestudHistDate=orderDate;
if(!studHistDate.isValid())
Z::Error(QString("Дата(%1)неверна").arg(b.value("studHistDate").toString()));
studGroupID=(t.recStudGroup&&b.contains("studGroupID"))?b.value("studGroupID").toInt()
:q.value("studGroupID").toInt();
e=old.studGroup.value(studGroupID);
if(t.recStudGroup==1&&e.isEmpty())
Z::Error(QString("Группасid=%1ненайдена").arg(studGroupID));
kurs=(t.recKurs&&b.contains("kurs"))?b.value("kurs").toInt()
:e.value("gridKurs").toInt();
if(!e.isEmpty()&&kurs!=e.value("gridKurs").toInt())
Z::Error(QString("Длястудентас%2(%1)"
"курсстудентаигруппынесогласованы").arg(studID)
.arg(studName));
directID=(t.recDirect&&b.contains("directID"))?b.value("directID").toInt()
:e.value("directID").toInt();
if(directID==0)
Z::Error(QString("Длястудентас%2(%1)"
"направлениененайдено").arg(studID)
.arg(studName));
if(!e.isEmpty()&&directID!=e.value("directID").toInt())
Z::Error(QString("Длястудентас%2(%1)"
"направлениестудентаигруппынесогласованы").arg(studID)
.arg(studName));
bepID=(t.recBep&&b.contains("bepID"))?b.value("bepID").toInt()
:e.value("bepID").toInt();
if(t.recBep==1&&bepID==0)
Z::Error(QString("Длястудентас%2(%1)"
"ОПВОненайдено").arg(studID)
.arg(studName));
if(!e.isEmpty()&&bepID!=e.value("bepID").toInt())
Z::Error(QString("Длястудентас%2(%1)"
"профильстудентаигруппынесогласованы").arg(studID)
.arg(studName));
//ЕслиbepнепустоетопроверитьdirectID
if(t.isTG==-1)
t.isTG=(b.contains("isTG"))?b.value("isTG").toInt()
:q.value("studIsTG").toInt();
if(t.isINO==-1)
t.isINO=(b.contains("isINO"))?b.value("isINO").toInt()
:q.value("studIsINO").toInt();
if(t.isLearn==-1)
t.isLearn=(b.contains("isLearn"))?b.value("isLearn").toInt()
:q.value("studIsLearn").toInt();
if(t.isAcadem==-1)
t.isAcadem=(b.contains("isAcadem"))?b.value("isAcadem").toInt()
:q.value("studIsAcadem").toInt();
if(t.isBudget==-1)
t.isBudget=(b.contains("isBudget"))?b.value("isBudget").toInt()
:q.value("studIsBudget").toInt();
z.insert(":uid",table);
z.insert(":studHistDate",studHistDate);
z.insert(":studGroupID",studGroupID);
z.insert(":studID",studID);
z.insert(":studName",studName);
z.insert(":studGender",gender);
z.insert(":directID",directID);
z.insert(":bepID",bepID);
z.insert(":kurs",kurs);
z.insert(":kcp",kcp);
if(t.isAcadem+t.isLearn>1||
t.isLearn<0||t.isAcadem<0||t.isBudget<0)
Z::Error(QString("Длястудентас%2(%1)"
"недопустимоецелевоесостояние").arg(studID)
.arg(studName));
z.insert(":studIsTG",t.isTG);
z.insert(":studIsINO",t.isINO);
z.insert(":studIsLearn",t.isLearn);
z.insert(":studIsAcadem",t.isAcadem);
z.insert(":studIsBudget",t.isBudget);
z.insert(":studMoveID",t.studMoveID);
z.insert(":orderID",orderID);
}
//ДобавитьпроверкунаповторнуюпроводкуполнойкопиистрокиStudHistивыводаIDдлянего
if(!Z::sqlExec(z,
SQL::sql(Z::Date,
SQL_T::studHistInsert),
db,
true))
Z::Error("Ошибкапроводкиприказа");
Z::Exit(200,QString("{\"orderID\":%1}").arg(orderID));
}
studHistMove.html
<!DOCTYPE html><html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<title>Движение студентов</title>
</head>
<script type="text/javascript" src="/jsscript?XXX&/_lib/base64-utf8.js&/_lib/ajax.js&/_lib/table_sort.js&/_lib/get.js&/_lib/list.js&_lib/clone.js"></script> <script>
"use strict";
var Filter;
var FilterStr;
function onFlash(e,f) {
if(f)e.setAttribute('bgcolor','#FFFF80');
else e.removeAttribute('bgcolor');
}
function onNewOrder(div) {
try {
var orderName=document.getElementById('orderName').value;
if(orderName=="") return alert("Незаданномерприказа");
var orderDate=document.getElementById('orderDate').value;
if(orderDate=="") return alert("Незаданадатаприказа");
var t=document.getElementById('orderContent');
var orderContent=[];
var r;
var d;
var T;
for(var i=1;i<t.rows.length;i++) {
if(t.rows[i].cells.length==0)continue;
r=t.rows[i];
T=t.rows[i].T;
d=t.rows[i].cells[t.rows[i].cells.length-2].getElementsByTagName("input")[0].value;
if(d!="")T.studHistDate=d;
T.kcp=parseInt(t.rows[i].cells[t.rows[i].cells.length-3].getElementsByTagName("input")[0].value);
T.isBudget=(r.cells[6].hasAttribute('bgcolor'))?1:0;
T.isLearn=(r.cells[7].hasAttribute('bgcolor'))?1:0;
T.isAcadem=(r.cells[8].hasAttribute('bgcolor'))?1:0;
T.isTG=(r.cells[9].hasAttribute('bgcolor'))?1:0;
T.isINO=(r.cells[10].hasAttribute('bgcolor'))?1:0; T.isGender=(r.cells[11].innerHTML=='М')?1:((r.cells[11].innerHTML=='Ж')?2:0); orderContent.push(T); }
var h="cmd=studMove"+
"&orderName="+encodeURIComponent(orderName)+
"&orderDate="+encodeURIComponent(orderDate)+ "&orderContent="+BASE64.encode(JSON.stringify(orderContent)); var s=Ajax.runEval("/aaa.$$$",h); if(s.orderID) return alert("Приказзарегистрированзаномером "+s.orderID);
else if(s.error)return alert(s.error);
else return alert("Ошибка");
} catch(e) { alert("Неизвестнаяошибка"); }
} function onStudNameList() {
var t=document.getElementById("studNameList").value;
var s=Ajax.runEval("/aaa.$$$","cmd=studNameToList&studNameList="+encodeURIComponent(t));
if(Array.isArray(s)) {
alert(s.length);
} else if(s.error)return alert(s.error);
else return alert("Ошибка");
} function onStudSelect(f) { var t=document.getElementById('studList');
for(var i=1;i<t.rows.length;i++)
if(f)
t.rows[i].cells[3].setAttribute('bgcolor','#FFFF00');
else if(t.rows[i].cells[3].hasAttribute("bgcolor"))
t.rows[i].cells[3].removeAttribute("bgcolor");
else
t.rows[i].cells[3].setAttribute('bgcolor','#FFFF00');
} function onStudSort(f) {
var t=document.getElementById('studList');
var r;
for(var i=1;i<t.rows.length;i++)
if(t.rows[i].cells[3].hasAttribute("bgcolor"))
t.rows[1].parentNode.insertBefore(t.rows[i],t.rows[1]);
} function onStudList(func) {
function studState(x) {
if(x.studIsLearn==1)return "учится";
if(x.studIsAcadem==1)return "академ";
return "-";
} document.getElementById('studList').innerHTML=document.getElementById('studList').rows[0].innerHTML+ "<caption>... поискстудентов...</caption>";
try { var x=Ajax.runEval("/aaa.$$$?cmd="+func+Filter.get()); if(Array.isArray(x)) {
var jsCheck="if(this.hasAttribute('bgcolor'))this.removeAttribute('bgcolor');
else this.setAttribute('bgcolor','#FFFF00')";
var s="";
for(var i=0;i<x.length;i++)
s+= "<tr onmouseover='onFlash(this,true)' onmouseout='onFlash(this,false)' "+
" studID="+x[i].studID+"studHistID="+x[i].studHistID+ " stud='"+JSON.stringify(x[i])+"'>"+ "<td>"+x[i].studHistDate+"</td>"+ "<td>"+x[i].studHistID+"</td>"+ "<td>"+x[i].studID+"</td>"+
"<td onclick=\""+jsCheck+"\">"+x[i].studName+"</td>"+"<td>"+x[i].kcp+"</td>"+ "<td>"+x[i].bepCode+"</td>"+ "<td>"+x[i].bepName+"</td>"+ "<td>"+x[i].directName+"</td>"+ "<td>"+x[i].facultyName+"</td>"+ "<td>"+x[i].formaName+"</td>"+ "<td>"+studState(x[i])+"</td>"+ "<td>"+x[i].studBook+"</td>"+ "<td>"+x[i].kurs+"</td>"+ "<td>"+x[i].studGroupName+"</td>"+"</tr>"; document.getElementById('studList').innerHTML=document.getElementById('studList').rows[0].innerHTML+ "<caption>Реестр студентов</caption>"+s; TABLE_SORT(document.getElementById("studList"));
}
else if(t.error)return alert(t.error);
else return alert("ОШИБКА");
} catch(e) { return alert("Неизвестная ошибка"); } } function onOrderMove(e) {
FilterStr.str.kurs.disabled=true; FilterStr.str.studGroupID.disabled=true; FilterStr.str.directCode.disabled=true;
FilterStr.str.forma.disabled=true;
FilterStr.str.grade.disabled=true;
FilterStr.str.bepID.disabled=true;
var p=document.getElementById('studMoveStr');
var order=p.T[p.value];
if(!order)return;
if(order.recKurs!=0)FilterStr.str.kurs.disabled=false; if(order.recStudGroup!=0)FilterStr.str.studGroupID.disabled=false; if(order.recDirect!=0)FilterStr.str.directCode.disabled=false; if(order.recBep!=0)FilterStr.str.bepID.disabled=false; if(order.recBudget!=0)FilterStr.str.isBudget.disabled=false; if(order.recDirect!=0 || order.recBep!=0) { FilterStr.str.forma.disabled=false;
FilterStr.str.grade.disabled=false;
}
}
function onX() {
function F(e,id,r) {
if(r==0)return true;
if(r==1 &&! FilterStr.str[id].value)return false;
if(FilterStr.str[id].value)e[id]=(id=='directCode')?FilterStr.str[id].value
:parseInt(FilterStr.str[id].value);
return true;
}
function Z(f,m) {
var js="if(this.hasAttribute('bgcolor')) {this.removeAttribute('bgcolor');this.innerHTML='нет';}"+
"else {this.setAttribute('bgcolor','#FFFF00');this.innerHTML='да';}";
return "<td "+
" style=\""+((m)?'font-weight:bold':'')+"\" "+
" onclick=\""+((m)?js:'')+"\" "+
((f==1)?" bgcolor='#FFFF00'":"")+"'>"+((f==1)?'да':'нет')+"</td>"; } function T(e) {
return (e.selectedIndex==-1)?"-":e.options[e.selectedIndex].text;
}
try {
var p=document.getElementById('studMoveStr');
var order=p.T[p.value];
if(!order)return;
var e={};
if(!F(e,'kurs',order.recKurs))return alert('Не задан курс');
if(!F(e,'studGroupID',order.recStudGroup))return alert('Не задана группа');
if(!F(e,'directCode',order.recDirectCode))return alert('Не задано направление');
if(!F(e,'bepID',order.recBep))return alert('Не задан профиль'); var table=document.getElementById("orderContent");
var t=document.getElementById('studList'); var erase="var el=window.event?window.event.srcElement:e.currentTarget;el.parentNode.parentNode.deleteRow(el.parentNode.rowIndex);";
var isDate="var el=window.event?window.event.srcElement:e.currentTarget;"+
"el.getElementsByTagName('input').enable=false;"; var s,r,p,studName;
var studGroupName=(e.studGroupID)?FilterStr.str.studGroupID.options[FilterStr.str.studGroupID.selectedIndex].text:"";
var z;
for(var i=1;i<t.rows.length;i++) {
if(!t.rows[i].cells[3].hasAttribute("bgcolor"))continue;
z=JSON.parse(t.rows[i].getAttribute("stud"));
p=clone(e);
p.studMoveID=order.studMoveID;
studName="";
if(order.recStudName==1)
if((studName=prompt(z.studName+". Введите новое ФИО"))=="")continue;
if(studName!="")p.studName=studName; p.studID=z.studID; p.kcp=z.kcp; s= "<tr>"+ "<td>"+order.studMoveName+"</td>"+"<td>"+p.studID+"</td>"+"<td>"+z.studName+ ((p.studName)?("<br><u>"+p.studName+"</u>"):"")+ "</td>"+ "<td>"+z.studGroupName+ ((order.recStudGroup==0)?"":("<br><b>"+studGroupName+"</b>"))+
"</td>"+
"<td>"+T(FilterStr.str.directCode)+" / "+T(FilterStr.str.bepID)+"</td>"+"<td>"+((p.kurs)?p.kurs:"")+"</td>"+ Z(z.studIsBudget,order.recBudget)+ Z(z.studIsLearn,order.recLearn)+ Z(z.studIsAcadem,order.recAcadem)+ Z(z.studIsTG,order.recTG)+ Z(z.studIsINO,order.recINO)+ "<td "+((z.studGender==1 || z.studGender==2)?" bgcolor='#FFFFAA'":'')+ ((order.recGender==1)?" onclick=\"this.innerHTML=(this.innerHTML=='М')?'Ж':((this.innerHTML=='Ж')?'М':'')\"":"")+">"+ ((z.studGender==1)?'М':((z.studGender==2)?'Ж':''))+"</td>"+ "<td>"+"<input type='number' size='4' value="+p.kcp+">"+"</td>"+"<td><input type='date' value='"+FilterStr.str.dateStr.value+"'></td>"+ "<td bgcolor='FF0000' onclick='"+erase+"'>X</td>"+ "</tr>";
r=table.insertRow(1);
r.innerHTML=s;
r.T=p;
r.R=order; t.rows[i].cells[3].removeAttribute("bgcolor");
}
}
catch(e) { return alert("Неизвестная ошибка"); }
}
function onOrderContentClear() { document.getElementById('orderContent').innerHTML=document.getElementById('orderContent').rows[0].innerHTML; }
function onLoadContinue(){
try {
var x=Ajax.runEval("/aaa.$$$?cmd=studMoveList");
if(Array.isArray(x)) {
var s=[];
for(var i=0;i<x.length;i++)
s[x[i].studMoveID]=x[i];
document.getElementById('studMoveStr').T=s;
}
else if(x.error)return alert(x.error); else return alert("ОШИБКА"); }
catch(e) { return alert("Неизвестная ошибка"); }
Filter=clone(LIST); Filter.div.date=document.getElementById('actDate'); Filter.div.kcp=document.getElementById('kcp'); Filter.div.forma=document.getElementById('forma'); Filter.div.grade=document.getElementById('grade'); Filter.div.direct=document.getElementById('direct'); Filter.div.bep=document.getElementById('bep'); Filter.div.gridKurs=document.getElementById('gridKurs'); Filter.div.faculty=document.getElementById('faculty'); Filter.div.studGroup=document.getElementById('studGroup'); Filter.div.stud=document.getElementById('stud'); Filter.init(); FilterStr=clone(LIST); // Строка приказа FilterStr.str={}; FilterStr.str.dateStr=document.getElementById('dateStr'); FilterStr.str.kurs=document.getElementById('studKursStr'); FilterStr.str.studGroupID=document.getElementById('studGroupStr'); FilterStr.str.directCode=document.getElementById('directStr'); FilterStr.str.bepID=document.getElementById('bepStr'); FilterStr.str.forma=document.getElementById('formaStr'); FilterStr.str.grade=document.getElementById('gradeStr'); // Фильтр FilterStr.div.date=document.getElementById('orderDate'); FilterStr.div.faculty=document.getElementById('facultyStr'); FilterStr.div.studGroup=document.getElementById('studGroupStr'); FilterStr.div.studMove=document.getElementById('studMoveStr'); FilterStr.div.studKurs=document.getElementById('studKursStr'); FilterStr.div.forma=document.getElementById('formaStr'); FilterStr.div.grade=document.getElementById('gradeStr'); FilterStr.div.direct=document.getElementById('directStr'); FilterStr.div.bep=document.getElementById('bepStr'); FilterStr.init(); }
function onLoad(n) { if(n==0)alert('Превышено время ожидания'); else if(typeof(XXX)=='object')onLoadContinue(); else setTimeout('onLoad('+(n-1)+');',1000);
}
</script>
<body onload="onLoad(10)">
<div style="background:#F0E68C;">
<h2>Состав приказа</h2>
<table border=1 id=orderContent> <tr> <th>Действие</th> <th>ID студента</th>
<th>ФИО студента</th>
<th>Группа</th>
<th>Направление/ОПВО</th>
<th>Курс</th>
<th>Бюджет</th>
<th>Учится</th>
<th>Академ</th>
<th>Целевик</th>
<th>Иностранец</th>
<th>Пол</th>
<th>КЦП</th>
</tr>
</table>
Номер приказа <input type="text" id=orderName>
Дата приказа <input type="date" id=orderDate>
<input type=button onClick='onNewOrder(this)' value='Внести данные'>
<input type=button onClick='onOrderContentClear()' value='Очистить приказ'>
</div>
<div style="background:#D8BFD8;">
<h3>Выберите компоненты приказа</h3>
Действие <select id=studMoveStr onchange="onOrderMove(this)" id=orderMove></select>
Дата действия <input type="date" id=dateStr>
Место учебы: факультет <select id=facultyStr></select>
группа <select id=studGroupStr filter="&month=8"></select>
курс <select id=studKursStr></select>
<br>
Профиль подготовки:
форма <select id=formaStr></select>
уровень <select id=gradeStr></select>
направление <select id=directStr></select>
...Подобные документы
Назначение создания информационной системы "Электронный журнал" для автоматизации контроля учебного процесса. Построение логической и реляционной моделей данных. Разработка клиент-серверного приложения для работы с базой данных; программная реализация.
дипломная работа [5,9 M], добавлен 19.01.2017База данных по всем занимающимся студентам, электронный журнал посещаемости и успеваемости, средства подсчета статистики и подготовки документов. Ввод из журнала оценок и посещаемости студентов, составление ведомостей. Формирование табеля успеваемости.
курсовая работа [1,7 M], добавлен 11.05.2012Разработка объектно-ориентированной модели подсистемы "StudentCount" для деканата ВУЗа (автоматизация учета студентов и их успеваемости). Для решения данной задачи использовалось CASE–средство Rational Rose, сгенерирован программный код для языка С++.
курсовая работа [2,4 M], добавлен 28.06.2011Сущность и виды СУБД Microsoft Access. Алгоритм создания базы данных сессионной успеваемости студентов ВУЗа. Проектирование форм для сводных таблиц с помощью конструктора окон. Разработка отчетов и запросов на выборку данных. Создание кнопочной формы.
курсовая работа [5,4 M], добавлен 09.05.2011Проблема повышения оперативности учета и контроля посещаемости и успеваемости студентов ЮТИ ТПУ. Разработка информационной системы, требования к ней. Информационное обеспечение задачи, автоматизация предметной области. Описание интерфейса системы.
дипломная работа [2,6 M], добавлен 17.07.2012Формирование требований к системе учета успеваемости студентов на основе рейтинговой системы. Концептуальное и логическое проектирование структуры информационного обеспечения. Реализация информационного обеспечения и тестирование программного средства.
курсовая работа [3,1 M], добавлен 28.08.2012Разработка информационной системы анализа успеваемости студентов. Особенности режима просмотра объектов с помощью редактора Visual Basic for Application. Виды диалоговых окон и основных элементов управления. Формирование диаграммы успеваемости группы.
курсовая работа [1,3 M], добавлен 28.11.2008Разработка информационной системы ВУЗа с использованием методики объектно-ориентированного моделирования UML. Анализ требований к системе. Концептуальная (содержательная) модель. Диаграмма компонентов и классов. Программная реализация приложения.
курсовая работа [797,7 K], добавлен 16.04.2014Рассмотрение этапов автоматизации процесса информирования родителей об успеваемости учеников: реализация преобразования школьного журнала в электронный вид, формирование и администрирование баз данных школьников, создание множества SMS сообщений.
дипломная работа [572,7 K], добавлен 12.05.2010Автоматизация процессов, связанных с обучением студента в университете: зачисление, учет личных данных, отчисление, выдача справок. Характеристика системы программирования Delphi 7. Методы Lookup и FindKey для поиска данных в информационной системе.
контрольная работа [1,8 M], добавлен 07.12.2010Разработка автоматизированной системы по учету студенческих работ и успеваемости студентов Ухтинского технического университета. Методическое обеспечение, информационная база АИС. Архитектура системы, генерация базы данных; пользовательский интерфейс.
дипломная работа [953,3 K], добавлен 23.09.2016Создание единой информационной сети, позволяющей эффективно хранить, обрабатывать, анализировать и использовать информацию по учету успеваемости студентов. Основные функции и формы созданной информационной системы. Экономическое обоснование проекта.
дипломная работа [1,5 M], добавлен 20.10.2013Система учета успеваемости студентов Байкальского государственного университета экономики и права. Действующая Информационная система, организация и требования к подсистеме учета успеваемости БГУЭП. Конструирование подсистемы, построение модели функций.
дипломная работа [2,2 M], добавлен 20.11.2010Разработка автоматизированной информационной системы для эффективного и быстрого обслуживания пользователей библиотеки ВУЗа. Среда разработки: MS Access. Язык программирования - VBA. Расчет технико-экономической выгоды внедрения данной технологии.
дипломная работа [304,7 K], добавлен 19.03.2010- Разработка системы учета успеваемости студентов на основе рейтинговой системы - подсистема "Кафедра"
Проектировка и создание системы, направленной на упразднение трудной и рутинной работы преподавателей, за счет централизованного хранения данных об успеваемости студентов и удобного доступа к ним. Средства реализации и тестирование программного средства.
курсовая работа [1,3 M], добавлен 28.08.2012 Общие сведения о проектировании базы данных и разборка приложений для взаимодействия с БД. Разработка проекта клиентского приложения "Электронный классный журнал" с помощью языка программирования Delphi 7. Просмотр и изменение информации базы данных.
курсовая работа [403,6 K], добавлен 24.06.2011Методика разработки объектно-ориентированной модели информационной подсистемы необходимой для учета успеваемости студентов факультета, которая спроектирована с помощью программного продукта Rational Rose 2003 и унифицированного языка моделирования UML.
курсовая работа [183,9 K], добавлен 25.06.2011Структура локальной сети. Функции участников ИС. Должностные обязанности инженера-программиста. Экспериментальное тестирование информационной системы "Электронный журнал образовательной организации". Рабочее место оператора персонального компьютера.
отчет по практике [757,1 K], добавлен 20.05.2015Создание системы управления данными для информационной системы ВУЗа с помощью MS Access. Разработка таблиц и схемы базы данных, запросов в MS SQL Server, основных форм и отчетов. Организация формы главного меню для автоматического вызова объектов БД.
курсовая работа [3,0 M], добавлен 09.04.2012Структура взаимодействия входной и выходной информации. Требования к программно-аппаратному окружению, к эргономике и технической эстетике интерфейса пользователя. Эскиз и спецификация типовых объектов управления графического интерфейса, тестирование.
курсовая работа [2,0 M], добавлен 16.02.2016