USP_DATAFORMTEMPLATE_EDIT_CLASS_MEETING_TEMPLATE

The save procedure used by the edit dataform template "Class Meeting Template Edit Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@MEETINGS xml IN

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_CLASS_MEETING_TEMPLATE
(
    @ID uniqueidentifier,
    @CHANGEAGENTID uniqueidentifier = null,
    @MEETINGS xml
)
as
    set nocount on;

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

    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    -- build a temporary table containing the values from the XML

    declare @TempTbl table (
        [ID] uniqueidentifier,
        [CLASSMEETINGGROUPID] uniqueidentifier,
        [STARTTIME] char(4),
        [ENDTIME] char(4),
        [CYCLEDAYID] uniqueidentifier,
        [TIMETABLEDAYPERIODID] uniqueidentifier,
        [LENGTHINPERIODS] int,
        ADDRECORD bit)

    insert into @TempTbl
    (
        ID,
        CLASSMEETINGGROUPID,
        STARTTIME,
        ENDTIME,
        CYCLEDAYID,
        TIMETABLEDAYPERIODID,
        LENGTHINPERIODS,
        ADDRECORD
    )
    select
        coalesce(CLASSMEETINGTEMPLATE.ID, newid()),
        CLASSMEETINGGROUP.ID,
        case when MEETINGS.TIMETABLEDAYPERIODID is null
            then MEETINGS.STARTTIME
            else ''
        end as STARTTIME,
        case when MEETINGS.TIMETABLEDAYPERIODID is null
            then MEETINGS.ENDTIME
            else ''
        end as ENDTIME,
        MEETINGS.CYCLEDAYID,
        MEETINGS.TIMETABLEDAYPERIODID,
        MEETINGS.LENGTHINPERIODS,
        case when CLASSMEETINGTEMPLATE.ID is null then 1 else 0 end as ADDRECORD
    from 
        (select
            T.c.value('(STARTTIME)[1]','char(4)') AS 'STARTTIME',
            T.c.value('(ENDTIME)[1]','char(4)') AS 'ENDTIME',
            T.c.value('(CYCLEDAYID)[1]','uniqueidentifier') AS 'CYCLEDAYID',
            T.c.value('(TIMETABLEDAYPERIODID)[1]','uniqueidentifier') AS 'TIMETABLEDAYPERIODID',
            T.c.value('(LENGTHINPERIODS)[1]','int') AS 'LENGTHINPERIODS'
        from @MEETINGS.nodes('/MEETINGS/ITEM') T(c)) MEETINGS
        cross join dbo.CLASSMEETINGGROUP
        left join CLASSMEETINGTEMPLATE on
            CLASSMEETINGGROUP.ID = CLASSMEETINGTEMPLATE.CLASSMEETINGGROUPID and
            (
                (MEETINGS.STARTTIME is null and CLASSMEETINGTEMPLATE.STARTTIME is null) or
                (MEETINGS.STARTTIME = CLASSMEETINGTEMPLATE.STARTTIME)
            ) and
            (
                (MEETINGS.ENDTIME is null and CLASSMEETINGTEMPLATE.ENDTIME is null) or
                (MEETINGS.ENDTIME = CLASSMEETINGTEMPLATE.ENDTIME)
            ) and 
            MEETINGS.CYCLEDAYID = CLASSMEETINGTEMPLATE.CYCLEDAYID and
            (
                (MEETINGS.TIMETABLEDAYPERIODID is null and CLASSMEETINGTEMPLATE.TIMETABLEDAYPERIODID is null) or
                (MEETINGS.TIMETABLEDAYPERIODID = CLASSMEETINGTEMPLATE.TIMETABLEDAYPERIODID)
            ) and
            (
                (MEETINGS.LENGTHINPERIODS is null and CLASSMEETINGTEMPLATE.LENGTHINPERIODS is null) or
                (MEETINGS.LENGTHINPERIODS = CLASSMEETINGTEMPLATE.LENGTHINPERIODS)
            )
    where CLASSMEETINGGROUP.CLASSID = @ID

    declare @RESETBLOCK bit = 0

    -- Remove any old entries

    delete from dbo.CLASSMEETINGTEMPLATE where CLASSMEETINGTEMPLATE.ID in
        (
            select CLASSMEETINGTEMPLATE.ID
            from dbo.CLASSMEETINGGROUP
                inner join dbo.CLASSMEETINGTEMPLATE on CLASSMEETINGGROUP.ID = CLASSMEETINGTEMPLATE.CLASSMEETINGGROUPID
            where dbo.CLASSMEETINGGROUP.CLASSID = @ID

            except select ID from @TempTbl where ADDRECORD = 0
        )

    if @@ROWCOUNT > 0
        set @RESETBLOCK = 1

    -- Update the entries with valid times from periods if they are specified.

    update @TempTbl set
        STARTTIME = T.STARTTIME,
        ENDTIME = T.ENDTIME
    from @TempTbl MEETINGS
        cross apply dbo.UFN_CLASSMEETINGTEMPLATE_GETPERIODTIME(MEETINGS.TIMETABLEDAYPERIODID, MEETINGS.LENGTHINPERIODS) T
    where MEETINGS.TIMETABLEDAYPERIODID is not null

    if exists(select 1 from @TempTbl where STARTTIME = '' or ENDTIME = '')
    begin
        raiserror('BBERR_CLASSMEETINGTEMPLATE_INVALIDPERIODLENGTH', 13, 1);
        return 1;
    end

    -- Add any new entries

    insert into dbo.CLASSMEETINGTEMPLATE
    (
        ID,
        CLASSMEETINGGROUPID,
        STARTTIME,
        ENDTIME,
        CYCLEDAYID,
        TIMETABLEDAYPERIODID,
        LENGTHINPERIODS,
        ADDEDBYID,
        CHANGEDBYID,
        DATEADDED,
        DATECHANGED        
    )
    select
        ID,
        CLASSMEETINGGROUPID,
        STARTTIME,
        ENDTIME,
        CYCLEDAYID,
        TIMETABLEDAYPERIODID,
        LENGTHINPERIODS,
        @CHANGEAGENTID,
        @CHANGEAGENTID,
        @CURRENTDATE,
        @CURRENTDATE
    from @TempTbl
    where ADDRECORD <> 0

    if @@ROWCOUNT > 0 or @RESETBLOCK <> 0
    begin
        update dbo.CLASSMEETINGGROUP
            set PATTERNBLOCKID = null
        from dbo.CLASSMEETINGGROUP
        where CLASSMEETINGGROUP.CLASSID = @ID
            and PATTERNBLOCKID is not null
    end

    exec dbo.USP_CLASSMEETING_CREATEFROMTEMPLATES @ID, @CHANGEAGENTID

return 0;