USP_TEAMFUNDRAISINGTEAM_DELETE

Executes the "Team Fundraising Team: Delete" record operation.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN Input parameter indicating the ID of the record being deleted.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the delete.

Definition

Copy


                    CREATE procedure dbo.USP_TEAMFUNDRAISINGTEAM_DELETE
                    (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier
                    )
                    as begin
                        set nocount on;

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

                        if exists(
                            select ID
                            from dbo.KPIINSTANCE
                            where lower(CONTEXTRECORDID) = lower(convert(nvarchar(36), @ID))
                        )
                        begin
                            raiserror('ERR_HASKPIINSTANCE', 13, 1);
                            return 0;
                        end

                        begin try
                            declare @contextCache varbinary(128);

                            --cache current context information

                            set @contextCache = CONTEXT_INFO();

                            --set CONTEXT_INFO to @CHANGEAGENTID

                            set CONTEXT_INFO @CHANGEAGENTID;

                            --The team hierarchy should only go ten levels deep

                            declare @MAXLEVEL int;
                            set @MAXLEVEL = 10;

                            declare @TEAMFUNDRAISINGTEAMHIERARCHY table
                            (
                                ID uniqueidentifier,
                                [LEVEL] int
                            );

                            with TEAMFUNDRAISINGTEAMHIERARCHY(ID, [LEVEL])
                            as
                            (
                                select
                                    TEAMFUNDRAISINGTEAM.ID,
                                    0 [LEVEL]
                                from
                                    dbo.TEAMFUNDRAISINGTEAM
                                where
                                    TEAMFUNDRAISINGTEAM.ID = @ID

                                union all

                                select
                                    TEAMFUNDRAISINGTEAM.ID,
                                    TEAMFUNDRAISINGTEAMHIERARCHY.LEVEL + 1 [LEVEL] -- Selects one level more than @MAXLEVEL

                                from
                                    dbo.TEAMFUNDRAISINGTEAM
                                    inner join TEAMFUNDRAISINGTEAMHIERARCHY on TEAMFUNDRAISINGTEAM.PARENTTEAMID = TEAMFUNDRAISINGTEAMHIERARCHY.ID
                                where
                                    TEAMFUNDRAISINGTEAMHIERARCHY.[LEVEL] < @MAXLEVEL
                            )
                            insert into @TEAMFUNDRAISINGTEAMHIERARCHY
                            (
                                ID,
                                [LEVEL]
                            )
                            select
                                ID,
                                [LEVEL]
                            from
                                TEAMFUNDRAISINGTEAMHIERARCHY;

                            if exists(
                                select ID
                                from dbo.KPIINSTANCE
                                where lower(CONTEXTRECORDID) in 
                                    (
                                        select lower(convert(nvarchar(36), ID))
                                        from @TEAMFUNDRAISINGTEAMHIERARCHY
                                    )
                            )
                            begin
                                raiserror('ERR_HASKPIINSTANCE', 13, 1);
                                return 0;
                            end

                            --An error in the SQL query processor results in the error message

                            -- "The query processor could not produce a query plan." when an inner join is

                            -- used for this delete, the where..in clause is a workaround.

                            --Delete the team members of this team and all child teams down to ten levels

                            delete from
                                dbo.TEAMFUNDRAISINGTEAMMEMBER
                            from
                                dbo.TEAMFUNDRAISINGTEAMMEMBER
                            where
                                TEAMFUNDRAISINGTEAMMEMBER.TEAMFUNDRAISINGTEAMID in (select ID from @TEAMFUNDRAISINGTEAMHIERARCHY where [LEVEL] < @MAXLEVEL);

                            --Delete all team fundraisers that no longer have any teams as a result of the team member deletions

                            delete from
                                dbo.TEAMFUNDRAISER
                            from
                                dbo.TEAMFUNDRAISER
                                left join dbo.TEAMFUNDRAISINGTEAMMEMBER on TEAMFUNDRAISER.ID = TEAMFUNDRAISINGTEAMMEMBER.TEAMFUNDRAISERID
                            where
                                TEAMFUNDRAISINGTEAMMEMBER.ID is null;

                            --Delete the team captains of this team and all child teams down to ten levels

                            delete from
                                dbo.TEAMFUNDRAISINGTEAMCAPTAIN
                            from
                                dbo.TEAMFUNDRAISINGTEAMCAPTAIN
                                inner join @TEAMFUNDRAISINGTEAMHIERARCHY [TEAMFUNDRAISINGTEAMHIERARCHY] on TEAMFUNDRAISINGTEAMCAPTAIN.TEAMFUNDRAISINGTEAMID = [TEAMFUNDRAISINGTEAMHIERARCHY].ID
                            where
                                [TEAMFUNDRAISINGTEAMHIERARCHY].[LEVEL] < @MAXLEVEL;

                            --The team hierarchy should only go ten levels deep,

                            --if there is an eleventh level then move those teams up to this team's parent to avoid a foreign key exception

                            update
                                dbo.TEAMFUNDRAISINGTEAM
                            set
                                PARENTTEAMID = (select TEAMFUNDRAISINGTEAM.PARENTTEAMID from dbo.TEAMFUNDRAISINGTEAM where TEAMFUNDRAISINGTEAM.ID = @ID)
                            from
                                dbo.TEAMFUNDRAISINGTEAM
                                inner join @TEAMFUNDRAISINGTEAMHIERARCHY [TEAMFUNDRAISINGTEAMHIERARCHY] on TEAMFUNDRAISINGTEAM.ID = [TEAMFUNDRAISINGTEAMHIERARCHY].ID
                            where
                                [TEAMFUNDRAISINGTEAMHIERARCHY].[LEVEL] = @MAXLEVEL;

                            --Delete child teams from all ten levels in order from ten to one

                            delete from
                                dbo.TEAMFUNDRAISINGTEAM
                            from
                                dbo.TEAMFUNDRAISINGTEAM
                                inner join @TEAMFUNDRAISINGTEAMHIERARCHY [TEAMFUNDRAISINGTEAMHIERARCHY] on TEAMFUNDRAISINGTEAM.ID = [TEAMFUNDRAISINGTEAMHIERARCHY].ID
                            where
                                [TEAMFUNDRAISINGTEAMHIERARCHY].[LEVEL] < @MAXLEVEL;

                            --reset CONTEXT_INFO to previous value

                            if not @contextCache is null
                                set CONTEXT_INFO @contextCache;

                        end try
                        begin catch
                            exec dbo.USP_RAISE_ERROR;
                            return 1;
                        end catch

                        return 0;
                    end