UNION
-- =============================================
-- Практики 1.5 кредита в неделю (для преддипломной - 5 кредитов)
-- =============================================
SELECT [CodExType]=CASE WHEN ISNULL(tf.CodExType,0)=0 THEN 1 ELSE tf.CodExType END,
0 AS [ExLot],
CodSub=CASE WHEN ISNULL(tf.CodSub,0)=0 THEN -1 ELSE tf.CodSub END,
1 AS [CodSubType],CodKaf, 0 AS Lec, 0 AS Sem, WorkLng*48 AS Sam,
ECTScredits=CASE WHEN NameSub LIKE 'преддипломная практика%' THEN 5 ELSE WorkLng*1.5 END
FROM [dbo].TermFlow tf
inner join StudyPlans p on tf.CodPlan=p.CodPlan
left join Subs s on tf.CodSub=s.CodSub
left join ExTypes e on tf.CodExType=e.CodExType
WHERE tf.CodPerType=4 AND
tf.Course=@Course and tf.NumTerm=@NumTerm
AND ((@CodPlan IS NULL) OR (tf.CodPlan = @CodPlan))
open EL
select @CodOrganization = @COrganization, @CodPrep = NULL
fetch next from EL into @CodExType, @ExLot, @CodSub, @CodSubType, @CodKaf, @Lec, @Sem, @Sam, @ECTScredits
while (@@fetch_status <> -1)
begin
IF (@@fetch_status <> -2)
begin
execute dbo.e_DetectCodVar @CodSub, @CodSubType, @CodOrganization, @CodKaf, @Lec, @Sem, @Sam, @ECTScredits, @CodVar output
if @CodVar > 0 and not exists(select * from dbo.ExList e, dbo.HoursVars h where e.CodVar = h.CodVar and
e.CodGrup = @CodGrup and e.Course = @Course and e.NumTerm = @NumTerm and e.CodExType = @CodExType and h.CodSub = @CodSub)
insert dbo.ExList values (@CodGrup, @Course, @NumTerm, @CodExType, @CodPrep, @ExLot, @CodVar)
end
fetch next from EL into @CodExType, @ExLot, @CodSub, @CodSubType, @CodKaf, @Lec, @Sem, @Sam, @ECTScredits
end
deallocate EL
CREATE PROCEDURE [dbo].[Web_GetEstimations] (@CodStudent int)
AS
/*
Возвращает оценки по студенту
Зубков Андрей
19.09.2007
exec Web_GetEstimations 8000
*/
select Course, NumTerm, NameSub, ExType, ECTSCredits,Mark=CASE WHEN (m.CodExType=2 and Mark>2)
THEN 'зачтено' ELSE CASE WHEN Mark=5 THEN 'отлично'
WHEN Mark=4 THEN 'хорошо'
WHEN Mark=3 THEN 'удовл.' END END+'('+convert(varchar,ECTSMark)+')'
from analysis.s_GetMarks(@CodStudent) m
left join Subs s on m.CodSub=s.CodSub
left join ExTypes et on m.CodExType=et.CodExType
where isnull(Mark,0)>2-- is not null --alt 18.01.2008 только положительные оценки
order by Course, NumTerm, NameSub
/*
Ситник Игорь
01.12.2006
Функция возвращает список всех оценок студента из БД Analysis
(а то у студентов возникают вопросы о неправильном подсчете + здесь уже есть дипломное проектирование)
alt 07 2007 Добавлено разделение на предметы обычные и по выбору (для того, чтобы выбрать оценку и нагрузку только по одному из них)
*/
CREATE FUNCTION [dbo].[s_GetMarks](@CodStudent int=0)
RETURNS
@Marks TABLE(Course tinyint,NumTerm tinyint, CodSub int,CodSubType tinyint, CodExType tinyint, Mark tinyint, ECTSMark smallint,ECTSCredits float, CodPrep int, InReit bit)
BEGIN
declare @CodPlan int
select top 1 @CodPlan=CodPlan from dbo.StudyMarks WHERE CodStudent =@CodStudent
declare @ExLot Table (Course tinyint, NumTerm tinyint, CodSub int, CodSubType tinyint, CodExType tinyint,
Mark int, ECTSMark int, ECTSCredits int, CodPrep int, InReit bit)
insert into @Exlot
select Course=IsNull(se.Course,sm.CourseSub), NumTerm=IsNULL(se.NumTerm,sm.NumTerm),
CodSub=IsNULL(sm.CodSub,se.CodSub), CodSubType=IsNULL(sm.CodSubType,se.CodSubType),
CodExType=IsNULL(se.CodExType,sm.CodExType), sm.Mark, sm.ECTSMark, ECTSCredits=IsNULL(se.ECTSCredits,0), sm.CodPrep, sm.InReit
from
(select * from dbo.ECTS_studyExams where CodPlan=@CodPlan AND CodSubType not in (3,4)) se
JOIN (select * from dbo.StudyMarks where CodStudent=@CodStudent) sm
on se.CodPlan=sm.CodPlan and (se.CodSub=sm.CodSub or sm.CodSub=-1)
and (se.CodSubType=sm.CodSubType or sm.CodSubType=2) and se.Course=sm.CourseSub
and se.NumTerm=sm.NumTerm and se.CodExType=sm.CodExType
where isnull(exlot,0)=1
insert into @Marks
select Course=IsNull(se.Course,sm.CourseSub), NumTerm=IsNULL(se.NumTerm,sm.NumTerm),
CodSub=IsNULL(sm.CodSub,se.CodSub), CodSubType=IsNULL(sm.CodSubType,se.CodSubType),
CodExType=IsNULL(se.CodExType,sm.CodExType), sm.Mark, sm.ECTSMark, ECTSCredits=IsNULL(se.ECTSCredits,0), sm.CodPrep, sm.InReit
--s.CodStudent, M=sum(IsNULL(sm.Mark,0)),R=case when sum(se.ECTSCredits)=0 then 0 else sum(IsNULL(ECTSMark,0)*sу.ECTSCredits)/sum(se.ECTSCredits) end
from
(select * from dbo.ECTS_studyExams where CodPlan=@CodPlan AND CodSubType not in (3,4)) se
FULL JOIN (select * from dbo.StudyMarks where CodStudent=@CodStudent) sm
on se.CodPlan=sm.CodPlan and (se.CodSub=sm.CodSub or sm.CodSub=-1) --case when sm.CodSub in (688,689) then -1 else sm.CodSub end--academia.e_GetCodSub(sm.CodSub)
and (se.CodSubType=sm.CodSubType or sm.CodSubType=2) and se.Course=sm.CourseSub
and se.NumTerm=sm.NumTerm and se.CodExType=sm.CodExType
where isnull(exlot,0)<>1
union
select * from @ExLot
return
END
/************************************************
Предназначена для работы с оценкой (в частности, вызывается в коде upExam - update на qExam)
@CodOp = 1 - удаление
@CodOp = 0 - добавление и модификация
************************************************/
CREATE PROCEDURE [dbo].[e_UpdateExam]
(
@CodOp tinyint,
@CodStudent int,
@CodKaf int,
@CodSub int,
@CodSubType tinyint,
@Course tinyint,
@NumTerm tinyint,
@CodExType tinyint,
@Mark tinyint,
@CodECTSMark smallint,
@CodPrep int,
@DateExam smalldatetime,
@CodVUZ tinyint,
@CodVar int,
@ECTScretits float
)as
BEGIN
--begin tran
--if not @Mark in (1,2,3,4,5) return
--Удаление
IF @CodOp=1
begin
delete from Exam
where
CodStudent = @CodStudent and
Course =@Course and
NumTerm = @NumTerm and
CodExType = @CodExType and
Mark = @Mark and
CodVar = @CodVar
-- if @@error <> 0 rollback tran else commit tran
return
end
declare
@CodOrganization tinyint,
@CodVarNEW int,
@Lec smallint,
@Sem smallint,
@Sam smallint
-- @err varchar(500)
select @CodOrganization = CodOrganization,
@Lec = Lec, @Sem = Sem, @Sam = Sam
from HoursVars
where CodVar = @CodVar
select @CodOrganization = isNULL(@CodOrganization,1),
@Lec = isNULL(@Lec,0), @Sem = isNULL(@Sem,0), @Sam = isNULL(@Sam,0)
--select @err = 'Mark = '+str(@CodOrganization)
execute dbo.e_DetectCodVar @CodSub, @CodSubType, @CodOrganization,
@CodKaf, @Lec, @Sem, @Sam, @ECTScretits, @CodVarNEW output
--raiserror(@err, 16,1);
select @CodOp = 3
if not exists(select * from Exam
where
CodStudent=@CodStudent
and Course=@Course
and NumTerm=@NumTerm
and CodExType=@CodExType
and mark = @mark
and CodVar=@CodVar
) select @CodOp = 2
--Добавление
IF @CodOp=2
begin
Insert Exam (CodStudent,Course,NumTerm,CodExType,Mark,CodECTSMark,
CodPrep,DateExam,CodVar,CodVUZ)
Values(@CodStudent,@Course,@NumTerm,@CodExType,@Mark,@CodECTSMark,
@CodPrep,@DateExam,@CodVarNEW,@CodVUZ)
-- if @@error <> 0 rollback tran else commit tran
return
end
--Изменение
IF @CodOp=3
begin
if exists(select * from Exam
where
CodStudent=@CodStudent
and Course=@Course
and NumTerm=@NumTerm
and CodExType=@CodExType
and mark = @mark
and CodVar=@CodVarNEW
and CodECTSmark = @CodECTSmark
and CodPrep = @CodPrep
and DateExam = @DateExam
and CodVUZ = @CodVUZ
) return
UPDATE Exam SET CodECTSMark=@CodECTSMark,
CodPrep=@CodPrep, DateExam=@DateExam, CodVUZ=@CodVUZ
WHERE CodStudent=@CodStudent
and Course=@Course
and NumTerm=@NumTerm
and CodExType=@CodExType
and mark = @mark
and CodVar=@CodVar
-- if @@error <> 0 rollback tran else commit tran
end
END
/**************************************************************
Предназначена для изменения существующей оценки в таблице Exam
Параметры делятся на три группы:
- старые значения ключевых полей (для идентификации изменяемой оценки);
- новые значения ключевых полей;
- новые значения неключевых полей.
Предварительно необходимо определить CodVarNEW для изменяемой оценки
Сначала производится удаление оценки, а затем вставка с новыми значениями
ЗУБКОВ СЕРГЕЙ
28\05\2002 17:21
****************************************************************/
CREATE PROCEDURE [dbo].[e_UpdateMark]
(
@CodStudent int,
@CodVar int, -- ключевые поля, определяющие, какую оценку меняем
@Course tinyint,
@NumTerm tinyint,
@CodExType tinyint,
@Mark tinyint,
@CodVarNEW int, --набор новых значений ключевых полей
@CourseNEW tinyint,
@NumTermNEW tinyint,
@CodExTypeNEW tinyint,
@MarkNEW tinyint,
@CodECTSMark smallint, -- значение неключевых полей
@CodPrep int,
@DateExam smalldatetime,
@CodVUZ int
)as
BEGIN
--if @CodECTSMark IS NULL BEGIN RAISERROR('Не указана рейтинговая оценка!',16,-1) return END
if @DateExam IS NULL BEGIN RAISERROR('Не указана дата!',16,-1) return END
if @CodVUZ IS NULL BEGIN RAISERROR('Не указан ВУЗ!',16,-1) return END
if @CodECTSMark IS NULL SELECT @CodECTSMark=0
BEGIN TRAN
-- удаляем старую оценку
exec e_DeleteMark @CodStudent, @CodVar, @Course, @NumTerm, @CodExType, @Mark
-- добавляем новую
exec e_AddMark @CodStudent, @CodVarNEW, @CourseNEW, @NumTermNEW, @CodExTypeNEW, @MarkNEW, @CodECTSMark, @CodPrep, @DateExam, @CodVUZ
IF @@ERROR<>0
BEGIN
ROLLBACK TRAN
END
ELSE COMMIT TRAN
END
/******************************************************************************
Object: Stored Procedure dbo.e_DetectCodVar Script Date: 17.11.2001 15:03:37
Процедура определяет @CodVar по содержанию варианта (остальные параметры)
Если варианта нет, то он заносится в HoursVars
****************************************************************************/
CREATE PROCEDURE [dbo].[e_DetectCodVar]
(@CodSub int, @CodSubType tinyint, @CodOrganization tinyint,
@CodKaf tinyInt, @Lec SmallInt, @Sem SmallInt, @Sam SmallInt, @ECTScretits float,
@CodVar int OUTPUT)
AS
--
-- Проверка существования варианта
--
IF EXISTS(SELECT * FROM HoursVars WHERE
CodSub=@CodSub AND CodSubType=@CodSubType
AND CodOrganization=@CodOrganization AND CodKaf=@CodKaf
AND Lec = @Lec AND Sem = @Sem AND Sam=@Sam AND ECTScretits = @ECTScretits)
--
-- Возвращается номер существующего варианта
--
SELECT @CodVar=CodVar FROM HoursVars WHERE
CodSub=@CodSub AND CodSubType=@CodSubType
AND CodOrganization=@CodOrganization AND CodKaf=@CodKaf
AND Lec = @Lec AND Sem = @Sem AND Sam=@Sam AND ECTScretits = @ECTScretits
ELSE
BEGIN
BEGIN TRAN
--
-- Выбирается свободный номер
--
SELECT @CodVar=curentvalue from autoincdata where tablename='HoursVars'
--
-- Добавляется вариант
--
INSERT HoursVars
VALUES (@CodVar,@CodSub,@CodSubType,@CodOrganization,@CodKaf,@Lec,@Sem,@Sam,@ECTScretits)
if @@error<>0
begin
rollback tran
--
-- При аварийном завершении возвращается -1
--
SELECT @CodVar=-1
end
else
begin
commit tran
end
END