diff --git a/reports/journal.pas b/reports/journal.pas new file mode 100644 index 0000000..8f5699c --- /dev/null +++ b/reports/journal.pas @@ -0,0 +1,81 @@ +unit journal; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes, SysUtils,cgiReport,xpMemParamManagerUnit; +type + + { TRepJournal } + + TRepJournal=class(TReportCommand) + private + public + class function CommandSubClass: string; override; + procedure Prepare; override; + procedure OnFillVariables(AVariables: TxpMemParamManager); override; + end; +implementation +uses + journalscripts,commandcol; +{ TRepJournal } + +class function TRepJournal.CommandSubClass: string; +begin + Result:='journal'; +end; + +procedure TRepJournal.Prepare; +var + ReportSQL: TSQLScripts48; + TempStr : string; + +begin + inherited; + + + ReportSQL := TSQLScripts48.Create(self.Processor, GetInt('schoolyear'), + GetInt('class'), + GetInt('course'), + true); + try + ReportSQL.OneGroup := '26'; + ReportSQL.TwoGroup := '12'; + ReportSQL.ThreeGroup := '8'; + ReportSQL.FourGroup := '6'; + ReportSQL.PageStart := '1'; + ReportSQL.PageContinue := ''; + + if not (ReportSQL.CreateReport) then + begin + //Raise Exception.Create('Ошибка!!!!');; + Exit; + end; + + finally + ReportSQL.Free; + end; + +end; + +procedure TRepJournal.OnFillVariables(AVariables: TxpMemParamManager); +begin + AVariables['ClassName'] := processor.QueryValue(format('select name from group_histrory where gid=%d and school_year=%d',[getInt('class'),getInt('schoolyear')])); + AVariables['School_Year'] := 'на ' + processor.QueryValue(format('select name from school_year where xp_key=%d',[getInt('schoolyear')]))+' учебный год' + #13#10; + AVariables['ClassTeacher'] := ''; + AVariables['EmptyReport'] := true; + AVariables['TermCount'] := Processor.QueryValue('SELECT COUNT(*) FROM tmp_report_journal_SheduleTerms_terms;'); + + AVariables['StartPage'] := 0; + AVariables['ContinuePage'] := 0; + AVariables['GOU_Address'] := Processor.QueryValue('select xp_fclear_parasites(CAST(`value` AS CHAR(1000))) as a from options where `name` = ''ResidingTown'';');; + AVariables['GOU_NAME_Full'] := Processor.QueryValue('SELECT value from options WHERE name like ''GOU_FullName''') + #13#10; + +end; +Initialization + TCommandCollection.Register(TRepJournal); + +end. + diff --git a/reports/journalscripts.pas b/reports/journalscripts.pas new file mode 100644 index 0000000..c82229c --- /dev/null +++ b/reports/journalscripts.pas @@ -0,0 +1,1866 @@ +unit journalscripts; + +interface + +uses Classes, cgiDM, SysUtils, DB; + +type + + { TSQLScripts48 } + + TSQLScripts48 = class + private + StartDate, EndDate: String; + gid, cid, year: integer; + isEmpty: boolean; + isError: boolean; + Data: TNIDBDM; + + PeopleInfPageCount : integer; + MissingListenersPageCount : integer; + SheduleTermsPageCount : integer; + PerfomancePageCount : integer; + fScript: TStrings; + procedure RunScript(State: string); + procedure CreateEmptyTemplate(TableName: string; RowCount: integer); + procedure CreateEmptyCrossTab(RowTable, ColTable: string; CrossTable: String); + procedure CreateTmpAllCourses; + procedure CreateListCoursesPages; + procedure CreateMainTemplTable; + procedure CreatePeoplesOnPages; + procedure CreatePeoplesList; + procedure CreateTemplGrades; + procedure CreateLeftTable; + procedure CreateRightTable; + procedure CreateHomeWork; + procedure CreatePeopleInf; + procedure CreateMissingTable; + procedure CreateTerms; + procedure CreateSheduleTerms; + procedure CreatePerfomanceTable; + procedure CratePeoplesForDO; + procedure CreateEmptyReport; + procedure CreateEmptycontents(emptyRows: integer); + procedure CreateContetnts; + procedure CreateHealthSheet; + function CheckGroupShedule: boolean; + procedure CreateColsRows; + procedure ClearScript; + procedure CreateJournalMonitoring; + private + sqlTimeSeconds: integer; + step: integer; + + procedure AddSeconds(Sender: TObject); + procedure AddToLogFile(Str: string); + public + OneGroup, TwoGroup, ThreeGroup, FourGroup, + PageStart, PageContinue: string; + + constructor Create(AData: TNIDBDM; yearId, agid, acid: integer; Empty: boolean); + destructor Destroy; override; + + function CreateReport:boolean; + function GetSQL(ScriptNum: integer):string; + end; + +const + EmptyContentsRowsCount = 35; //Количество строк в пустом оглавлении + +implementation +uses + extTypes; +{ SQLScripts48 } + + + +procedure TSQLScripts48.AddSeconds(Sender: TObject); +begin + Inc(sqlTimeSeconds); +end; + + + +function TSQLScripts48.CheckGroupShedule: boolean; +var + SQL: string; +begin + SQL := 'SELECT COUNT(*) FROM nnz_schedule WHERE gid = ' + inttostr(gid); + Result := not (Data.QueryValue(SQL) = '0'); +end; + + + +procedure TSQLScripts48.ClearScript; +begin +end; + +procedure TSQLScripts48.CratePeoplesForDO; +var + SQL: string; +begin + //Создать 42 человека для ДО + SQL := + ' DROP TABLE IF EXISTS tmp_report_journal_DO_peoples_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_DO_peoples_t AS '+ + ' SELECT DISTINCT row_number() over (order by p.fio) AS num, p.mid, p.fio '+ + ' FROM tmp_report_main_peoples p '+ + ' ORDER BY p.fio; '+ + ' DROP TABLE IF EXISTS tmp_report_journal_DO_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_DO_peoples AS '+ + ' SELECT e.e_num num, t.mid, t.fio '+ + ' FROM tmp_report_empty_people e '+ + ' LEFT JOIN tmp_report_journal_DO_peoples_t t ON t.num = e.e_num;'; + fScript.Add(SQL); +end; + +constructor TSQLScripts48.Create(AData: TNIDBDM; yearId, agid, acid: integer; + Empty: boolean); +begin + Data := AData; + self.StartDate := TNIDBDM.DateAsSQL(Data.QueryDateValue('SELECT sy.BegDate FROM school_year sy WHERE sy.xp_key = ' + IntToStr(yearId))); + self.EndDate := TNIDBDM.DateAsSQL(Data.QueryDateValue('SELECT sy.EndDate FROM school_year sy WHERE sy.xp_key = ' + IntToStr(yearId))); + self.gid := agid; + self.cid := acid; + self.isEmpty := Empty; + isError := False; + self.year := yearId; + fScript := TStringList.Create; + step := 0; +end; + + +function TSQLScripts48.CreateReport: boolean; +begin + if OneGroup = '' then OneGroup := '26'; + if TwoGroup = '' then TwoGroup := '12'; + if ThreeGroup = '' then ThreeGroup := '8'; + if FourGroup = '' then FourGroup := '6'; + if PageStart = '' then PageStart := '1'; + + isError := True; + if not(isEmpty) then + begin + + //Создать пустой шаблон размером 42 x 26 + CreateEmptyTemplate('people',42); + CreateEmptyTemplate('lessons',26); + CreateEmptyCrossTab('people','lessons','grades'); + CreateEmptyTemplate('people_half',21); + //Получить список всех занятий по датам с предметами за период + CreateTmpAllCourses; + //Создать список занятий с датами по страницам + CreateListCoursesPages; + //Сформировать основной шаблон + CreateMainTemplTable; + //Сформировать учеников по периодам на каждую страницу + CreatePeoplesOnPages; + CreatePeoplesList; + //Соединяем учеников и добавляем оценки + CreateTemplGrades; + //Формирование списка учеников + CreateLeftTable; + //Формирование таблицы для вывода оценок + CreateRightTable; + //Добавить домашнее задание + CreateHomeWork; + //Добавить информацию об учениках + + CreatePeopleInf; + //Создать таблицу с пропусками занятий + CreateMissingTable; + //Создать выборку по периодам для текущей группы + CreateTerms; + //Формирование сводной ведомости учета посещаемости + CreateSheduleTerms; + //Заполняем сводную ведомость успеваемости обучающихся по периодам + CreatePerfomanceTable; + //Создать 42 человека для ДО + CratePeoplesForDO; + //Сформировать оглавление + CreateContetnts; + //Заполнить листок здоровья + CreateHealthSheet; + //Заполенить таблицу мониторинга журнала + CreateJournalMonitoring; + + end else + begin + CreateEmptyTemplate('people',42); + CreateEmptyTemplate('lessons',26); + CreateEmptyCrossTab('people','lessons','grades'); + + CreateEmptyReport; + //Создаёт пустое оглавление с указанным количеством строк + CreateEmptycontents(EmptyContentsRowsCount); + CreateTerms; + CreateSheduleTerms; + end; + CreateColsRows; + RunScript('Завершение'); + isError := False; + Result := not isError; +end; + +procedure TSQLScripts48.CreateColsRows; +var + SQL: string; +begin + SQL := + 'DROP TABLE IF EXISTS tmp_journal_grades_cols; '+ + 'CREATE TEMPORARY TABLE tmp_journal_grades_cols AS '+ + 'select PageNum,cid,PrintDate, date from tmp_report_journal_Right group by PageNum,cid,PrintDate,date; '+ + 'DROP TABLE IF EXISTS tmp_journal_grades_rows; '+ + 'CREATE TEMPORARY TABLE tmp_journal_grades_rows AS '+ + 'SELECT PageNum,cid,p_num,fio,deduction from tmp_report_journal_Right where fio<>'''' group by PageNum,cid,p_num,fio,deduction; '; + fScript.Add(SQL); + SQL := + 'DROP TABLE IF EXISTS tmp_journal_1st_row; '+ + 'CREATE TEMPORARY TABLE tmp_journal_1st_row AS '+ + 'SELECT c.PageNum,c.cid,c.PrintDate,c.date '+ + 'FROM tmp_journal_grades_cols c '+ + 'WHERE not exists (select 1 from tmp_report_journal_Right d where d.pagenum=c.pagenum and d.cid=c.cid and d.printdate=c.printdate and d.p_num=1);' + + 'INSERT INTO tmp_report_journal_Right(PageNum,cid,PrintDate,date,p_num, grade) '+ + 'SELECT PageNum,cid,PrintDate,date,1,null FROM tmp_journal_1st_row; '; + fScript.Add(SQL); +end; + +procedure TSQLScripts48.CreateContetnts; +var + SQL: string; + ContPage: string; + PageShift: array[0..6] of integer; + i: integer; +begin + PageShift[0] := 0; + PageShift[1] := PeopleInfPageCount; + PageShift[2] := MissingListenersPageCount; + PageShift[3] := SheduleTermsPageCount; + PageShift[4] := PerfomancePageCount; + PageShift[5] := 2; + PageShift[6] := 1; + for i :=1 to 6 do + PageShift[i] := PageShift[i]+PageShift[i-1]; + //Формирование оглавления по LMS-5328 + SQL := ' DROP TABLE IF EXISTS tmp_contents_t; ' + + ' CREATE TEMPORARY TABLE tmp_contents_t AS ' + + ' SELECT COUNT( DISTINCT PageNum) num, cs.CID, COALESCE(co.ord,200) ord ' + + ' FROM tmp_report_journal_dates cs' + + ' JOIN courses c ON c.CID = cs.CID' + + ' LEFT JOIN (SELECT DISTINCT cid, ord FROM tmp_report_journal_Left) co ON co.cid = c.cid ' + + ' GROUP BY cs.CID ' + + ' ORDER BY ord, cid, PageNum; '+ + + ' DROP TABLE IF EXISTS tmp_contents_t2; ' + + ' CREATE TEMPORARY TABLE tmp_contents_t2 AS ' + + ' SELECT sum(num) over(order by ord,cid,num) as num, null as summ, CID' + + ' FROM tmp_contents_t' + + ' ORDER BY ord, cid, num;'; + + if (PageContinue = '') or (PageContinue = '0') then + ContPage:='(SELECT MAX(summ) FROM tmp_contents_t2) ' + else + ContPage := PageContinue; + SQL := SQL + + ' DROP TABLE IF EXISTS tmp_contents; ' + + ' CREATE TEMPORARY TABLE tmp_contents AS ' + + ' (SELECT concat(upper(left(xp_Subject_Without_Year(c.Title),1)),substr(xp_Subject_Without_Year(c.Title),2)) name, cnt.num ' + + ' FROM tmp_contents_t2 cnt' + + ' JOIN courses c ON c.CID = cnt.CID' + + {' LEFT JOIN tmp_courses_2 t2 ON t2.CID = cnt.CID' + + ' LEFT JOIN tmp_courses_order co ON (UPPER(co.name) LIKE (UPPER(xp_Subject_Without_Year(c.Title))))' + + ' ORDER BY COALESCE(co.order_num,200) + IF(cntGid = 1, 0, 100)) '+ } + + //' LEFT JOIN (SELECT DISTINCT cid, ord FROM tmp_courses_3) t3 ON t3.cid = cnt.cid'+ + ' ORDER BY num, summ) '+ + + ' UNION (SELECT ''Общие сведения об обучающихся'' as name, '+ContPage+' as num)' + + ' UNION (SELECT ''Сведения о количестве уроков, пропущенных обучающимися'' as name, '+ContPage+' + ' +inttostr(PageShift[1]) + ' as num)' + + ' UNION (SELECT ''Сводная ведомость учета посещаемости'' as name,'+ContPage+' + ' +inttostr(PageShift[2]) + ' as num)' + + ' UNION (SELECT ''Сводная ведомость учета успеваемости'' as name, '+ContPage+' + ' +inttostr(PageShift[3]) + ' as num)' + + ' UNION (SELECT ''Сведения о занятиях и кружках, в факультативах и других дополнительных занятиях'' as name, '+ContPage+' + ' +inttostr(PageShift[4]) + ' as num)' + + ' UNION (SELECT ''Замечания по ведению классного журнала'' as name, '+ContPage+' + ' +inttostr(PageShift[5]) +' as num)' + + ' UNION (SELECT ''Листок здоровья'' as name, '+ContPage+' + ' +inttostr(PageShift[6]) +' as num); '; + + fScript.Add(SQL); +end; + +procedure TSQLScripts48.CreateRightTable; +var + SQL: string; +begin + //Формирование таблицы для вывода оценок + SQL := + ' DROP TABLE IF EXISTS tmp_report_journal_Right;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_Right AS '+ + ' SELECT DISTINCT CONCAT(p.cid,''00'',p.PageNum,''00'',p.p_num) + 0 AS ConStr, '+ + ' p.cid, p.PageNum, p.date, p.grade, p.p_grade orderStr, p.sheid, '+ + ' IF(p.sheid > 10000000,xp_fget_RM_term(p.sheid - 10000000),'+ + ' to_char(p.date, ''dd.mm'')) PrintDate, '+ + ' CONCAT(LPAD(CAST(p.p_num AS char(2)), 2,''0''), COALESCE(p.fio,'''')) fio, '+ + ' p.p_num, CAST('''' as CHAR(100)) deduction '+ + ' FROM tmp_report_journal_main_templ_with_peoples p '+ + ' ORDER BY p.cid, p.PageNum, ISNULL(p.date), p.date;'+ + ' CREATE INDEX PAGECID ON tmp_report_journal_Right(PageNum,cid); '; + fScript.Add(SQL); + SQL := ' CREATE INDEX index_right_cid_pn_num ON tmp_report_journal_Right(cid, PageNum, p_num); '+ + ' CREATE INDEX index_peop_cid_pn_num ON tmp_report_journal_main_templ_with_peoples (cid, PageNum, p_num); '; + fScript.Add(SQL); + SQL := ' UPDATE tmp_report_journal_Right l '+ + //' JOIN tmp_report_journal_main_templ_with_peoples p ON p.cid = l.cid and p.PageNum = l.PageNum AND p.p_num = l.p_num '+ + //' SET l.deduction = p.deduction; '; + ' SET l.deduction = (SELECT p.deduction FROM tmp_report_journal_main_templ_with_peoples p WHERE p.cid = l.cid and p.PageNum = l.PageNum AND p.p_num = l.p_num LIMIT 1);'; + fScript.Add(SQL); + SQL := ' UPDATE tmp_report_journal_Right SET deduction = '''' WHERE deduction is NULL; '; + fScript.Add(SQL); +end; + +procedure TSQLScripts48.CreateSheduleTerms; +var + SQL: string; +begin + //Формирование сводной ведомости учета посещаемости + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_SheduleTerms_terms; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_SheduleTerms_terms AS '+ + ' SELECT * FROM tmp_report_journal_terms; '+ + + ' INSERT INTO tmp_report_journal_SheduleTerms_terms '+ + ' SELECT MIN(BegDate), MAX(EndDate), ''За год'', 0'+ + ' FROM tmp_report_journal_terms; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_terms_t2; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_terms_t2 AS '+ + ' SELECT emp.e_num, t.trmid, p.mid '+ + ' FROM tmp_report_empty_people emp '+ + ' LEFT JOIN tmp_report_journal_SheduleTerms_terms t ON 1=1 '+ + ' LEFT JOIN tmp_report_page_missing_peoples p ON p.num = emp.e_num; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_terms_t3; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_terms_t3 AS '+ + ' SELECT * FROM tmp_report_journal_SheduleTerms_terms; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_terms_t4; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_terms_t4 AS '+ + ' SELECT * FROM tmp_report_journal_SheduleTerms_terms; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_full_date_missing; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_full_date_missing AS '+ + ' SELECT c.mid, c.date, SUM(IF(c.ConMissing = m.ConMissing,1,0)) AS ConMissing, SUM(IF(c.ConMissing = m.ConDisease,1,0)) ConDisease '+ + ' FROM tmp_report_journal_missing m '+ + ' JOIN tmp_report_page_peoples_dates_courses c ON '+ + ' c.mid = m.mid AND c.date = m.date AND c.ConMissing = m.ConMissing '+ + ' WHERE c.ConMissing = m.ConMissing OR c.ConMissing = m.ConDisease '+ + ' GROUP BY c.mid, c.date; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_terms_main_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_terms_main_t AS '+ + ' SELECT t.e_num, t.trmid, t.mid, xp_f_get_mid_fio(t.mid,0) fio, '+ + ' ter.title AS title, a.CntMissing, ter.BegDate, a.CntDisease, '+ + ' b.CntMissingFullDay, b.CntDiseaseFullDay '+ + ' FROM tmp_report_journal_terms_t2 t '+ + //Только пропуски + ' LEFT JOIN (SELECT mis.MID, tt.trmid, SUM(mis.ConMissing) CntMissing, SUM(mis.ConDisease) CntDisease '+ + ' FROM tmp_report_journal_missing mis '+ + ' JOIN tmp_report_journal_SheduleTerms_terms tt ON mis.date BETWEEN tt.BegDate AND tt.EndDate '+ + ' WHERE NOT mid IS NULL '+ + ' GROUP BY mis.MID, tt.trmid) a ON a.MID = t.MID AND a.trmid = t.trmid '+ + //FullDay + ' LEFT JOIN (SELECT mis.MID, tt2.trmid, SUM(mis.ConMissing) CntMissingFullDay, SUM(mis.ConDisease) CntDiseaseFullDay '+ + ' FROM tmp_report_journal_full_date_missing mis '+ + ' JOIN tmp_report_journal_terms_t4 tt2 ON mis.date BETWEEN tt2.BegDate AND tt2.EndDate '+ + ' WHERE NOT mid IS NULL '+ + ' GROUP BY mis.MID, tt2.trmid) b ON b.MID = t.MID AND b.trmid = t.trmid '+ + ' LEFT JOIN tmp_report_journal_terms_t3 ter ON ter.trmid = t.trmid; '; + fScript.Add(SQL); + SheduleTermsPageCount := 1 ; +end; + + + + +procedure TSQLScripts48.CreateEmptycontents(emptyRows: integer); +var + i: integer; + SQL: string; +begin + SQL := ' DROP TABLE IF EXISTS tmp_contents; ' + + ' CREATE TEMPORARY TABLE tmp_contents AS ' + + ' SELECT '''' as name, 0 as num; '; + fScript.Add(SQL); + SQL := ' INSERT INTO tmp_contents '+ + ' SELECT '''' as name, 0 as num; '; + for I := 0 to emptyRows - 1 do + begin + fScript.Add(SQL); + end; +end; + +procedure TSQLScripts48.CreateEmptyCrossTab(RowTable, ColTable: string; + CrossTable: String); +var + SQL: string; +begin + SQL := format( + 'DROP TABLE IF EXISTS tmp_report_empty_%0:s; '+ + 'CREATE TEMPORARY TABLE tmp_report_empty_%0:s (p_num integer, p_grade integer); ', + [CrossTable]); + fScript.Add(SQL); + SQL := format( + 'INSERT INTO tmp_report_empty_%0:s (p_num,p_grade) '+ + 'SELECT row.e_num,col.e_num FROM tmp_report_empty_%1:s col,tmp_report_empty_%2:s row ; ', + [CrossTable,ColTable,RowTable]); + fScript.Add(SQL); +end; + +procedure TSQLScripts48.CreateEmptyReport; +var + SQL: string; +begin + CreateEmptyTemplate('pages',65); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_Left; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_Left AS '+ + ' SELECT '+ + ' 0 AS ConStr, '+ + ' 0 + 0 AS fio, '+ + ' 0 AS OrderNum, '+ + ' e_num + 0 AS PageNum, '+ + ' 0 AS cid, '+ + ' ''0'' AS CourseName, '+ + ' 0 AS subGid,'+ + ' ''0'' AS mounthNames, '+ + ' 200 as ord, '+ + ' 0 AS deduction'+ + ' FROM tmp_report_empty_pages; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_monitoring_L; '+ + ' CREATE TEMPORARY TABLE tmp_monitoring_L AS '+ + ' SELECT 0 as e_num, 0 as jmid, 0 as MounthDate, 0 as checkText, 0 as IsChecked '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_monitoring_R; '+ + ' CREATE TEMPORARY TABLE tmp_monitoring_R AS '+ + ' SELECT 0 as e_num, 0 as jmid, 0 as MounthDate, 0 as checkText, 0 as IsChecked '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_Right; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_Right AS '+ + ' SELECT '+ + ' t.e_num AS PageNum, '+ + ' 0 AS ConStr, '+ + ' p_num AS fio, '+ + ' p_num AS OrderNum, '+ + //' p_num AS PrintDate, '+ + ' '' '' AS PrintDate, '+ + ' 0 AS date, '+ + ' '' '' AS grade, '+ + ' 0 AS orderStr, '+ + ' 0 AS sheid, '+ + ' 0 AS cid, '+ + ' ''0'' AS CourseName, '+ + ' 0 AS subGid, '+ + ' ''0'' AS mounthNames, '+ + ' p_num, '+ + ' '''' AS deduction ' + + ' FROM tmp_report_empty_grades '+ + ' LEFT JOIN tmp_report_empty_pages t ON 1=1 '; + fScript.Add(SQL); + // Общие сведения об обучающихся + CreateEmptyTemplate('people',42); + SQL := ' DROP TABLE IF EXISTS tmp_report_page_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_peoples AS '+ + ' SELECT DISTINCT '+ + ' e_num / 21 + 1 as ordPage, '+ + ' e_num % 21 + 1 as ordNum, '+ + ' e_num as num, '+ + ' '' '' personalNum, '+ + ' 0 AS mid, '' '' AS fio, '' '' AS Sex, '' '' AS Birthday, '+ + ' '' '' as FamilyFIO, '' '' as FamilyWork, '' '' as HomeAdr '+ + ' FROM tmp_report_empty_people p; '; + fScript.Add(SQL); + // Сведения о количестве пропущенных уроков + CreateEmptyCrossTab('people','pages','main'); + CreateEmptyTemplate('terms',4); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_missing; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_missing AS '+ + ' SELECT DISTINCT '+ + ' t.e_num + 0 AS ordPage, '+ + //' 1 AS ordPage, '+ + ' p_grade AS ordNum, '+ + ' 0 AS mid, '+ + ' ''0'' AS PrintDate1, '+ + ' p_num AS date, '+ + ' '' '' AS ConMissing, '+ + ' 0 AS ConDisease '+ + //' p_grade AS fio, '+ + //' p_num AS PrintDate, '+ + ''+ + ' FROM tmp_report_empty_grades '+ + ' LEFT JOIN tmp_report_empty_terms t ON 1=1 '; + //' FROM tmp_report_empty_65 t; '; + fScript.Add(SQL); + // Сводная ведомость успеваемости + SQL := ' DROP TABLE IF EXISTS tmp_report_perfomance_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_perfomance_t AS '+ + ' SELECT ''I четверть'' AS title, 1 AS Ord '+ + ' UNION SELECT ''II четверть'' AS title, 2 AS Ord '+ + ' UNION SELECT ''III четверть'' AS title, 3 AS Ord '+ + ' UNION SELECT ''IV четверть'' AS title, 4 AS Ord '+ + ' UNION SELECT ''Год. оценка'' AS title, 5 AS Ord '+ + ' UNION SELECT ''Экз. оценка'' AS title, 6 AS Ord '+ + ' UNION SELECT ''Итог. оценка'' AS title, 7 AS Ord ; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_peoples AS '+ + ' SELECT 0 AS mid, 0 as page; '; + fScript.Add(SQL); + CreateEmptyTemplate('periods',6); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_main_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_main_t AS '+ + ' SELECT * '+ + ' FROM tmp_report_empty_periods '+ + ' LEFT JOIN tmp_report_perfomance_t ON 1=1; '; + fScript.Add(SQL); + CreateEmptyTemplate('courses',18); + CreateEmptyTemplate('perf_pages',7); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_main; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_main AS '+ + ' SELECT DISTINCT '+ + ' '' '' AS fio, '+ + ' m.title as termname, '+ + //' m.e_num AS OrderNum, '+ + ' 6 * (t.e_num - 1) + m.e_num AS OrderNum, '+ + ' m.Ord AS TermOrder, '+ + ' m.Ord AS trmtid, '+ + ' m.Ord AS trmid, '+ + ' m.e_num as mid, '+ + //' t.e_num + 0 AS page, '+ + ' t.e_num AS page, '+ + ' 0 AS PeopPage, '+ + ' 0 as cid, '+ + //' n.e_num AS CourseName, '+ + ' n.e_num AS CourseName, '+ + ' 0 AS BegDate, '+ + ' '' '' AS Grade, '+ + ' 0 AS OrderEnd, '+ + ' 0 AS councilDecisionMode, '+ + ' 0 as toYear, '+ + ' '''' as toText, '+ + ' '''' as protocolNumber, '+ + ' '''' as prikazNumber, '+ + ' CAST(NULL AS date) protocolDate, '+ + ' CAST(NULL AS date) prikazDate, '+ + ' 7 as midCount '+ + ' FROM tmp_report_journal_perfomance_main_t m'+ + ' LEFT JOIN tmp_report_empty_perf_pages t ON 1=1 '+ + ' LEFT JOIN tmp_report_empty_courses n ON 1=1 '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_page_missing_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_missing_peoples AS '+ + ' SELECT DISTINCT 1 num, 0 mid; '; + fScript.Add(SQL); + CreateEmptyTemplate('lessons',26); + + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_3;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_3 AS '+ + ' SELECT 0 AS ConStr2, '' '' as date, '' '' as text, '' '' as TemaPlanText, 0 as tMain, '+ + ' CONCAT(t.e_num * 1000,0) + 0 AS ConStrPage, '+ + ' '' '' teacherFIO, '+ + ' '' '' SUBteacherFIO, 0 mainGid, 0 as SHEID,null as PrintDate, 0 as part '+ + ' FROM tmp_report_empty_lessons '+ + ' LEFT JOIN tmp_report_empty_pages t ON 1=1; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_3_group_counter;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_3_group_counter AS '+ + ' SELECT 0 as ConStrPage, 0 as cn '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_4;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_4 AS '+ + ' SELECT 0 AS ConStr2, '' '' as date, '' '' as text, '' '' as TemaPlanText, 0 as tMain, '+ + ' 1000 AS ConStrPage, '+ + ' '' '' teacherFIO, '+ + ' '' '' SUBteacherFIO, 0 mainGid, 0 as SHEID, null as PrintDate,0 as part '+ + ' FROM tmp_report_empty_lessons t; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_4_group_counter;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_4_group_counter AS '+ + ' SELECT 0 as ConStrPage, 0 as cn '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_DO_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_DO_peoples AS '+ + ' SELECT e_num num, 0 as mid, '' '' as fio '+ + ' FROM tmp_report_empty_people; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_health_sheet;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_health_sheet AS '+ + ' SELECT DISTINCT e_num num, 0 as mid, '''' as fio, '''' as yearBirthday, '+ + ' '''' as healthGroupTitle, '''' physicalTitle, '''' desk_number, '''' doctors_recommendation '+ + ' FROM tmp_report_empty_people; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_terms_main_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_terms_main_t AS '+ + ' SELECT 0 as e_num, 0 as trmid, 0 as mid, '''' as fio, '+ + ' '''' AS title, 0 as CntMissing, '''' as BegDate, '''' as CntDisease, '+ + ' 0 as CntMissingFullDay, 0 as CntDiseaseFullDay; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_page_peoples_dates_courses; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_peoples_dates_courses AS '+ + ' SELECT DISTINCT 0 AS mid, '''' AS date, 0 as ConMissing, 0 AS num; '; + fScript.Add(SQL); +end; + + +procedure TSQLScripts48.CreateEmptyTemplate(TableName: string; + RowCount: integer); +var + SQL: string; + i: integer; +begin + SQL := format( + 'DROP TABLE IF EXISTS tmp_report_empty_%0:s; '+ + 'CREATE TEMPORARY TABLE tmp_report_empty_%0:s (e_num integer); ', + [TableName]); + fScript.Add(SQL); + for i := 1 to RowCount do + fScript.Add(format('INSERT INTO tmp_report_empty_%0:s (e_num) VALUES (%1:d); ',[TableName,i])); +end; + +procedure TSQLScripts48.CreateHealthSheet; +var + SQL: string; +begin + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_health_sheet_t;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_health_sheet_t AS '+ + ' SELECT DISTINCT p.mid, p.fio, year(xpf.Birthday) yearBirthday, '+ + ' hg.title as healthGroupTitle, '+ + ' pg.title as physicalTitle, xpf.desk_number, '+ + ' xpf.doctors_recommendation '+ + ' FROM tmp_report_journal_peoples_pages p '+ + ' LEFT JOIN xp_personal_file xpf '+ + ' ON xpf.mid = p.mid'+ + ' LEFT JOIN HealthGroup hg '+ + ' ON hg.HID = xpf.HealthGroup '+ + ' LEFT JOIN physicalgroup pg '+ + ' ON pg.pid = xpf.PhysicalGroup '+ + ' ORDER BY p.fio; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_health_sheet;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_health_sheet AS '+ + ' SELECT a.* '+ + ' FROM tmp_report_empty_people e '+ + ' LEFT JOIN (SELECT row_number() over (order by p.fio) AS num, p.* FROM tmp_report_journal_health_sheet_t p) a '+ + ' ON e.e_num = a.num;'; + fScript.Add(SQL); + runscript('Информация о здоровье'); +end; + +procedure TSQLScripts48.CreateHomeWork; +var + SQL: string; +begin + //Добавить домашнее задание + SQL := + ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_t;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_t AS '+ + ' SELECT DISTINCT dp.PageNum, dp.cid, dp.date, dp.teacher_mid MainTeacher, '+ + ' CONCAT(dp.cid,''00'',dp.PageNum,''001'') + 0 AS ConStr1, '+ + ' CONCAT(dp.cid,''00'',dp.PageNum,''002'') + 0 AS ConStr2, '+ + ' hw.teacher_mid, hw.text, ROW_NUMBER() OVER (ORDER BY dp.cid, dp.PageNum, ISNULL(dp.date),dp.date) as num, '+ + ' CONCAT(DAY(dp.date), ''.'', MONTH(dp.date)) PrintDate '+ + ' FROM tmp_report_journal_main_templ_with_peoples dp '+ + ' LEFT JOIN nnz_homework hw ON hw.sheid = dp.sheid AND hw.week_id = dp.week_id '+ + ' ORDER BY dp.cid, dp.PageNum, ISNULL(dp.date),dp.date;'; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_t2;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_t2 AS '+ + ' SELECT DISTINCT emp.e_num, t.constr1, t.constr2 '+ + ' FROM tmp_report_empty_people_half emp '+ + ' LEFT JOIN tmp_report_journal_homeWork_t t ON 1=1; '; + fScript.Add(SQL); + SQL := ' CREATE INDEX cons ON tmp_report_journal_homeWork_t(constr1,constr2); '+ + ' DROP TABLE IF EXISTS tmp_report_journal_homeWork;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork AS '+ + ' SELECT emp.e_num, emp.constr1, emp.constr2, ht.PageNum, ht.cid, ht.date, '+ + ' ht.teacher_mid, ht.text, ht.num, ht.PrintDate, ht.MainTeacher '+ + ' FROM tmp_report_journal_homeWork_t2 emp '+ + ' LEFT JOIN tmp_report_journal_homeWork_t ht ON ht.num = emp.e_num AND ht.constr1 = emp.constr1 AND ht.constr2 = emp.constr2;'; + fScript.Add(SQL); + SQL := 'DROP TABLE IF EXISTS tmp_report_stat_courses_2;'+ + 'CREATE TEMPORARY TABLE tmp_report_stat_courses_2 AS '+ + 'SELECT * FROM tmp_report_stat_courses; '; + fScript.Add(SQL); + SQL := 'CREATE INDEX templSheid ON tmp_report_journal_main_templ(sheid, week_id);'; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_3;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_3 AS '+ + 'SELECT DISTINCT CONCAT(dp.cid,''00'',dp.PageNum,''002'') + 0 AS ConStr2, dp.date, '+ + ' to_char(dp.date, ''dd.mm'') as PrintDate,'+ + 'replace(hw.text,''\r\n'','''') text, replace(o.title,''\r\n'','''') TemaPlanText, dp.teacher_mid tMain, '+ + ' CONCAT(dp.PageNum * 1000,dp.cid) + 0 AS ConStrPage, '+ + ' c.teacher_mid teacherFIO, '+ + ' xp_f_get_mid_fio(dp.subTeacher, 1) SUBteacherFIO, '+ + ' dp.mainGid, dp.cid, '+ + ' case '+ + ' when dp.week_id=9999998 then 10000000-dp.sheid '+ + ' when dp.week_id=9999999 then -1000000 '+ + ' else (SELECT period FROM nnz_schedule WHERE SHEID = dp.sheid) '+ + ' end as part, '+ + ' dp.sheid, dp.plan, dp.fact '+ + //' FROM tmp_report_journal_main_templ_with_peoples dp '+ + ' FROM ( SELECT t.cid, t.PageNum, sc.sheid, sc.date, sc.mainGid, sc.week_Id, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.teacher_mid end as teacher_mid, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.subTeacher end as subTeacher, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.plan end as plan, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.fact end as fact '+ + + ' FROM ( '+ + ' SELECT DISTINCT cid, PageNum, multySHEID, date '+ + ' FROM tmp_report_journal_main_templ_with_peoples '+ + ' WHERE NOT date IS NULL '+ + //' AND SUBSTRING_INDEX(SUBSTRING_INDEX(mainGid, '','', 1), '','', -1) <> 0 '+ + ' ) t '+ + ' LEFT JOIN tmp_report_stat_courses sc ON t.cid = sc.cid AND sc.date = t.date AND FIND_IN_SET(sc.SHEID ,t.multySHEID) <> 0 ' + //AND sc.sheid = t.multySHEID '+ + ' ) dp '+ + ' LEFT JOIN nnz_homework hw ON hw.sheid = dp.sheid AND hw.week_id = dp.week_id '+ + ' LEFT JOIN nnz_schedule_modules sm '+ + ' ON (sm.SHEID = dp.SHEID '+ + ' AND sm.week_id = dp.week_id) '+ + ' LEFT OUTER JOIN organizations o '+ + ' ON (o.oid = sm.module_id) '+ + ' JOIN (SELECT string_agg(DISTINCT xp_f_get_mid_fio(css.teacher_mid,0),'', '') as teacher_mid, t.cid,t.PageNum, css.mainGid '+ + ' FROM tmp_report_journal_main_templ t '+ + ' JOIN tmp_report_stat_courses_2 css ON css.cid = t.cid and css.week_id = t.week_id '+ + ' GROUP BY t.cid, t.PageNum, css.mainGid) c ON c.cid = dp.cid AND c.PageNum = dp.PageNum AND c.mainGid = SUBSTRING_INDEX(SUBSTRING_INDEX(dp.mainGid, '','', 1), '','', -1) '+ + ' WHERE NOT dp.date is NULL '+ + //' AND dp.SHEID < 10000000 '+ + ' Order by dp.mainGid, dp.date, part, dp.sheid; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_3_group_counter; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_3_group_counter AS '+ + ' SELECT ConStrPage, COUNT(DISTINCT mainGid) cn '+ + ' FROM tmp_report_journal_homeWork_3 '+ + ' GROUP BY ConStrPage; '; + fScript.Add(SQL); + SQL := format( + 'UPDATE tmp_report_journal_homeWork_3 t SET '+ + ' sheid = 10000000-sheid, '+ + ' PrintDate= case part when -1000000 then elt(abs(sheid) - 10000000,''Год'',''Экз'',''Итог'') else xp_fget_RM_term(-part) end, '+ + ' plan=('+ + 'select count(*) from nnz_schedule s '+ + ' join nnz_weeks w on w.sh_var_id=s.sh_var_id '+ + ' and s.day_of_week-1 between WeekDay(w.wstart_date) and WeekDay(w.wend_date) '+ + ' and w.wstart_date + (s.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' not in (select date from holidays) '+ + ' join nnz_schedule_variants v on v.sh_var_id=s.sh_var_id '+ + ' join term_weeks tw on tw.week_id=w.week_id '+ + ' join terms t on t.trmid=tw.trmid and t.year=v.s_year_id '+ + ' join courses c on c.cid=s.cid '+ + ' join groupname g on g.gid=s.gid '+ + ' left join groupname g2 on g2.gid=g.owner_gid '+ + ' join group_history gh on gh.gid=coalesce(g2.gid,g.gid) and gh.school_year=t.year and gh.term_type_id=t.term_type_id '+ + ' where case part when -1000000 then t.year=%0:s else t.trmid=-part end '+ + ' and c.cid=t.cid and g.gid=MainGid '+ + ' ), '+ + ' fact=('+ + 'select count(*) from nnz_schedule s '+ + ' join nnz_weeks w on w.sh_var_id=s.sh_var_id '+ + ' and s.day_of_week-1 between WeekDay(w.wstart_date) and WeekDay(w.wend_date) '+ + ' and w.wstart_date + (s.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' not in (select date from holidays) '+ + ' join nnz_sh_module_fact f on f.sheid=s.sheid and f.week_id=w.week_id '+ + ' join nnz_schedule_variants v on v.sh_var_id=s.sh_var_id '+ + ' join term_weeks tw on tw.week_id=w.week_id '+ + ' join terms t on t.trmid=tw.trmid and t.year=v.s_year_id '+ + ' join courses c on c.cid=s.cid '+ + ' join groupname g on g.gid=s.gid '+ + ' left join groupname g2 on g2.gid=g.owner_gid '+ + ' join group_history gh on gh.gid=coalesce(g2.gid,g.gid) and gh.school_year=t.year and gh.term_type_id=t.term_type_id '+ + ' where case part when -1000000 then t.year=%0:s else t.trmid=-part end and c.cid=t.cid and g.gid=MainGid '+ + ') '+ + 'WHERE part<0; ', + [self.year]); + fScript.Add(SQL); + SQL := + 'UPDATE tmp_report_journal_homeWork_3 SET '+ + ' TemaPlanText=concat(''Дано по плану - '', plan,'', по факту - '', fact ) '+ + 'WHERE part<0; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_4;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_4 AS '+ + 'SELECT DISTINCT CONCAT(dp.cid,''00'',dp.PageNum,''001'') + 0 AS ConStr1, dp.date, '+ + ' to_char(dp.date, ''dd.mm'') as PrintDate,'+ + 'replace(hw.text,''\r\n'','''') text, replace(o.title,''\r\n'','''') TemaPlanText, dp.teacher_mid tMain, '+ + ' CONCAT(dp.PageNum * 1000,dp.cid) + 0 AS ConStrPage, '+ + ' c.teacher_mid teacherFIO, '+ + ' xp_f_get_mid_fio(dp.subTeacher, 1) SUBteacherFIO, '+ + ' dp.mainGid, dp.cid, '+ + ' case '+ + ' when dp.week_id=9999999 then -1000000 '+ + ' when dp.week_id=9999998 then 10000000-dp.sheid '+ + ' else (SELECT period FROM nnz_schedule WHERE SHEID = dp.sheid) '+ + ' end as part, '+ + ' dp.sheid, dp.plan, dp.fact '+ + //' FROM tmp_report_journal_main_templ_with_peoples dp '+ + ' FROM ( SELECT t.cid, t.PageNum, sc.sheid, sc.date, sc.mainGid, sc.week_Id, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.teacher_mid end as teacher_mid, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.subTeacher end as subTeacher, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.plan end as plan, '+ + ' case when sc.week_id in (9999998,9999999) then null else sc.fact end as fact '+ + ' FROM ( '+ + ' SELECT DISTINCT cid, PageNum, multySHEID, date '+ + ' FROM tmp_report_journal_main_templ_with_peoples '+ + ' WHERE NOT date IS NULL '+ + //' AND SUBSTRING_INDEX(SUBSTRING_INDEX(mainGid, '','', 1), '','', -1) <> 0 '+ + ' ) t '+ + ' LEFT JOIN tmp_report_stat_courses sc ON t.cid = sc.cid AND sc.date = t.date AND FIND_IN_SET(sc.SHEID ,t.multySHEID) <> 0 ' + // AND sc.sheid = t.multySHEID '+ + ' ) dp '+ + ' LEFT JOIN nnz_homework hw ON hw.sheid = dp.sheid AND hw.week_id = dp.week_id '+ + ' LEFT JOIN nnz_schedule_modules sm '+ + ' ON (sm.SHEID = dp.SHEID '+ + ' AND sm.week_id = dp.week_id) '+ + ' LEFT OUTER JOIN organizations o '+ + ' ON (o.oid = sm.module_id) '+ + ' JOIN (SELECT string_agg(DISTINCT xp_f_get_mid_fio(css.teacher_mid,0),'', '') as teacher_mid, t.cid,t.PageNum, css.mainGid '+ + ' FROM tmp_report_journal_main_templ t '+ + ' JOIN tmp_report_stat_courses_2 css ON css.cid = t.cid and css.week_id = t.week_id '+ + ' GROUP BY t.cid, t.PageNum, css.mainGid) c ON c.cid = dp.cid AND c.PageNum = dp.PageNum AND c.mainGid = SUBSTRING_INDEX(SUBSTRING_INDEX(dp.mainGid, '','', 1), '','', -1) '+ + ' WHERE NOT dp.date is NULL and dp.PageNum = 1 AND dp.cid = (SELECT cid FROM tmp_report_journal_Left ORDER BY ord, PageNum, cid, OrderNum LIMIT 1) '+ + //' AND dp.SHEID < 10000000 '+ + ' Order by dp.mainGid, dp.date, part, dp.sheid; '+ + + ' DROP TABLE IF EXISTS tmp_report_journal_homeWork_4_group_counter;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_homeWork_4_group_counter AS '+ + ' SELECT COUNT(DISTINCT mainGid) cn '+ + ' FROM tmp_report_journal_homeWork_4; '; + fScript.Add(SQL); + SQL := format( + 'UPDATE tmp_report_journal_homeWork_4 t SET '+ + ' sheid = 10000000-sheid, '+ + ' PrintDate= case part when -1000000 then elt(abs(sheid) - 10000000,''Год'',''Экз'',''Итог'') else xp_fget_RM_term(-part) end, '+ + ' plan=('+ + 'select count(*) from nnz_schedule s '+ + ' join nnz_weeks w on w.sh_var_id=s.sh_var_id '+ + ' and s.day_of_week-1 between WeekDay(w.wstart_date) and WeekDay(w.wend_date) '+ + ' and w.wstart_date + (s.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' not in (select date from holidays) '+ + ' join nnz_schedule_variants v on v.sh_var_id=s.sh_var_id '+ + ' join term_weeks tw on tw.week_id=w.week_id '+ + ' join terms t on t.trmid=tw.trmid and t.year=v.s_year_id '+ + ' join courses c on c.cid=s.cid '+ + ' join groupname g on g.gid=s.gid '+ + ' left join groupname g2 on g2.gid=g.owner_gid '+ + ' join group_history gh on gh.gid=coalesce(g2.gid,g.gid) and gh.school_year=t.year and gh.term_type_id=t.term_type_id '+ + ' where case part when -1000000 then t.year=%0:s else t.trmid=-part end '+ + ' and c.cid=t.cid and g.gid=MainGid '+ + ' ), '+ + ' fact=('+ + 'select count(*) from nnz_schedule s '+ + ' join nnz_weeks w on w.sh_var_id=s.sh_var_id '+ + ' and s.day_of_week-1 between WeekDay(w.wstart_date) and WeekDay(w.wend_date) '+ + ' and w.wstart_date + (s.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' not in (select date from holidays) '+ + ' join nnz_sh_module_fact f on f.sheid=s.sheid and f.week_id=w.week_id '+ + ' join nnz_schedule_variants v on v.sh_var_id=s.sh_var_id '+ + ' join term_weeks tw on tw.week_id=w.week_id '+ + ' join terms t on t.trmid=tw.trmid and t.year=v.s_year_id '+ + ' join courses c on c.cid=s.cid '+ + ' join groupname g on g.gid=s.gid '+ + ' left join groupname g2 on g2.gid=g.owner_gid '+ + ' join group_history gh on gh.gid=coalesce(g2.gid,g.gid) and gh.school_year=t.year and gh.term_type_id=t.term_type_id '+ + ' where case part when -1000000 then t.year=%0:s else t.trmid=-part end '+ + ' and c.cid=t.cid and g.gid=MainGid '+ + ') '+ + 'WHERE part<0; ', + [self.year]); + fScript.Add(SQL); + SQL := + 'UPDATE tmp_report_journal_homeWork_4 SET '+ + ' TemaPlanText=concat(''Дано по плану - '', plan,'', по факту - '', fact ) '+ + 'WHERE part<0; '; + fScript.Add(SQL); + runscript('Домашняя работа'); +end; + +procedure TSQLScripts48.CreateJournalMonitoring; +var + SQL: string; + MonCount, RowsCout: integer; + CorrectionNumber: integer; +begin + //Опреедить количество замечаний по журналу + + MonCount := StrToInt( + Data.QueryValue( + Format(('SELECT COUNT(*) FROM journal_monitoring J WHERE J.gid = %0:s AND J.CheckDate BETWEEN %1:s AND %2:s; '), + [gid, StartDate, EndDate]) + ) + ); + +// if (MonCount Mod 44) = 0 then +// CorrectionNumber := 1 +// else +// CorrectionNumber := 1; + + CorrectionNumber := 1; + + RowsCout := ((MonCount Div 44) + CorrectionNumber) * 44; + + CreateEmptyTemplate('monitoring', RowsCout); + CreateEmptyTemplate('monitoring_L', Round(RowsCout/2)); + CreateEmptyTemplate('monitoring_R', Round(RowsCout/2)); + + SQL := + ' DROP TABLE IF EXISTS tmp_monitoring_main; '+ + ' CREATE TEMPORARY TABLE tmp_monitoring_main AS '+ + ' SELECT num,jmid, MounthDate,checkText,IsChecked, '+ + ' CASE WHEN(100*num / 44 %% 100 +1) >50 THEN ''R'' ELSE ''L'' END AS table_part '+ + 'FROM ( '+ + 'SELECT ROW_NUMBER() OVER (ORDER BY J.CheckDate, J.CheckCid) as num, J.jmid, '+ + ' CAST(concat( CASE MONTH(J.CheckDate) WHEN 1 THEN ''январь'' WHEN 2 THEN ''февраль'' '+ + ' WHEN 3 THEN ''март'' WHEN 4 THEN ''апрель'' WHEN 5 THEN ''май'' '+ + ' WHEN 6 THEN ''июнь'' WHEN 7 THEN ''июль'' WHEN 8 THEN ''август'' '+ + ' WHEN 9 THEN ''сентябрь'' WHEN 10 THEN ''октябрь'' WHEN 11 THEN ''ноябрь'' ELSE ''декабрь'' END, '' / '', DAY(J.CheckDate)) AS CHAR(50)) AS MounthDate, '+ + ' CONCAT(C.Name, '', '', J.CheckText) as checkText, '+ + ' xp_f_get_mid_fio(J.ExecMid, 1) AS IsChecked '+ + 'FROM out_journal_monitoring J '+ + 'LEFT JOIN out_courses C ON C.xp_key = J.CheckCid '+ + 'WHERE J.gid = 77 AND J.CheckDate BETWEEN %1:s AND %2:s '+ + 'ORDER BY J.CheckDate, J.CheckCid '+ + ') t; '; + SQL := Format(SQL, [gid, StartDate, EndDate]); + fScript.Add(SQL); + + SQL := ' DROP TABLE IF EXISTS tmp_monitoring; '+ + ' CREATE TEMPORARY TABLE tmp_monitoring AS '+ + ' SELECT t.e_num, m.jmid, m.MounthDate, m.checkText, m.IsChecked, m.table_part, '+ + ' ROW_NUMBER() OVER ( PARTITION BY table_part ORDER BY m.table_part, m.MounthDate_ as table_num '+ + ' FROM tmp_report_empty_monitoring t '+ + ' LEFT JOIN tmp_monitoring_main m ON m.num = t.e_num; '; + fScript.Add(SQL); + + SQL := ' DROP TABLE IF EXISTS tmp_monitoring_L; '+ + ' CREATE TEMPORARY TABLE tmp_monitoring_L AS '+ + ' SELECT t.e_num, m.jmid, m.MounthDate, m.checkText, m.IsChecked '+ + ' FROM tmp_report_empty_monitoring_L t '+ + ' LEFT JOIN tmp_monitoring m ON m.table_num = t.e_num AND m.table_part = ''L''; '; + fScript.Add(SQL); + + SQL := ' DROP TABLE IF EXISTS tmp_monitoring_R; '+ + ' CREATE TEMPORARY TABLE tmp_monitoring_R AS '+ + ' SELECT t.e_num, m.jmid, m.MounthDate, m.checkText, m.IsChecked '+ + ' FROM tmp_report_empty_monitoring_R t '+ + ' LEFT JOIN tmp_monitoring m ON m.table_num = t.e_num AND m.table_part = ''R''; '; + fScript.Add(SQL); + +end; + +procedure TSQLScripts48.CreateLeftTable; +var + SQL: string; +begin + SQL := ' CREATE INDEX PAGECID ON tmp_report_journal_main_templ_with_peoples(fio,p_num,PageNum,cid,subGid,date, SHEID); '+ + ' CREATE INDEX CONAME ON tmp_courses_order(name); '+ + ' CREATE INDEX t2CID ON tmp_courses_2(cid); '+ + ' CREATE INDEX stcid ON tmp_report_stat_courses(cid,title); '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_stat_courses_tmp;'+ + ' CREATE TEMPORARY TABLE tmp_report_stat_courses_tmp AS '+ + ' SELECT DISTINCT cid, title FROM tmp_report_stat_courses; '+ + ' CREATE INDEX statCcid ON tmp_report_stat_courses_tmp(cid); '; + fScript.Add(SQL); + + //Формирование списка учеников + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_Left;'+ + ' CREATE TEMPORARY TABLE tmp_report_journal_Left AS '+ + ' SELECT DISTINCT '+ + ' CONCAT(p.cid,''00'',p.PageNum,''00'',p.p_num) + 0 AS ConStr, '+ + //' p.fio, '+ + ' CONCAT(LPAD(CAST(p.p_num AS char(2)), 2,''0''), COALESCE(p.fio,'''')) fio, '+ + //' CONCAT(LPAD(CAST(p.p_num AS char(2)), 2,''0''), COALESCE(p.fio,''''),'' '', COALESCE(p.deduction, ''''),'''') fio, '+ + ' p.p_num OrderNum, p.PageNum, p.cid, xp_Subject_Without_Year(cu.title) as CourseName, p.subGid, '+ + ' CAST('' '' AS char(255)) as mounthNames, '+ + //' 200 ord '+ + //' COALESCE(co.order_num,200) ord '+ + ' COALESCE(co.ord,200) ord '+ + ' FROM tmp_report_journal_main_templ_with_peoples p '+ + //' LEFT JOIN tmp_report_stat_courses_tmp a ON a.cid = p.cid '+ + ' LEFT JOIN courses cu ON cu.cid = p.cid '+ + ' LEFT JOIN (SELECT DISTINCT cid, ord FROM tmp_courses_3) co ON co.cid = p.cid '+ + //' LEFT JOIN tmp_courses_order co ON UPPER(co.name) LIKE (UPPER(xp_Subject_Without_Year(cu.Title))) '+ + //' LEFT JOIN tmp_courses_2 t2 ON t2.CID = cu.CID '+ + ' GROUP BY p.fio, p.p_num, p.PageNum, p.cid, p.subGid ; '; + fScript.Add(SQL); + SQL := ' UPDATE tmp_report_journal_Left '+ + ' SET mounthNames = ( SELECT string_agg(DISTINCT LOWER(if (p.SHEID < 10000000, getConst(CONCAT(''Month.'',MONTH(p.date))),NULL)), '', '' ORDER BY p.date) '+ + ' FROM tmp_report_journal_main_templ_with_peoples p WHERE CONCAT(p.cid,''00'',p.PageNum,''00'',p.p_num) + 0 = tmp_report_journal_Left.ConStr) ;'; + + SQL := ' UPDATE tmp_report_journal_Left l '+ + ' JOIN ( SELECT string_agg(DISTINCT LOWER(if (p.SHEID < 10000000, getConst(CONCAT(''Month.'',MONTH(p.date))),NULL)), '', '' ORDER BY p.date) dates, '+ + ' CONCAT(p.cid,''00'',p.PageNum,''00'',p.p_num) + 0 ConStr '+ + ' FROM tmp_report_journal_main_templ_with_peoples p '+ + ' GROUP BY p.cid,p.PageNum,p.p_num '+ + ' ) b ON b.ConStr = l.ConStr '+ + ' SET mounthNames = b.dates;'; + fScript.Add(SQL); + SQL := ' CREATE INDEX PAGECID ON tmp_report_journal_Left(PageNum,cid); '; + fScript.Add(SQL); + runscript('Формирование левой части'); +end; + +procedure TSQLScripts48.CreateListCoursesPages; +var + SQL: string; +begin + //Тут сортировка по LMS-5328 + SQL := ' DROP TABLE IF EXISTS tmp_courses_order;' + + ' CREATE TEMPORARY TABLE tmp_courses_order' + + ' ( order_num int,' + + ' name varchar(255) );'; + fScript.Add(SQL); + fScript.Add( + ' INSERT INTO tmp_courses_order VALUES '+ + '(1,''Русский язык''),'+ + '(2,''Литература''),'+ + '(3,''Иностранный язык''),'+ + '(3,''Английский язык''),'+ + '(3,''Французский язык''),'+ + '(3,''Китайский язык''),'+ + '(3,''Немецкий язык''),'+ + '(3,''Английский''),'+ + '(3,''Французский''),'+ + '(3,''Китайский''),'+ + '(3,''Немецкий''),'+ + '(4,''Математика''),'+ + '(5,''Алгебра''),'+ + '(6,''Геометрия''),'+ + '(7,''Информатика''),'+ + '(8,''История России''),'+ + '(9,''Всеобщая история''),'+ + '(10,''Обществознание''),'+ + '(11,''География''),'+ + '(12,''Физика''),'+ + '(13,''Химия''),'+ + '(14,''Биология''),'+ + '(15,''Музыка''),'+ + '(16,''Изобразительное искусств''),'+ + '(17,''Технология''),'+ + '(18,''Основы безопасности жизнедеятельности''),'+ + '(19,''Физическая культура'');'); + fScript.Add( + ' DROP TABLE IF EXISTS tmp_courses_2;' + + ' CREATE TEMPORARY TABLE tmp_courses_2 AS' + + ' SELECT CID, COUNT(DISTINCT mainGid) cntGid' + + ' FROM tmp_report_stat_courses' + + ' WHERE mainGid <> 0 '+ + ' GROUP BY CID;'); + fScript.Add( + ' DROP TABLE IF EXISTS tmp_courses_3; '+ + ' CREATE TEMPORARY TABLE tmp_courses_3 AS' + + ' SELECT cs.date, cs.SHEID, cs.week_id, cs.teacher_mid, '+ + ' cs.subTeacher, cs.mainGid, cs.CID,' + + ' (COALESCE(co.order_num,200) + IF(cntGid = 1, 0, 100)) ord' + + ' FROM tmp_report_stat_courses cs' + + ' JOIN courses c ON c.CID = cs.CID' + + ' LEFT JOIN tmp_courses_2 t2 ON t2.CID = cs.CID' + + ' LEFT JOIN tmp_courses_order co ON UPPER(co.name) LIKE (UPPER(c.Title)) OR UPPER(co.name) LIKE (UPPER(cs.title));'); + fScript.Add( ' DROP TABLE IF EXISTS tmp_report_stat_courses_d; '+ + ' CREATE TEMPORARY TABLE tmp_report_stat_courses_d AS '+ + ' SELECT '+ + ' xp_part, '+ + ' MIN(SHEID) SHEID, MAX(SHEID) SHEID_MAX,'+ + ' title, '+ + ' CID, '+ + ' array_agg(teacher_mid) teacher_mid, '+ + ' week_id, '+ + ' string_agg(subTeacher, '','') subTeacher, '+ + ' date, '+ + ' array_agg(mainGid) mainGid, '+ + ' array_agg(SHEID) multySHEID '+ + ' FROM tmp_report_stat_courses tmp '+ + ' GROUP BY xp_part, title, cid, week_id, date; '); + //Создать список занятий с датами по страницам + fScript.Add( + + ' DROP TABLE IF EXISTS tmp_report_journal_dates; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_dates AS '+ + ' SELECT @max_h := CASE t.cntGid WHEN 1 THEN '+OneGroup+' WHEN 2 THEN '+TwoGroup+' WHEN 3 THEN '+ThreeGroup+' WHEN 4 THEN '+FourGroup+' ELSE '+OneGroup+' END AS MaxH, '+ + ' @hw_count := (SELECT COUNT(*) FROM nnz_schedule sh JOIN nnz_weeks w ON (sh.sh_var_id = w.sh_var_id) WHERE '+ + ' (sh.gid = cs.mainGid OR sh.gid in (SELECT gid FROM groupname WHERE owner_gid = '+inttostr(gid)+')) AND sh.cid = cs.cid '+ + ' AND cs.xp_part = sh.period '+ + ' AND w.wstart_date + (sh.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' = cs.date '+ + ' ) as HwCount, '+ + ' CASE WHEN (NOT (@cid_t = cs.CID)) THEN @page_t:=1 '+ + ' ELSE (CASE WHEN ((@hw_i >= @max_h) AND (not(cs.date = @last_date) OR (t.cntGid = 1))) THEN @page_t:=@page_t+1 ELSE @page_t END) END AS PageNum, '+ + ' CASE WHEN ((@cid_t=cs.CID) AND ((@hw_i < @max_h) OR ((cs.date = @last_date) AND (t.cntGid <> 1)))) THEN @hw_i:=@hw_i+1 ELSE @hw_i:=0 END hw_num, '+ + ' CASE WHEN (@hw_i = 0) THEN @i:=1 ELSE @i:=@i+1 END num, '+ + ' @cid_t:=cs.CID as CID, '+ + ' @last_date := cs.date as m_date, '+ + ' cs.date, '+ + ' cs.SHEID,cs.SHEID_MAX, cs.week_id, cs.teacher_mid, cs.subTeacher, cs.mainGid, cs.multySHEID '+ + ' FROM (SELECT * FROM tmp_report_stat_courses_d ORDER BY cid,date) cs '+ + ' JOIN tmp_courses_2 t ON t.cid = cs.cid '+ + //' JOIN nnz_schedule sh ON sh.sheid = cs.sheid AND sh.st_state_id <> 2 '+ + ' ORDER BY cid, date; '); + RunScript('Список дисциплин'); +end; + +procedure TSQLScripts48.CreateMainTemplTable; +var + SQL: string; +begin + //Сформировать основной шаблон + SQL := ' CREATE INDEX index_cid ON tmp_report_journal_dates(cid); '+ + ' DROP TABLE IF EXISTS tmp_report_journal_main_templ_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_main_templ_t AS '+ + ' SELECT m.p_num, m.p_grade, d.cid, d.PageNum '+ + ' FROM tmp_report_empty_grades m '+ + ' LEFT JOIN (SELECT DISTINCT CID, PageNum FROM tmp_report_journal_dates) d ON 1=1; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_main_templ; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_main_templ AS '+ + ' SELECT mt.p_num, mt.p_grade, mt.cid, mt.PageNum, '+ + ' d.date, d.SHEID,d.SHEID_MAX, d.week_id, d.teacher_mid, d.subTeacher, d.mainGid, d.multySHEID '+ + ' FROM tmp_report_journal_main_templ_t mt '+ + ' LEFT JOIN tmp_report_journal_dates d ON d.cid = mt.cid AND d.PageNum = mt.PageNum AND d.num = mt.p_grade; '; + fScript.Add(SQL); + RunScript('Формирование сетки'); +end; + +procedure TSQLScripts48.CreateMissingTable; +var + SQL: string; +begin + //Создадим таблицу с пропусками занятий + SQL := ' DROP TABLE IF EXISTS tmp_report_page_missing_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_missing_peoples AS '+ + ' SELECT row_number() over (order by fio) as num, p.mid '+ + ' FROM tmp_report_main_peoples p; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_page_missing_peoples_dates; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_missing_peoples_dates AS '+ + ' SELECT DISTINCT p.mid, p.date, COUNT(p.grade) ConMissing, SUM(if(sgv.isdisease <> 0,1,0)) ConDisease, mp.num '+ + ' FROM tmp_report_journal_main_templ_with_peoples p '+ + ' JOIN tmp_report_page_missing_peoples mp ON mp.mid = p.mid '+ + ' LEFT JOIN schedule_grades_values sgv ON xp_fget_not_grade(grade) LIKE CONCAT(''%'',TRIM(sgv.Value),''%'') '+// TRIM(sgv.Value) = Trim(grade) '+ + ' WHERE xp_fget_not_grade(grade) LIKE CONCAT(''%'',getConst(''n''),''%'') OR sgv.isdisease <> 0 '+ + ' GROUP BY p.mid, p.date, mp.num '+ + ' ORDER BY p.date; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_page_peoples_dates_courses; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_peoples_dates_courses AS '+ + ' SELECT DISTINCT p.mid, p.date, COUNT(*) ConMissing, mp.num '+ + ' FROM tmp_report_journal_main_templ_with_peoples p '+ + ' JOIN tmp_report_page_missing_peoples mp ON mp.mid = p.mid '+ + ' LEFT JOIN schedule_grades_values sgv ON TRIM(sgv.Value) = Trim(grade) '+ + ' GROUP BY p.mid, p.date, mp.num '+ + ' ORDER BY p.date; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_missing_dates; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_missing_dates AS '+ + ' SELECT DISTINCT date '+ + ' FROM tmp_report_journal_main_templ_with_peoples '+ + ' LEFT JOIN schedule_grades_values sgv ON xp_fget_not_grade(grade) LIKE CONCAT(''%'',TRIM(sgv.Value),''%'') '+// TRIM(sgv.Value) = Trim(grade) '+ + ' WHERE xp_fget_not_grade(grade) LIKE CONCAT(''%'',getConst(''n''),''%'') OR sgv.isdisease <> 0 '+ + ' ORDER BY date; '; + fScript.Add(SQL); + SQL := ' SET @i := 0;'+ + ' SET @page := 1;'+ + ' DROP TABLE IF EXISTS tmp_report_journal_missing_t1; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_missing_t1 AS '+ + ' SELECT DISTINCT IF(@i = 63, @page := @page + 1, @page) page, '+ + ' IF(@i = 63, @i := 1, @i := @i + 1 ) num, date '+ + ' FROM tmp_report_journal_missing_dates '+ + ' ORDER BY date; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_missing_t2; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_missing_t2 AS '+ + ' SELECT DISTINCT t.e_num, m.page, m.date FROM tmp_report_empty_people t '+ + ' LEFT JOIN tmp_report_journal_missing_t1 m ON 1=1; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_missing; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_missing AS '+ + ' SELECT t2.e_num ordNum, t2.page ordPage, t2.date, p.mid, pd.ConMissing, pd.ConDisease '+ + ' FROM tmp_report_journal_missing_t2 t2 '+ + ' LEFT JOIN tmp_report_page_missing_peoples p ON p.num = t2.e_num '+ + ' LEFT JOIN tmp_report_page_missing_peoples_dates pd ON pd.num = t2.e_num AND pd.date = t2.date '+ + ' ORDER BY t2.date; '; + fScript.Add(SQL); + RunScript('Пропуски занятий'); + SQL := ' SELECT COUNT(DISTINCT page) FROM tmp_report_journal_missing_t1; '; + MissingListenersPageCount := Data.QueryIntValue(SQL); + + if (Data.QueryValue('SELECT COUNT(date) FROM tmp_report_journal_missing') = '0') then + begin + SQL := ' UPDATE tmp_report_journal_missing '+ + ' SET date = ''1900-01-01'' , ordPage = 1; '; + //' VALUES (0,''1900-01-01'',0,0)'; + fScript.Add(SQL); + {SQL := ' UPDATE tmp_report_journal_missing '+ + ' SET ordPage = 1'; + //' VALUES (0,''1900-01-01'',0,0)'; + Data.ExecuteSQL(SQL); } + end; + + +end; + +procedure TSQLScripts48.CreatePeopleInf; +var + SQL: string; +begin + //Добавить информацию об учениках + SQL := ' SET @i := 0; SET @page := 1;'+ + ' DROP TABLE IF EXISTS tmp_report_page_peoples_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_peoples_t AS '+ + ' SELECT DISTINCT '+ + ' IF(@i = 22, @page := 2, @page) page, '+ + ' IF(@i = 22, @i := 1, @i := @i + 1 ) num, '+ + ' CONCAT_WS(''-'',xp.Liter,xp.Number) personalNum, '+ + ' p.mid, fio, xp.Sex, xp.Birthday, fam.FamilyFIO,fam.FamilyWork, '+ + ' replace(CONCAT_WS('', '',xp.RegistrationAddress, COALESCE(xp.`Phone home`,xp.`Phone cell`)),''\r\n'','''') HomeAdr '+ + ' FROM tmp_report_journal_peoples_pages p '+ + ' LEFT JOIN xp_Personal_File xp ON xp.mid = p.mid '+ + ' LEFT JOIN ( SELECT mid, '+ + ' STRING_AGG(DISTINCT xp_format_fio(LastName,FirstName,Patronymic,0) , '',\r\n'') FamilyFIO, '+ + ' STRING_AGG(DISTINCT CONCAT_WS('', '',NULLIF(TRIM(WorkPlace),''''),Speciality,WorkPhone) , '',\r\n'') FamilyWork '+ + ' FROM xp_personal_file_family '+ + ' WHERE LegalRepresentative = -1 '+ + ' GROUP BY mid '+ + ' ) fam ON fam.mid = p.mid '+ + ' ORDER BY fio; '; + fScript.Add(SQL); + {SQL := ' DROP TABLE IF EXISTS tmp_report_empty_21; '+ + ' CREATE TEMPORARY TABLE tmp_report_empty_21 '+ + ' SELECT e_num FROM tmp_report_empty_50 LIMIT 21; ';} + + SQL := ' DROP TABLE IF EXISTS tmp_report_page_peoples_t2; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_peoples_t2 AS '+ + ' SELECT DISTINCT empt.e_num, p.page '+ + ' FROM tmp_report_empty_people_half empt '+ + ' LEFT JOIN tmp_report_page_peoples_t p ON 1=1; '; + fScript.Add(SQL); + SQL := ' DROP TABLE IF EXISTS tmp_report_page_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_page_peoples AS '+ + ' SELECT t1.e_num ordNum, t1.page ordPage, t.*'+ + ' FROM tmp_report_page_peoples_t2 t1 '+ + ' LEFT JOIN tmp_report_page_peoples_t t ON t.num = t1.e_num AND t.page = t1.page; '; + fScript.Add(SQL); + RunScript('Список учащихся'); + SQL := ' SELECT COUNT(DISTINCT page) FROM tmp_report_page_peoples_t; '; + PeopleInfPageCount := Data.QueryIntValue(SQL); +end; + +procedure TSQLScripts48.CreatePeoplesList; +var + SQL: string; +begin + //Список всех MID + SQL := ' DROP TABLE IF EXISTS tmp_report_main_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_main_peoples AS '+ + ' SELECT DISTINCT mid, xp_f_get_mid_fio(mid,0) as fio FROM tmp_report_journal_peoples_pages '+ + ' ORDER BY xp_f_get_mid_fio(mid,0);'; + fScript.Add(SQL); +end; + +procedure TSQLScripts48.CreatePeoplesOnPages; +var + ds: TDataSet; + SQL: string; +begin + //Сформировать учеников по периодам на каждую страницу + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_peoples_pages; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_peoples_pages '+ + ' (mid int, fio varchar(255), cid int, PageNum int, OrderNum int, subGid int); '; + fScript.Add(SQL); + RunScript('Заполнение страниц'); + SQL := ' SELECT t2.cid, t2.PageNum, MIN(t2.date) stDate, MAX(t2.date) endDate '+ + ' FROM tmp_report_journal_main_templ t2 '+ + ' GROUP BY cid, PageNum ORDER BY cid, PageNum '; + with Data.GetData(SQL) do + try + while not eof do + begin + SQL := Format(' CALL xp_fill_groupuser_period(%s, %s, %s); ', + [TNIDBDM.DateAsSQL(FieldByName('stDate').AsVariant), + TNIDBDM.DateAsSQL(FieldByName('endDate').AsVariant), + gid]); + fScript.Add(SQL); + { + SQL := Format( + + ' SET @i := 0; SET @gid_t := 0; '+ + ' INSERT INTO tmp_report_journal_peoples_pages '+ + ' SELECT DISTINCT gp.mid, xp_f_get_mid_fio(gp.MID,0) AS fio, '+ + ' %s as cid, %s as PageNum, IF(gp.gid = @gid, @i := @i + 1, IF(@i = 0, @i := 1, @i := 22)) as OrderNum, '+ + ' (@gid := gp.gid) as subGid '+ + ' FROM groupuser_period gp '+ + //' WHERE CASE WHEN (SELECT )(cid = '+ FieldByName('cid').asString + ') ' + + ' WHERE CASE WHEN (SELECT COUNT(*) FROM groupuser_period_t WHERE cid = '+FieldByName('cid').asString+') = 0 '+ + ' THEN cid = -1 ELSE cid = '+FieldByName('cid').asString+' END '+ + ' ORDER BY gp.gid; ', + [FieldByName('cid').AsString, + FieldByName('PageNum').AsString]); + Data.ExecuteSQL(SQL); + } + SQL := Format( + ' DROP TABLE IF EXISTS groupuser_period_t; '+ + ' CREATE TEMPORARY TABLE groupuser_period_t AS '+ + ' SELECT * FROM groupuser_period; '+ + ' DROP TABLE IF EXISTS groupuser_period_t2; '+ + ' CREATE TEMPORARY TABLE groupuser_period_t2 AS '+ + ' SELECT DISTINCT gp.mid, xp_f_get_mid_fio(gp.MID,0) AS fio, '+ + ' %s as cid, %s as PageNum, gp.gid '+ + ' FROM groupuser_period gp '+ + ' WHERE CASE WHEN (SELECT COUNT(*) FROM groupuser_period_t WHERE cid = '+FieldByName('cid').asString+') = 0 '+ + ' THEN cid = -1 ELSE cid = '+FieldByName('cid').asString+' END '+ + ' ORDER BY gp.gid; ', + [FieldByName('cid').AsString, + FieldByName('PageNum').AsString]); + fScript.Add(SQL); + SQL := ' SET @i := 0; SET @gid_t := 0; '+ + ' SET @def_count = 0; '+ + ' SET @gid_count = '+ + ' (SELECT CASE (SELECT COUNT(DISTINCT gid) FROM groupuser_period_t2) ' + + ' WHEN 2 THEN 22 '+ + ' WHEN 3 THEN 15 '+ + ' WHEN 4 THEN 10 '+ + ' WHEN 5 THEN 8 '+ + ' ELSE 1 END); ' + + ' INSERT INTO tmp_report_journal_peoples_pages '+ + ' SELECT mid, fio, cid, PageNum, '+ + ' IF(gid = @gid_t or (@gid_count = 1 AND @i > 0), @i := @i + 1, IF(@i = 0, @i := 1, @i := @def_count := @def_count + @gid_count)) as OrderNum, '+ + ' (@gid_t := gid) as subGid '+ + ' FROM groupuser_period_t2 '+ + ' ORDER BY subGid, fio; '; + fScript.Add(SQL); + Next; + end; + Finally + Free; + end; + runscript('Заполнение страниц'); +end; + +procedure TSQLScripts48.CreatePerfomanceTable; +var + SQL: string; + tmpstr: string; + i: integer; +begin + //Заполняем сводную ведомость успеваемости обучающихся по периодам + //-- Список учеников + SQL := ' SET @i := 0; SET @page := 0; '+ + ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_peoples_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_peoples_t AS '+ + ' SELECT DISTINCT p.mid, CONCAT_WS('' '',p_t.LastName,p_t.FirstName,p_t.Patronymic) as fio '+ // p.fio '+ + ' FROM tmp_report_journal_peoples_pages p '+ + ' JOIN people p_t ON p_t.mid = p.mid '+ + ' ORDER BY p.fio; '; + fScript.Add(SQL); + + SQL := + //-- Список периодов + ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_templates; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_templates AS '+ + ' SELECT t.title, t.trmid, 1 AS TermOrder, t.BegDate, t.trmtid '+ + ' FROM tmp_report_journal_terms_periods t ORDER BY t.BegDate; '; + fScript.Add(SQL); + //begin for + for i := 1 to 3 do + begin + case i of + 1 : tmpstr := 'Год. оценка'; + 2 : tmpstr := 'Экз. оценка'; + 3 : tmpstr := 'Итог. оценка'; + end; + if Data.QueryValue( + 'SELECT IF(FIND_IN_SET('+inttostr(i)+',sy.year_grade_types) <> 0,1,0) FROM school_year sy '+ + 'WHERE sy.xp_key = ' + inttostr(year)) = '1' then + begin + SQL := + ' INSERT INTO tmp_report_journal_perfomance_templates VALUES '+ + ' ('+TNIDBDM.StringAsSQL(tmpstr)+',0,'+IntToStr(i + 1)+',NULL,'+IntToStr(i)+'); '; + //' (''Экзам. оценка'',0,3,NULL,2), (''Итоговая оценка'',0,4,NULL,3); '+ + fScript.Add(SQL); + end; + end; + //end for + SQL := + //' SET @colP = (SELECT TRUNCATE((42 / (SELECT COUNT(title) + 3 FROM tmp_report_journal_terms_periods)),0) a);'+ + ' SET @colP = (SELECT TRUNCATE((42 / (SELECT COUNT(*) FROM tmp_report_journal_perfomance_templates)),0) a);'+ + + ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_peoples AS '+ + //' SELECT IF(@i = @colP, @page := @page + 1, @page) page, '+ + ' SELECT IF(@i mod @colP = 0, @page := @page + 1, @page) page, '+ + //' IF(@i = @colP, @i := 1, @i := @i + 1 ) OrderNum, '+ + ' @i := @i + 1 OrderNum, '+ + ' t.mid, t.fio '+ + ' FROM tmp_report_journal_perfomance_peoples_t t '+ + ' ORDER BY t.fio; '; + fScript.Add(SQL); + //-- Список курсов + SQL := + ' SET @page := 1; SET @i := 0;'+ + ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_courses_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_courses_t AS '+ + ' SELECT DISTINCT c.cid, c.title '+ + ' FROM tmp_report_stat_courses c '+ + ' WHERE c.SHEID < 10000000 '+ + ' ORDER BY c.title; '; + fScript.Add(SQL); + SQL := + ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_courses; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_courses AS '+ + ' SELECT DISTINCT IF(@i = 18, @page := @page + 1, @page) page, '+ + ' IF(@i = 18, @i := 1, @i := @i + 1 ) num, '+ + ' t.cid, t.title '+ + ' FROM tmp_report_journal_perfomance_courses_t t; '; + fScript.Add(SQL); + SQL := + //-- Все ученики за все периоды по всем курсам + ' DROP TABLE IF EXISTS tmp_report_journal_perfomance_main; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_main AS '+ + ' SELECT p.mid, p.fio, p.OrderNum, t.trmid, t.title TermName, '+ + ' t.TermOrder, t.trmtid, t.BegDate, c.cid, c.title CourseName, '+ + ' c.page, CAST(0 as CHAR(50)) AS Grade, '+ + ' CASE WHEN trmtid = 7 THEN 1 '+ + ' WHEN trmtid = 8 THEN 3 '+ + ' WHEN trmtid = 9 THEN 2 '+ + ' END AS OrderEnd, '+ + ' 0 as councilDecisionMode, '+ + ' 0 as toYear, '+ + ' CAST('''' AS char(255)) toText, '+ + ' CAST('''' AS char(255)) protocolNumber, CAST('''' AS char(255)) prikazNumber, '+ + ' CAST(NULL AS date) protocolDate, CAST(NULL AS date) prikazDate, '+ + ' 0 as midCount '+ + ' FROM tmp_report_journal_perfomance_peoples p '+ + ' LEFT JOIN tmp_report_journal_perfomance_templates t ON 1=1 '+ + ' LEFT JOIN tmp_report_journal_perfomance_courses c ON 1=1; '; + fScript.Add(SQL); + SQL := + ' UPDATE tmp_report_journal_perfomance_main m '+ + ' JOIN term_grades tg ON tg.MID = m.MID AND tg.CID = m.CID AND tg.trmid = m.trmid AND tg.trmtid = m.trmtid '+ + ' SET m.grade = COALESCE(TRIM(tg.grade),0) '+ // LMS-6299/3 Выводим все проставленные оценки + ' /* WHERE '+ + ' NOT EXISTS( '+ + ' SELECT 1 '+ + ' FROM groupuser_transfer gt '+ + ' JOIN terms t ON to_date(t.term_begin, ''dd.mm.yyyy'') >= gt.xp_date '+ + ' JOIN school_year sy ON gt.xp_date BETWEEN sy.BegDate AND sy.EndDate AND sy.xp_key = '+ inttostr(year) + + ' WHERE gt.mid = m.MID '+ + ' AND t.trmid = m.trmid '+ + ' AND gt.group_from = '+inttostr(gid)+') */; '; + { + ' UPDATE tmp_report_journal_perfomance_main m '+ + ' JOIN term_grades tg ON tg.MID = m.MID AND tg.CID = m.CID AND tg.trmid = m.trmid AND tg.trmtid = 7 '+ + ' SET m.grade = TRIM(tg.grade) '+ + //' WHERE m.grade = 0; '+ + } + fScript.Add(SQL); + SQL := + ' UPDATE tmp_report_journal_perfomance_main m '+ + ' JOIN nnz_year_grades y ON y.CID = m.cid AND y.MID = m.MID AND y.s_year_id = '+inttostr(year)+' AND y.y_grtype_id = m.trmtid '+ + ' SET m.grade = TRIM(y.grade) '+ + ' WHERE not m.TermOrder = 1; '; + { + ' UPDATE tmp_report_journal_perfomance_main m '+ + ' JOIN nnz_year_grades y ON y.CID = m.cid AND y.MID = m.MID AND y.s_year_id = '+year+' AND y.y_grtype_id = 2 '+ + ' SET m.grade = TRIM(y.grade) '+ + ' WHERE m.TermOrder = 2; '+ + + ' UPDATE tmp_report_journal_perfomance_main m '+ + ' JOIN nnz_year_grades y ON y.CID = m.cid AND y.MID = m.MID AND y.s_year_id = '+year+' AND y.y_grtype_id = 3 '+ + ' SET m.grade = TRIM(y.grade) '+ + ' WHERE m.TermOrder = 3; '; + } + fScript.Add(SQL); + //-- Решение педагогического совета по формуле LMS-5637 + SQL := ' SET @current_group = '+ inttostr(gid) + ';'+ + ' DROP TABLE IF EXISTS tmp_journal_council_decision; '+ + ' CREATE TEMPORARY TABLE tmp_journal_council_decision AS '+ + ' SELECT '+ + ' mid, stats.toYear, '+ + ' stats.group_to_text, '+ + ' IF((stats.fromYear <> 0 AND stats.toYear <> 0) or (stats.xp_status = 1),1,NULL) transfer_to_next_or_other_group, '+ + ' IF(stats.fromYear <> 0 AND stats.toYear <> 0 AND isConditionally <> 0, 2,NULL) AS transfer_conditionally, '+ + ' IF(group_from <> @current_group AND group_to = @current_group AND fromYear = toYear, 3, NULL) to_current_group_frome_one_year, '+ + ' IF(group_from = @current_group AND group_to <> @current_group AND fromYear = toYear, 4, NULL) retraining, '+ + ' IF(fromYear = 9 AND toYear = 10, 5, NULL) from_9_to_10, '+ + ' IF(fromYear = 11 AND toYear = 0, 6, NULL) from_11_to_end, '+ + ' IF(xp_status = 11,7,NULL) AS certificated_end, '+ + ' IF((stats.fromYear <> 0 AND stats.toYear = 0 AND stats.xp_status in(5,6,8)),8,NULL) transfer_deduction, '+ + ' protocol_number, '+ + ' protocol_date, '+ + ' prikaz_number, '+ + ' prikaz_date '+ + ' FROM '+ + ' ( '+ + ' SELECT ggt.mid, '+ + ' COALESCE(xp_fget_group_year(ggt.group_from,sy.xp_key),0) fromYear, '+ + ' COALESCE(xp_fget_group_year(ggt.group_to,sy.xp_key),0) toYear, '+ + ' ggt.group_from, '+ + ' ggt.group_to, '+ + ' ggt.group_to_text, '+ + ' ggt.xp_status, '+ + ' ggt.isConditionally, '+ + ' ggt.protocol_number, '+ + ' ggt.protocol_date, '+ + ' ggt.Prikaz prikaz_number, '+ + ' ggt.xp_date prikaz_date '+ + ' FROM groupuser_transfer ggt '+ + ' JOIN '+ + ' ( '+ + ' SELECT '+ + ' MAX(gt.xp_key) xp_key, gt.mid '+ + 'FROM school_year sy '+ + ' JOIN groupuser_transfer gt ON (gt.group_from = @current_group OR gt.group_to = @current_group OR gt.xp_status = 1) '+ +// переводы от началп первого уч. периода года до первого уч. периода следующего года + ' and gt.xp_date > coalesce((select min(to_date(term_begin,''dd.mm.yyyy'')) from terms t where t.year=sy.xp_key), sy.begdate) '+ + ' and gt.xp_date < coalesce( (select min(to_date(term_begin,''dd.mm.yyyy'')) from terms t join school_year y on y.xp_key=t.year where y.begdate>sy.enddate), sy.enddate) '+ + 'WHERE sy.xp_key= '+ inttostr(year) + + ' GROUP BY gt.mid '+ + ' ) addGt ON addGt.xp_key = ggt.xp_key '+ + ' JOIN school_year sy ON ggt.xp_date BETWEEN sy.BegDate AND sy.EndDate '+ + ' ) stats; '; + fScript.Add(SQL); + SQL := + 'UPDATE tmp_report_journal_perfomance_main m '+ + ' JOIN tmp_journal_council_decision t ON m.mid = t.mid '+ + ' SET m.councilDecisionMode = COALESCE(t.transfer_deduction, '+ + ' t.transfer_to_next_or_other_group, '+ + ' t.transfer_conditionally, '+ + ' t.to_current_group_frome_one_year, '+ + ' t.retraining, '+ + ' t.from_9_to_10, '+ + ' t.from_11_to_end, '+ + ' t.certificated_end, 0), '+ + ' m.toYear = t.toYear, '+ + ' m.toText = t.group_to_text, '+ + ' m.protocolNumber = t.protocol_number, '+ + ' m.protocolDate = t.protocol_date, '+ + ' m.prikazNumber = t.prikaz_number, '+ + ' m.prikazDate = t.prikaz_date; '; + fScript.Add(SQL); + SQL := {' DROP TABLE IF EXISTS tmp_report_journal_perfomance_main_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_perfomance_main_t '+ + ' SELECT COUNT(mid) cnt, mid FROM tmp_report_journal_perfomance_main '+ + ' GROUP BY mid; '+ } + + ' UPDATE tmp_report_journal_perfomance_main m '+ + //' JOIN tmp_report_journal_perfomance_main_t t ON m.mid = t.mid '+ + ' SET m.midCount = (SELECT COUNT(*) FROM tmp_report_journal_perfomance_templates); '; + fScript.Add(SQL); + RunScript('Сводная таблица'); + //SQL := ' SELECT COUNT(DISTINCT page) FROM tmp_report_journal_perfomance_peoples; '; + SQL := ' SELECT COUNT(DISTINCT page) * (SELECT MAX(page) FROM tmp_report_journal_perfomance_main) FROM tmp_report_journal_perfomance_peoples; '; + PerfomancePageCount := Data.QueryIntValue(SQL); +end; + +procedure TSQLScripts48.CreateTemplGrades; +var + SQL: string; + i: integer; +begin + //Соединяем учеников и добавляем оценки + SQL := ' CREATE INDEX index_cid_pages ON tmp_report_journal_peoples_pages(cid); '; + fScript.Add(SQL); + SQL := + ' DROP TABLE IF EXISTS tmp_report_journal_main_templ_with_peoples; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_main_templ_with_peoples AS '+ + ' SELECT t.*, p.mid, p.fio, CAST('''' AS CHAR(20)) grade, p.subGid, CAST('''' AS char(100)) as deduction '+ + ' FROM tmp_report_journal_main_templ t '+ + ' LEFT JOIN tmp_report_journal_peoples_pages p ON p.cid = t.cid AND p.PageNum = t.PageNum AND p.OrderNum = t.p_num; '; + // ' LEFT JOIN nnz_sh_grades nsg ON nsg.student_mid = p.mid AND nsg.week_id = t.week_id AND FIND_IN_SET(nsg.SHEID ,t.multySHEID) <> 0 ';// AND t.multySHEID LIKE CONCAT(''%'',nsg.SHEID,''%''); '; + {' LEFT JOIN nnz_weeks w ON w.week_id=t.week_id '+ + ' LEFT JOIN nnz_schedule sh ON sh.sh_var_id=w.sh_var_id AND sh.cid=t.cid AND sh.sheid between t.sheid and t.sheid_max AND t.multySHEID LIKE CONCAT(''%'',sh.SHEID,''%'') '+ + ' LEFT JOIN nnz_sh_grades nsg ON nsg.week_id = w.week_id AND nsg.sheid=sh.sheid AND nsg.student_mid=p.mid; ';} + fScript.Add(SQL); + SQL := ' CREATE INDEX index_main_tmpl_week_id ON tmp_report_journal_main_templ_with_peoples(mid,week_id); '; + fScript.Add(SQL); + SQL := ' UPDATE tmp_report_journal_main_templ_with_peoples p '+ + ' JOIN nnz_sh_grades nsg ON nsg.student_mid = p.mid AND nsg.week_id = p.week_id AND FIND_IN_SET(nsg.SHEID ,p.multySHEID) <> 0 '+ + ' SET p.grade = nsg.grade ; '; + + fScript.Add(SQL); + SQL := ' UPDATE tmp_report_journal_main_templ_with_peoples p '+ + ' JOIN term_grades tg ON (tg.trmid + 10000000) = p.SHEID '+ + ' AND tg.mid = p.mid AND tg.trmtid = 7 '+ + ' AND tg.cid = p.cid '+ + ' SET p.grade = tg.grade; '; + fScript.Add(SQL); + + SQL := ''; + for I := 1 to 3 do + SQL := SQL + ' UPDATE tmp_report_journal_main_templ_with_peoples p '+ + ' JOIN nnz_year_grades yg ON (/*yg.s_year_id +*/ 2000000'+IntToStr(i)+') = p.SHEID '+ + ' AND yg.mid = p.mid AND yg.y_grtype_id = ' +IntToStr(i)+ + ' AND yg.cid = p.cid '+ + ' AND yg.s_year_id = '+inttostr(year) + + ' SET p.grade = yg.grade; '; + fScript.Add(SQL); + + //Отчисление + SQL := ' DROP TABLE IF EXISTS tmp_dedutions;' + + ' CREATE TEMPORARY TABLE tmp_dedutions AS ' + + ' SELECT gt.Prikaz, gt.xp_date, p.mid, p.cid, p.PageNum' + + ' FROM groupuser_transfer gt' + + ' JOIN (' + + ' SELECT MIN(t2.date) stDate, MAX(t2.date) endDate, t2.mid, t2.cid, t2.PageNum' + + ' FROM tmp_report_journal_main_templ_with_peoples t2' + + ' GROUP BY cid, PageNum, mid' + + ' ) p ON p.mid = gt.mid ' + + ' WHERE gt.xp_status = 6 ' + + ' AND gt.cid = -1' + + ' AND gt.xp_date BETWEEN p.stDate AND p.endDate;'; +//Data.ExecuteSQL(SQL); +fScript.Add(SQL); +SQL := + ' UPDATE tmp_report_journal_main_templ_with_peoples p' + + ' JOIN tmp_dedutions d ON d.MID = p.MID AND p.cid = d.cid AND p.PageNum = d.PageNum' + + ' SET deduction = LEFT(CONCAT(''(отчислен '', to_char(d.xp_date, ''dd.mm.yyyy''), '' приказ '', COALESCE(d.Prikaz, ''''), '')''),50) '+ + ' WHERE not d.mid is null ;'; + fScript.Add(SQL); + + //Перевод + SQL := ' DROP TABLE IF EXISTS tmp_dedutions;' + + ' CREATE TEMPORARY TABLE tmp_dedutions AS ' + + ' SELECT gt.Prikaz, gt.xp_date, p.mid, p.cid, p.PageNum, ' + + ' gt.group_from_text, gt.group_to_text ' + + ' FROM groupuser_transfer gt' + + ' JOIN (' + + ' SELECT MIN(t2.date) stDate, MAX(t2.date) endDate, t2.mid, t2.cid, t2.PageNum' + + ' FROM tmp_report_journal_main_templ_with_peoples t2' + + ' GROUP BY cid, PageNum, mid' + + ' ) p ON p.mid = gt.mid ' + + ' WHERE gt.xp_status = 2 ' + + ' AND gt.cid = -1' + + ' AND gt.xp_date BETWEEN p.stDate AND p.endDate;'; +//Data.ExecuteSQL(SQL); +fScript.Add(SQL); +SQL := + ' UPDATE tmp_report_journal_main_templ_with_peoples p' + + ' JOIN tmp_dedutions d ON d.MID = p.MID AND p.cid = d.cid AND p.PageNum = d.PageNum' + + ' SET deduction = LEFT(CONCAT(to_char(d.xp_date, ''dd.mm.yyyy''), '' Приказ № '', COALESCE(d.Prikaz, ''''), '' перевод из '', d.group_from_text, '' в '', d.group_to_text),50) '+ + ' WHERE not d.mid is null and (p.deduction = '''' or p.deduction is NULL);'; + fScript.Add(SQL); +RunScript('Оценки'); +end; + +procedure TSQLScripts48.CreateTerms; +var + SQL: string; +begin + //Создать выборку по периодам для текущей группы + //Рассчитано по умолчанию на четверти. + SQL := ' DROP TABLE IF EXISTS tmp_report_journal_terms; '+ + ' CREATE TEMPORARY TABLE tmp_report_journal_terms AS '+ + ' SELECT to_date(t.term_begin, ''dd.mm.yyyy'') BegDate, '+ + ' to_date(t.term_end, ''dd.mm.yyyy'') EndDate, '+ + ' t.title, t.trmid '+ + ' FROM terms t '+ + ' JOIN group_history gh ON gh.term_type_id = t.term_type_id AND gh.school_year = '+inttostr(year)+' '+ + ' WHERE t.year = '+inttostr(year)+' AND gh.gid = '+ inttostr(gid) + + ' ORDER BY CONCAT(SUBSTR(t.term_begin, 7, 4), SUBSTR(t.term_begin, 4, 2), SUBSTR(t.term_begin, 1, 2)); '; + fScript.Add(SQL); + //Текущие типы оценок за учебный период + SQL := ' DROP TABLE IF EXISTS tmp_renamed_periods; ' + + ' CREATE TEMPORARY TABLE tmp_renamed_periods ' + + ' ( trmtid int, title varchar(255) ); ' + + '' + + ' INSERT INTO tmp_renamed_periods VALUES' + + ' (7, ''''), (9, '': Зачет/экзамен''), (8, '': Итог''), (6, '': Срез'');' + + '' + + ' DROP TABLE IF EXISTS tmp_report_journal_terms_periods; ' + + ' CREATE TEMPORARY TABLE tmp_report_journal_terms_periods AS ' + + ' SELECT tt.BegDate, tt.EndDate, tt.trmid, ' + + ' CONCAT(tt.title, r.title) title, gt.trmtid' + + ' FROM tmp_report_journal_terms tt' + + ' JOIN terms t ON t.trmid = tt.trmid' + + ' JOIN term_grade_types gt ON FIND_IN_SET(gt.trmtid, t.term_grade_types)' + + ' JOIN tmp_renamed_periods r ON r.trmtid = gt.trmtid' + + ' ORDER BY tt.BegDate, gt.trmtid; '; + fScript.Add(SQL); + RunScript('Учебные периоды'); +end; + +procedure TSQLScripts48.CreateTmpAllCourses; +var + SQL: string; + I: Integer; +begin + //Получить список всех занятий по датам с предметами за период + SQL := Format( + ' DROP TABLE IF EXISTS tmp_report_stat_courses;'+ + ' CREATE TEMPORARY TABLE tmp_report_stat_courses AS '+ + ' SELECT sh.SHEID, xp_Subject_Without_Year(c.title) as title, sh.CID, IF(sh.st_state_id = 1 AND sh.subst_teacher > 0 AND sh.cid = sh.sh_subst_cid, sh.subst_teacher, sh.teacher_mid) teacher_mid, w.week_id, '+ + ' if(sh.st_state_id <> 1 OR sh.st_state_id is NULL OR sh.subst_teacher <= 0 OR sh.cid <> sh.sh_subst_cid, 0, sh.teacher_mid) subTeacher, '+ + ' w.wstart_date + (sh.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' AS date, sh.gid as mainGid, sh.period as xp_part, '+ + ' 0 as plan, '+ + ' 0 as fact '+ + ' FROM nnz_weeks w '+ + ' JOIN nnz_schedule sh ON (sh.sh_var_id = w.sh_var_id AND sh.CID <> 0) '+ + ' JOIN groupname g ON g.gid=sh.gid '+ + ' JOIN courses c ON c.cid = sh.cid '+ + ' LEFT JOIN groupname g2 ON g2.gid=g.owner_gid '+ + ' WHERE COALESCE(g2.gid,g.gid) = %2:s '+ + ' AND sh.day_of_week - 1 BETWEEN WEEKDAY(w.wstart_date) AND WEEKDAY(w.wend_date) '+ + ' AND w.wstart_date + (sh.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' BETWEEN %0:s AND %1:s '+ + ' AND NOT w.wstart_date + (sh.day_of_week - 1 -WeekDay(w.wstart_date)) * interval ''1 day'' in (SELECT date FROM holidays) '+ + ' AND (sh.cid = %3:s or %3:s = 0) ' + + ' AND (sh.st_state_id <> 2 OR sh.st_state_id is NULL) '+ + ' ORDER BY date;', + [StartDate, EndDate, gid, cid]); + fScript.Add(SQL); + + SQL := ' DROP TABLE IF EXISTS tmp_report_stat_courses_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_stat_courses_t AS '+ + ' SELECT * FROM tmp_report_stat_courses; '+ + + ' UPDATE tmp_report_stat_courses as b '+ + ' JOIN (SELECT COUNT(*) a, cid, xp_part, mainGid FROM tmp_report_stat_courses_t GROUP BY CID, xp_part, mainGid) t '+ + ' ON b.cid = t.cid and b.xp_part = t.xp_part and t.mainGid = b.mainGid '+ + ' SET plan = t.a; '+ + + ' UPDATE tmp_report_stat_courses as b '+ + ' JOIN (SELECT COUNT(*) a, tmp.cid, tmp.xp_part, tmp.mainGid FROM tmp_report_stat_courses_t tmp '+ + ' JOIN nnz_sh_module_fact f ON f.SHEID = tmp.SHEID AND f.week_id = tmp.week_id '+ + ' GROUP BY CID, xp_part, mainGid) t ON b.cid = t.cid and b.xp_part = t.xp_part and t.mainGid = b.mainGid '+ + ' SET fact = t.a; '; + + fScript.Add(SQL); + + SQL := format( + ' DROP TABLE IF EXISTS tmp_report_stat_courses_t; '+ + ' CREATE TEMPORARY TABLE tmp_report_stat_courses_t AS '+ + ' SELECT * FROM tmp_report_stat_courses; '+ + + ' INSERT INTO tmp_report_stat_courses '+ + ' SELECT DISTINCT t.trmid + 10000000 AS SHEID, '+ + ' t.title, '+ + ' cs.CID, '+ + ' 0 AS teachermid, '+ + ' 9999998 AS week_id, '+ + ' 0 AS sybteacher, '+ + ' to_date(t.term_end, ''dd.mm.yyyy'') + INTERVAL ''1 DAY'' a, '+ + ' cs.maingid, 0 as xp_part, cs.plan, cs.fact '+ + ' FROM tmp_report_stat_courses_t cs '+ + 'JOIN (SELECT cid,trmid FROM term_grades WHERE trmtid=7 GROUP BY cid,trmid) tg ON tg.cid=cs.cid '+ + ' JOIN terms t on t.trmid=tg.trmid and t.year=%0:s'+ + ' JOIN group_history gh ON gh.term_type_id = t.term_type_id AND gh.school_year = %0:s AND gh.gid = %1:s; ', + [year,gid]); + //годовые + for I := 1 to 3 do + begin + SQL := SQL + format( + ' INSERT INTO tmp_report_stat_courses '+ + ' SELECT DISTINCT /*t.xp_key +*/ 2000000'+IntToStr(i)+' AS SHEID, '+ + ' t.Name, '+ + ' cs.CID, '+ + ' 0 AS teachermid, '+ + ' 9999999 AS week_id, '+ + ' 0 AS sybteacher, '+ + ' t.EndDate + ' +inttostr(i) + ' * interval ''1 DAY'' a, '+ + ' cs.maingid, 0 as xp_part, cs.plan, cs.fact '+ + ' FROM tmp_report_stat_courses_t cs '+ + ' JOIN (SELECT s_year_id,cid FROM nnz_year_grades WHERE y_grtype_id =%0:d GROUP BY cid,s_year_id) yg ON yg.cid=cs.cid '+ + ' JOIN school_year t ON t.xp_key= yg.s_year_id AND t.xp_key=%1:s; ', + [i,year]); + end; + + fScript.Add(SQL); + + {SQL := ' SELECT '+ + CONCAT( + ( + CASE (IF(t.term_type_id = @c, @i := @i + 1, @i := 1)) + WHEN 1 THEN 'I' + WHEN 2 THEN 'II' + WHEN 3 THEN 'III' + WHEN 4 THEN 'IV' + END), ' ', + (CASE t.term_type_id + WHEN 1 THEN 'с' + WHEN 2 THEN 'т' + WHEN 3 THEN 'ч' + WHEN 4 THEN 'п' + END)) AS title, + t.trmid + + FROM terms t + + WHERE year = 25 + ORDER BY t.term_type_id, str_to_date(t.term_begin, '%d.%m.%Y') } + RunScript('Анализ расписания'); +end; + +destructor TSQLScripts48.Destroy; +begin + fScript.Free; + inherited; +end; + +function TSQLScripts48.GetSQL(ScriptNum: integer): string; +var + SQL: string; +begin + case ScriptNum of + 1: SQL := ''; + + end; +end; + + +procedure TSQLScripts48.RunScript(State: string); +var + i: integer; + iTimeOut: integer; + + //time: TTimer; + outfile: TextFile; +begin + + Inc(step); + + iTimeOut := Data.Connection.TimeOut; + Data.Connection.TimeOut := 500; + + {$IFDEF DEBUG} + AddToLogFile('/* ' + State + ' */'); + {$ENDIF} + + //time := TTimer.Create(IndicatorForm); + //time.interval := 1; + //time.OnTimer := AddSeconds; + //time.Enabled := True; + + + for i := 0 to fScript.Count-1 do + try + begin + sqlTimeSeconds := 0; + + {$IFDEF DEBUG} + AddToLogFile(fScript[i]); + {$ENDIF} + + Data.ExecuteSQL(fScript[i]); + + + //writeln(outfile, ' /* Script time: '+ IntToStr(sqlTimeSeconds) + ' ms. */ '); + end; + except on e: Exception do + begin + raise; + end; + + end; + + + Data.Connection.TimeOut := iTimeOut; + fScript.Clear; + //time.Free; +end; + +procedure TSQLScripts48.AddToLogFile(Str: string); +var + outfile: TextFile; + logfile: string; +begin + Data.log(mtExtra,self,Str); +end; + +end.