USP_DATAFORMTEMPLATE_ADD_CREATEMULTIPLECLASSES

The save procedure used by the add dataform template "Create multiple classes".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier INOUT The output parameter indicating the ID of the record added.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@COURSES xml IN
@TERMDATA xml IN
@OVERRIDECLASSLIMIT bit IN Override class limit restrictions

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_CREATEMULTIPLECLASSES
(
    @ID uniqueidentifier = null output,
    @CHANGEAGENTID uniqueidentifier = null,
    @COURSES xml = null,
    @TERMDATA xml = null,
    @OVERRIDECLASSLIMIT bit = null
)
as

    set nocount on

    if @CHANGEAGENTID is null  
    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    begin try

        declare @COURSETERMDATATEMP table
        (
            [ID] uniqueidentifier,
            [FACULTYID] uniqueidentifier,
            [SESSIONID] uniqueidentifier,
            [TERMID] uniqueidentifier,
            [COUNT_ORIGINAL] int,
            [COUNT_NEW] int,
            [NUMWITHSTUDENTS] int
        )

        insert into @COURSETERMDATATEMP
        (
            ID,
            FACULTYID,
            SESSIONID,
            TERMID,
            COUNT_ORIGINAL,
            COUNT_NEW,
            NUMWITHSTUDENTS
        )
        select
            COURSES.ID,
            FACULTYID,
            (select SESSIONID from TERM where ID = TERMDATA.TERMID) as SESSIONID,
            TERMID,
            COUNT_ORIGINAL,
            COUNT_NEW,
            NUMWITHSTUDENTS
        from (select
                T.c.value('(ID)[1]','uniqueidentifier') as TERMID,
                T.c.value('(COUNT_ORIGINAL)[1]','int') as COUNT_ORIGINAL,
                T.c.value('(COUNT_NEW)[1]','int') as COUNT_NEW,
                T.c.value('(NUMWITHSTUDENTS)[1]','int') as NUMWITHSTUDENTS,
                T.c.value('(COURSEID)[1]','uniqueidentifier') as COURSEID
                from @TERMDATA.nodes('/TERMDATA/ITEM') as T(c)) TERMDATA
        join (select
                    T.c.value('(ID)[1]','uniqueidentifier') as ID,
                    T.c.value('(FACULTYID)[1]','uniqueidentifier') as FACULTYID
                    from @COURSES.nodes('/COURSES/ITEM') as T(c)) COURSES 
            on COURSES.ID = TERMDATA.COURSEID

        declare @MAXCOUNT_NEW as int
        select @MAXCOUNT_NEW = max(COUNT_NEW) from  @COURSETERMDATATEMP 

        declare @CLASSESTOCREATETEMP table (
           [ROWID] int identity(1,1),
           [COURSEID] uniqueidentifier,
           [SESSIONID] uniqueidentifier,
           [TERMID] uniqueidentifier,
           [FACULTYID] uniqueidentifier,
           [RESTRICTIONSTATUS] tinyint)

        insert into @CLASSESTOCREATETEMP (COURSEID, SESSIONID, TERMID, FACULTYID, RESTRICTIONSTATUS) 
        select 
            COURSETERMDATATEMP.ID,
            SESSIONID,
            TERMID,
            FACULTYID,
            (case 
                when CLASSESPERTERMMAXIMUM > 0 and (COUNT_NEW > CLASSESPERTERMMAXIMUM) then 3
                when (CLASSESPERTERMTARGET > 0 and (COUNT_NEW > CLASSESPERTERMTARGET)) or (CLASSESPERTERMMAXIMUM > 0 and (COUNT_NEW = CLASSESPERTERMMAXIMUM)) then 2
                when CLASSESPERTERMMINIMUM > 0 and (COUNT_NEW < CLASSESPERTERMMINIMUM) then 1
                when (CLASSESPERTERMTARGET = 0 and CLASSESPERTERMMAXIMUM = 0) then 5
                else 0
            end) as RESTRICTIONSTATUS
        from 
            dbo.UFN_NUMBERTABLE(0, @MAXCOUNT_NEW), @COURSETERMDATATEMP as COURSETERMDATATEMP
        inner join dbo.COURSE 
            on COURSE.ID = COURSETERMDATATEMP.ID
        where (NUMBER + COUNT_ORIGINAL) < COUNT_NEW

        if exists(select RESTRICTIONSTATUS from @CLASSESTOCREATETEMP where RESTRICTIONSTATUS = 3)
            raiserror('BBERR_CREATECLASSES_MAXIMUM', 13, 1)     

        if @OVERRIDECLASSLIMIT = 0 and exists(select RESTRICTIONSTATUS from @CLASSESTOCREATETEMP where RESTRICTIONSTATUS = 2)
            raiserror('BBERR_CREATECLASSES_NEED_OVERRIDE', 13, 1)  

        declare @CLASSESTODELETETEMP table (
           [ROWID] int identity(1,1),
           [COURSEID] uniqueidentifier,
           [ID] uniqueidentifier,
           [TERMID] uniqueidentifier,
           [SECTION] nvarchar(20),
           [COUNT_ORIGINAL] int,
           [COUNT_NEW] int,
           [RESTRICTIONSTATUS] tinyint,
           [STUDENTCOUNT] int,
           [ROWNUMBER] int)

        insert into @CLASSESTODELETETEMP (COURSEID, ID, TERMID, SECTION, COUNT_ORIGINAL, COUNT_NEW, RESTRICTIONSTATUS, STUDENTCOUNT, ROWNUMBER) 
        select COURSEID, ID, TERMID, SECTION, COUNT_ORIGINAL, COUNT_NEW, RESTRICTIONSTATUS, STUDENTCOUNT,
            ROW_NUMBER() OVER(PARTITION BY COURSEID, TERMID ORDER BY STUDENTCOUNT DESC, SECTION ASC) AS ROWNUM 
        from (select 
                COURSEID, 
                CLASS.ID, 
                TERMID,
                SECTION
                COUNT_ORIGINAL, 
                COUNT_NEW,
                (case 
                    when (NUMWITHSTUDENTS > 0) and (NUMWITHSTUDENTS > COUNT_NEW) then 4
                    else 0
                end) as RESTRICTIONSTATUS,
                (select count(*)
                        from dbo.CLASSMEETINGGROUP 
                        inner join dbo.STUDENTCLASSMEETINGGROUP on STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID = CLASSMEETINGGROUP.ID
                        inner join dbo.TERM on TERM.ID = COURSES.TERMID and  
                            TERM.STARTDATE = CLASSMEETINGGROUP.STARTDATE and 
                            TERM.ENDDATE = CLASSMEETINGGROUP.ENDDATE
                        where CLASSMEETINGGROUP.CLASSID = CLASS.ID 
                ) STUDENTCOUNT
            from dbo.CLASS 
            inner join dbo.CLASSMEETINGGROUP  on CLASSMEETINGGROUP.CLASSID = CLASS.ID
            inner join @COURSETERMDATATEMP as COURSES 
                on COURSES.ID = CLASS.COURSEID 
            inner join dbo.TERM 
                on TERM.ID = COURSES.TERMID
            where 
                COUNT_ORIGINAL > COUNT_NEW and
                TERM.STARTDATE = CLASSMEETINGGROUP.STARTDATE and
                TERM.ENDDATE = CLASSMEETINGGROUP.ENDDATE ) t
        group by COURSEID, TERMID, STUDENTCOUNT, ID, SECTION, COUNT_ORIGINAL, COUNT_NEW, RESTRICTIONSTATUS

        if exists(select RESTRICTIONSTATUS from @CLASSESTODELETETEMP where RESTRICTIONSTATUS = 4)
            raiserror('BBERR_CREATECLASSES_CANNOT_DELETE', 13, 1)  

        --generate new classes

        declare @RowId int
        declare @MaxRowId int   

        declare @COURSEID uniqueidentifier = null     
        declare @SESSIONID uniqueidentifier = null 
        declare @TERMID uniqueidentifier = null 
        declare @FACULTYID uniqueidentifier = null 
        declare @SECTION nvarchar(20) = null

        select
           @RowId = min(ROWID),
           @MaxRowId = max(ROWID)
        from @CLASSESTOCREATETEMP

        while @RowId <= @MaxRowId
        begin
            select
               @COURSEID = COURSEID, @SESSIONID = SESSIONID, @TERMID = TERMID, @FACULTYID = FACULTYID
            from
               @CLASSESTOCREATETEMP
            where 
               ROWID = @RowId

            select @SECTION = dbo.UFN_CLASS_GETDEFAULTSECTION(@COURSEID, @SESSIONID, @TERMID)
            exec dbo.USP_DATAFORMTEMPLATE_ADD_CLASS null, @SESSIONID, @COURSEID, @TERMID, @SECTION, @FACULTYID, @CHANGEAGENTID

            set @RowId = @RowId + 1
        end    

        --delete classes

        declare @CLASSID uniqueidentifier
        declare @ROWNUMBER int
        declare @COUNT_NEW int
        declare @STUDENTCOUNT int

        select
           @RowId = min(ROWID),
           @MaxRowId = max(ROWID)
        from @CLASSESTODELETETEMP

        while @RowId <= @MaxRowId
        begin
            select
               @CLASSID = ID,
               @ROWNUMBER = ROWNUMBER,
               @COUNT_NEW = COUNT_NEW,
               @STUDENTCOUNT = STUDENTCOUNT  
            from
               @CLASSESTODELETETEMP
            where 
               ROWID = @RowId

            if @ROWNUMBER > @COUNT_NEW and @STUDENTCOUNT = 0
                exec dbo.USP_CLASS_DELETE @CLASSID, @CHANGEAGENTID

            set @RowId = @RowId + 1
        end    
    end try

    begin catch
        exec dbo.USP_RAISE_ERROR
        return 1
    end catch

return 0