Информационная система "Электронный журнал" вуза

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 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)+"%;'>&nbsp</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>

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.