USP_MKTSEGMENTATIONSEGMENT_MOVEUP

Executes the "Marketing Effort Segment: Move Up" 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_MKTSEGMENTATIONSEGMENT_MOVEUP]
(
  @ID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null
)
as
  set nocount on;

  declare @SEGMENTATIONID uniqueidentifier;
  declare @ISHISTORICAL bit;
  declare @MARKETINGPLANITEMID uniqueidentifier;
  declare @BRIEFID uniqueidentifier;
  declare @NEXTBRIEFSEQ int;
  declare @ABOVESEGMENTID uniqueidentifier;
  declare @SEQ int;
  declare @MAXSEQ int;
  declare @MINSEGMENTID uniqueidentifier;
  declare @CURRENTDATE datetime;

  begin try
    if @CHANGEAGENTID is null
      exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;

    set @CURRENTDATE = getdate();

    select
      @SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
      @ISHISTORICAL = [MKTSEGMENTATION].[ISHISTORICAL],
      @SEQ = [MKTSEGMENTATIONSEGMENT].[SEQUENCE],
      @BRIEFID = [MKTSEGMENTATIONSEGMENT].[MARKETINGPLANBRIEFID],
      @NEXTBRIEFSEQ = [MKTSEGMENTATIONSEGMENT].[NEXTBRIEFSEQUENCE]
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
    where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;

    if @ISHISTORICAL = 1
      begin
        raiserror('BBERR_MKTSEGMENTATION_ISHISTORICAL', 13, 1);
        raiserror('Segments in historical marketing efforts may not be moved.', 1, 11);
        return 1;
      end

    --Check if the mailing is currently being activated...

    exec dbo.[USP_MKTSEGMENTATION_CHECKACTIVATION] @SEGMENTATIONID;

    if @BRIEFID is not null
      begin
        --Segment is under a brief (only move if not the first segment in the brief)

        if @SEQ > (select min([SEQUENCE]) from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID and [MARKETINGPLANBRIEFID] = @BRIEFID)
          begin
            select @ABOVESEGMENTID = [ID]
            from dbo.[MKTSEGMENTATIONSEGMENT]
            where [SEGMENTATIONID] = @SEGMENTATIONID
            and [MARKETINGPLANBRIEFID] = @BRIEFID
            and [SEQUENCE] = (@SEQ - 1);

            --swap the 2 segments

            exec dbo.[USP_MKTSEGMENTATION_SWAPSEGMENTS] @ABOVESEGMENTID, @ID, @CHANGEAGENTID;
          end
      end
    else
      begin
        --Segment is at the root level (only move if not the first segment in the mailing)

        if (@SEQ > 1) or ((@SEQ = 1) and (@NEXTBRIEFSEQ <> 1))
          begin
            select @ABOVESEGMENTID = [ID]
            from dbo.[MKTSEGMENTATIONSEGMENT]
            where [SEGMENTATIONID] = @SEGMENTATIONID
            and [MARKETINGPLANBRIEFID] is null
            and [NEXTBRIEFSEQUENCE] = @NEXTBRIEFSEQ
            and [SEQUENCE] = (@SEQ - 1);

            if @ABOVESEGMENTID is not null
              --Segment is being moved above another segment, swap the 2 segments

              exec dbo.[USP_MKTSEGMENTATION_SWAPSEGMENTS] @ABOVESEGMENTID, @ID, @CHANGEAGENTID;
            else
              begin
                --Segment is being moved up above a brief...

                select @MARKETINGPLANITEMID = [MARKETINGPLANITEMID]
                from dbo.[MKTSEGMENTATION] 
                where [ID] = @SEGMENTATIONID;

                --Get the brief ID we are moving above

                select @BRIEFID = [ID]
                from dbo.[MKTMARKETINGPLANBRIEF]
                where [MARKETINGPLANITEMID] = @MARKETINGPLANITEMID
                and [SEQUENCE] = (@NEXTBRIEFSEQ - 1);

                --Get the new sequence for the segment, and the minimum sequence to refresh the views

                select @SEQ = isnull(min([SEQUENCE]), @SEQ
                from dbo.[MKTSEGMENTATIONSEGMENT] 
                where [SEGMENTATIONID] = @SEGMENTATIONID 
                and [MARKETINGPLANBRIEFID] = @BRIEFID;

                set @MAXSEQ = @SEQ + 1;

                --Update the segment sequence

                update dbo.[MKTSEGMENTATIONSEGMENT] set
                  [NEXTBRIEFSEQUENCE] = (@NEXTBRIEFSEQ - 1),
                  [SEQUENCE] = @SEQ,
                  [CHANGEDBYID] = @CHANGEAGENTID,
                  [DATECHANGED] = @CURRENTDATE
                where [ID] = @ID;

                --Resequence all segments in the brief

                update dbo.[MKTSEGMENTATIONSEGMENT] set
                  [SEQUENCE] = [SEQUENCE] + 1,
                  [CHANGEDBYID] = @CHANGEAGENTID,
                  [DATECHANGED] = @CURRENTDATE
                where [SEGMENTATIONID] = @SEGMENTATIONID
                and [MARKETINGPLANBRIEFID] = @BRIEFID;

                --Clear the cache for this segment and all segments after it

                select
                  @MINSEGMENTID = [ID]
                from dbo.[MKTSEGMENTATIONSEGMENT]
                where [SEGMENTATIONID] = @SEGMENTATIONID
                and [SEQUENCE] = @SEQ;

                exec dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE] @MINSEGMENTID, 0, 1;
              end
          end
      end
  end try

  begin catch
    exec dbo.[USP_RAISE_ERROR];
    return 1;
  end catch

  return 0;