Хранимые процедуры подсистемы учета успеваемости

/****************************************************************************

 Процедура [e_CopyStudyPlanToExList]копирует список экзаменов в таблицу ExList

 для группы с кодом @CodGrup, курса @Course и семестра @NumTerm COrganization

Зубков Сергей, 12.01.2002

****************************************************************************/

CREATE PROCEDURE [dbo].[e_CopyStudyPlanToExList](@CodGrup int, @Course tinyint, @NumTerm tinyInt, @COrganization tinyInt=1) AS

-- приходится применять курсор из-за триггера, расчитанного на добавление одной записи -->VV

--

 

declare @CodPlan int

select @CodPlan = CodPlan from Grup where CodGrup = @CodGrup

 

create table #tmp

(

           CodSub smallint,

           Course tinyint,

           NumTerm        tinyint,

           CodExType    tinyint,

           Lec                    smallint,

           Sem                  smallint,

           Sam                  smallint,

           ECTScredits    float

)

insert into #tmp exec e_GetExHoursList @CodPlan

 

declare

 @CodVar int,

 @CodSub int,

 @CodSubType tinyint,

 @CodOrganization tinyint,

 @CodKaf tinyint,

 @Lec smallint,

 @Sem smallint,

 @Sam smallint,

 @ECTScredits float,

 @CodExType tinyint,

 @CodPrep int,

 @ExLot tinyint

 

declare EL cursor for

select e.CodExType, ExLot = case when c.CodSubType = 2 then c.SubLot else e.ExLot end,

 c.CodSub, CodSubType=case when c.CodSubType = 2 then c.CodSubType else e.CodControlType end, c.CodKaf, isNULL(Lec,0), isNULL(Sem,0), isNULL(Sam,0), isNULL(ECTScredits,0.0)

from (dbo.Grup g

 left join dbo.StudyPlans p on p.CodPlan = g.CodPlan

 left join dbo.StudyContents c on c.CodPlan = p.CodPlan

 left join dbo.StudyExams e on e.CodPlan = c.CodPlan and e.CodSub = c.CodSub)

 left join #tmp on #tmp.CodSub = c.CodSub and #tmp.Course = e.Course and #tmp.NumTerm = e.NumTerm and #tmp.CodExType = e.CodExType

-- left join dbo.StudyTerm t on t.CodPlan = c.CodPlan and t.CodSub = c.CodSub and t.Course = e.Course and t.NumTerm = e.NumTerm

where

 g.CodGrup = @CodGrup

 and e.Course = @Course and e.NumTerm = @NumTerm

UNION

--

-- Гос экзамены

--

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 841 ELSE tf.CodSub END,

1 AS [CodSubType],CodKaf, 20 AS Lec, 0 AS Sem, 216 AS Sam, 6.0 AS ECTScredits

FROM [dbo].TermFlow tf

inner join StudyPlans p on tf.CodPlan=p.CodPlan

WHERE tf.CodPerType=7

 AND ((@CodPlan IS NULL) OR (tf.CodPlan = @CodPlan)) AND

 tf.Course=@Course and tf.NumTerm=@NumTerm

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: