USP_RECORDOPERATION_MEMBERSHIPLEVELINCREASESEQUENCE
Executes the "Membership Level: Increase Sequence" record operation.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | IN | Input parameter indicating the ID of the record being updated. |
@CHANGEAGENTID | uniqueidentifier | IN | Input parameter indicating the ID of the change agent invoking the update. |
Definition
Copy
CREATE procedure dbo.USP_RECORDOPERATION_MEMBERSHIPLEVELINCREASESEQUENCE
(
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier
)
as
begin
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE datetime = getdate();
declare @CURRENTSEQUENCE int = 0;
declare @NEWSEQUENCE int = 0;
declare @MAXSEQUENCE int = 0;
declare @TRUEMAXSEQUENCE int = 0;
declare @MEMBERSHIPPROGRAMID uniqueidentifier;
declare @ISACTIVE bit;
select
@MEMBERSHIPPROGRAMID = MEMBERSHIPPROGRAMID,
@ISACTIVE = ISACTIVE
from
dbo.MEMBERSHIPLEVEL
where
ID = @ID;
-- Use identity column to try and resequence the membership levels in case invalid or duplicate sequences were inserted
declare @TEMPMEMBERSHIPLEVELS table (
ID uniqueidentifier,
ISACTIVE bit,
CURRENTSEQUENCE int identity(0,1),
NEWSEQUENCE int
);
insert into @TEMPMEMBERSHIPLEVELS (ID, ISACTIVE)
select ID, ISACTIVE
from dbo.MEMBERSHIPLEVEL
where MEMBERSHIPPROGRAMID = @MEMBERSHIPPROGRAMID
order by SEQUENCE;
update @TEMPMEMBERSHIPLEVELS set NEWSEQUENCE = CURRENTSEQUENCE;
select @CURRENTSEQUENCE = CURRENTSEQUENCE from @TEMPMEMBERSHIPLEVELS where ID = @ID;
select @TRUEMAXSEQUENCE = max(CURRENTSEQUENCE) from @TEMPMEMBERSHIPLEVELS;
select @MAXSEQUENCE = max(CURRENTSEQUENCE) from @TEMPMEMBERSHIPLEVELS where @ISACTIVE = 0 or ISACTIVE = 1;
if @CURRENTSEQUENCE < @TRUEMAXSEQUENCE
begin
-- This means that the level is the highest active sequence and needs to be placed last
if @CURRENTSEQUENCE = @MAXSEQUENCE
set @NEWSEQUENCE = @TRUEMAXSEQUENCE;
else
select @NEWSEQUENCE = min(CURRENTSEQUENCE)
from @TEMPMEMBERSHIPLEVELS
where CURRENTSEQUENCE > @CURRENTSEQUENCE and (@ISACTIVE = 0 or ISACTIVE = 1);
update @TEMPMEMBERSHIPLEVELS
set NEWSEQUENCE = NEWSEQUENCE - 1
where CURRENTSEQUENCE > @CURRENTSEQUENCE and CURRENTSEQUENCE <= @NEWSEQUENCE;
update @TEMPMEMBERSHIPLEVELS
set NEWSEQUENCE = @NEWSEQUENCE
where ID = @ID;
end
begin try
update
dbo.MEMBERSHIPLEVEL
set
MEMBERSHIPLEVEL.SEQUENCE = TEMPMEMBERSHIPLEVELS.NEWSEQUENCE,
MEMBERSHIPLEVEL.CHANGEDBYID = @CHANGEAGENTID,
MEMBERSHIPLEVEL.DATECHANGED = @CURRENTDATE
from
dbo.MEMBERSHIPLEVEL
inner join
@TEMPMEMBERSHIPLEVELS as TEMPMEMBERSHIPLEVELS on TEMPMEMBERSHIPLEVELS.ID = MEMBERSHIPLEVEL.ID
where
MEMBERSHIPLEVEL.SEQUENCE <> TEMPMEMBERSHIPLEVELS.NEWSEQUENCE;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;
end