USP_DATAFORMTEMPLATE_ADD_ENROLLGROUPINCLASS
The save procedure used by the add dataform template "Enroll group in a class".
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | The output parameter indicating the ID of the record added. |
@CLASSID | uniqueidentifier | IN | Input parameter indicating the context ID for the record being added. |
@CHANGEAGENTID | uniqueidentifier | IN | Input parameter indicating the ID of the change agent invoking the procedure. |
@STUDENTS | xml | IN | |
@EXCEEDTARGETCLASSSIZE | bit | IN | Exceed target class size |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_ADD_ENROLLGROUPINCLASS
(
@ID uniqueidentifier = null output,
@CLASSID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@STUDENTS xml = null,
@EXCEEDTARGETCLASSSIZE bit = null
)
as
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output
declare @CURRENTDATE datetime
set @CURRENTDATE = getdate()
declare @STUDENTCOUNT int
declare @STUDENTLIST table
(
ID uniqueidentifier
)
insert into @STUDENTLIST
select STUDENTS.ID
from (
select T.c.value('(ID)[1]','uniqueidentifier') as ID
from @STUDENTS.nodes('/STUDENTS/ITEM') as T(c)
where coalesce(T.c.value('(ENROLL)[1]','bit'), 0) <> 0
) STUDENTS
set @STUDENTCOUNT = @@ROWCOUNT
if @STUDENTCOUNT <= 0
begin
raiserror('BBERR_ENROLLGROUPINCLASS_NOSTUDENTS', 13, 1);
return 1;
end
declare @CLASSSIZETARGET int
declare @CLASSSIZEMAXIMUM int
declare @CURRENTCLASSSIZE int
declare @CLASS_STARTDATE date
declare @CLASS_ENDDATE date
declare @COURSEID uniqueidentifier
select
@CLASSSIZETARGET = CLASS.CLASSSIZETARGET,
@CLASSSIZEMAXIMUM = CLASS.CLASSSIZEMAXIMUM,
@CURRENTCLASSSIZE = coalesce((
select MAX(CT)
from (
select
COUNT(distinct STUDENTCLASSMEETINGGROUP.ID) - COUNT(distinct STUDENTS.ID) as CT
from dbo.CLASSMEETINGGROUP
inner join dbo.STUDENTCLASSMEETINGGROUP on CLASSMEETINGGROUP.ID = STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID
inner join dbo.STUDENTCOURSE on STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID = STUDENTCOURSE.ID
left join @STUDENTLIST STUDENTS on STUDENTCOURSE.STUDENTID = STUDENTS.ID
where CLASSMEETINGGROUP.CLASSID = @CLASSID
and STUDENTCLASSMEETINGGROUP.STATUSCODE = 0
group by CLASSMEETINGGROUP.ID
) T
), 0),
@CLASS_STARTDATE = CLASS.STARTDATE,
@CLASS_ENDDATE = CLASS.ENDDATE,
@COURSEID = CLASS.COURSEID
from dbo.CLASS
where CLASS.ID = @CLASSID
if @CLASSSIZEMAXIMUM > 0 and (@CURRENTCLASSSIZE + @STUDENTCOUNT) > @CLASSSIZEMAXIMUM
begin
raiserror('BBERR_ENROLLGROUPINCLASS_MAXIMUMEXCEEDED', 13, 1);
return 1;
end
if @EXCEEDTARGETCLASSSIZE = 0 and (@CURRENTCLASSSIZE + @STUDENTCOUNT) > @CLASSSIZETARGET
begin
raiserror('BBERR_ENROLLGROUPINCLASS_TARGETEXCEEDED', 13, 1);
return 1;
end
declare @STUDENTCOURSE table
(
ID uniqueidentifier,
STUDENTID uniqueidentifier,
ADDRECORD bit
)
-- Select the existing class enrollment if one exists,
-- to prevent adding the student to a class they are already in
insert into @STUDENTCOURSE
(
ID,
STUDENTID,
ADDRECORD
)
select
STUDENTCOURSES.ID,
STUDENTS.ID as STUDENTID,
0
from @STUDENTLIST STUDENTS
left join (
select
STUDENTCOURSE.ID,
STUDENTCOURSE.STUDENTID
from dbo.STUDENTCOURSE
left join dbo.STUDENTCLASSMEETINGGROUP on STUDENTCOURSE.ID = STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID
left join dbo.CLASSMEETINGGROUP on STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID = CLASSMEETINGGROUP.ID
where STUDENTCOURSE.COURSEID = @COURSEID
and CLASSMEETINGGROUP.CLASSID = @CLASSID
group by STUDENTCOURSE.ID, STUDENTCOURSE.STUDENTID
) STUDENTCOURSES on STUDENTS.ID = STUDENTCOURSES.STUDENTID
-- Select the first non-fulfilled request if one exists
update @STUDENTCOURSE
set
ID = coalesce(STUDENTCOURSES2.ID, newid()),
ADDRECORD = case when STUDENTCOURSES2.ID is null then 1 else 0 end
from @STUDENTCOURSE STUDENTCOURSES
left join
(
select
STUDENTCOURSE.ID,
STUDENTCOURSE.STUDENTID,
ROW_NUMBER() over (partition by STUDENTCOURSE.STUDENTID order by STUDENTCOURSE.DATEADDED) as ROW
from dbo.STUDENTCOURSE
inner join dbo.STUDENTCOURSEREQUEST on STUDENTCOURSE.ID = STUDENTCOURSEREQUEST.ID
where STUDENTCOURSE.COURSEID = @COURSEID
and STUDENTCOURSEREQUEST.STARTDATE <= @CLASS_STARTDATE
and STUDENTCOURSEREQUEST.ENDDATE >= @CLASS_ENDDATE
and (
STUDENTCOURSEREQUEST.CLASSSTARTDATE is null or
STUDENTCOURSEREQUEST.CLASSSTARTDATE = @CLASS_STARTDATE
)
and not exists (select ID from dbo.STUDENTCLASSMEETINGGROUP where STUDENTCOURSEID = STUDENTCOURSE.ID)
) STUDENTCOURSES2 on STUDENTCOURSES2.STUDENTID = STUDENTCOURSES.STUDENTID
and STUDENTCOURSES2.ROW = 1
where STUDENTCOURSES.ID is null
insert into dbo.STUDENTCOURSE
(
ID,
STUDENTID,
COURSEID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
STUDENTCOURSES.ID,
STUDENTCOURSES.STUDENTID,
@COURSEID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @STUDENTCOURSE STUDENTCOURSES
where STUDENTCOURSES.ADDRECORD <> 0
insert into dbo.STUDENTCLASSMEETINGGROUP
(
ID,
STUDENTCOURSEID,
CLASSMEETINGGROUPID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
select
newid(),
STUDENTCOURSES.ID,
CLASSMEETINGGROUP.ID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
from @STUDENTCOURSE STUDENTCOURSES
cross join dbo.CLASS
inner join dbo.CLASSMEETINGGROUP on CLASS.ID = CLASSMEETINGGROUP.CLASSID
left join dbo.STUDENTCLASSMEETINGGROUP
on CLASSMEETINGGROUP.ID = STUDENTCLASSMEETINGGROUP.CLASSMEETINGGROUPID
and STUDENTCOURSES.ID = STUDENTCLASSMEETINGGROUP.STUDENTCOURSEID
where @CLASSID = CLASS.ID and
STUDENTCLASSMEETINGGROUP.ID is null
return 0