USP_DATAFORMTEMPLATE_EDIT_MKTSEGMENTATIONSEGMENT_DRAGDROPINSERT
The save procedure used by the edit dataform template "Marketing Effort Segment Drag and Drop 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. |
@BRIEFS | xml | IN | Briefs |
@SEGMENTS | xml | IN | Segments |
@SEGMENTSEQUENCE | int | IN | Segment Sequence |
@BRIEFSEQUENCE | int | IN | Brief Sequence |
@MARKETINGPLANBRIEFID | uniqueidentifier | IN | Marketing Plan Brief ID |
@NEXTBRIEFSEQUENCE | int | IN | Next Brief Sequence |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_MKTSEGMENTATIONSEGMENT_DRAGDROPINSERT
(
@ID uniqueidentifier, /* Required. The mailing ID. */
@CHANGEAGENTID uniqueidentifier = null, /* Optional. The user ID that is making the change. */
@BRIEFS xml, /* Optional. Brief IDs to insert at the specified segment sequence. */
@SEGMENTS xml, /* Optional. Segment IDs (and their associated brief ID if any) to insert at the specified segment sequence. Brief IDs should only exist for segments where the entire brief is being moved. */
@SEGMENTSEQUENCE int, /* Required. The sequence to insert the segments at. */
@BRIEFSEQUENCE int, /* Required. The sequence to insert the briefs at. */
@MARKETINGPLANBRIEFID uniqueidentifier, /* Required. The brief to insert the segments into. */
@NEXTBRIEFSEQUENCE int /* Required. The brief sequence that comes after the segments being inserted. This number should already have the number of briefs that are selected above the drop point subtracted from it. */
)
as
set nocount on;
declare @CURRENTDATE datetime;
declare @SEGMENTSTABLE table ([ID] uniqueidentifier, [BRIEFID] uniqueidentifier);
declare @BRIEFSTABLE table ([ID] uniqueidentifier);
declare @TOPSEQ int;
declare @BOTTOMSEQ int;
declare @SEQ int;
declare @MINSEQ int;
declare @MINSEGMENTID uniqueidentifier;
declare @CURSOR cursor;
declare @COUNTABOVE int;
declare @COUNTBELOW int;
begin try
--Check if the mailing is currently being activated...
exec dbo.[USP_MKTSEGMENTATION_CHECKACTIVATION] @ID;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
set @CURRENTDATE = GetDate();
if @SEGMENTS is not null
begin
/*********************************/
/* Update the segments sequences */
/*********************************/
--Put the segment and brief IDs into a temp table
insert into @SEGMENTSTABLE
select T.c.value('(ID)[1]','uniqueidentifier') as 'ID',
T.c.value('(BRIEFID)[1]','uniqueidentifier') as 'BRIEFID'
from @SEGMENTS.nodes('/SEGMENTS/ITEM') T(c);
--Get the top and bottom sequences for the segments being inserted
select
@TOPSEQ = min([MKTSEGMENTATIONSEGMENT].[SEQUENCE]),
@BOTTOMSEQ = max([MKTSEGMENTATIONSEGMENT].[SEQUENCE])
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join @SEGMENTSTABLE as [T] on [T].[ID] = [MKTSEGMENTATIONSEGMENT].[ID];
if @SEGMENTSEQUENCE < @TOPSEQ
set @MINSEQ = @SEGMENTSEQUENCE;
else
set @MINSEQ = @TOPSEQ;
set @SEQ = @MINSEQ;
if @TOPSEQ <= (@SEGMENTSEQUENCE - 1)
begin
--Update the other segments sequences before the drop node first
set @CURSOR = cursor local fast_forward for
select [ID], null
from dbo.[MKTSEGMENTATIONSEGMENT]
where [SEGMENTATIONID] = @ID
and [SEQUENCE] between @TOPSEQ and (@SEGMENTSEQUENCE - 1)
and [ID] not in (select [ID] from @SEGMENTSTABLE)
order by [SEQUENCE];
exec dbo.[USP_MKTSEGMENTATIONSEGMENT_RESEQUENCESEGMENTS] @CURSOR, @SEQ output, default, default, @CHANGEAGENTID, @CURRENTDATE;
end
--Update the inserted segments sequences
set @CURSOR = cursor local fast_forward for
select [ID], [BRIEFID] from @SEGMENTSTABLE;
exec dbo.[USP_MKTSEGMENTATIONSEGMENT_RESEQUENCESEGMENTS] @CURSOR, @SEQ output, @MARKETINGPLANBRIEFID, @NEXTBRIEFSEQUENCE, @CHANGEAGENTID, @CURRENTDATE;
if @SEGMENTSEQUENCE <= @BOTTOMSEQ
begin
--Now update the other segments sequences after the drop node
set @CURSOR = cursor local fast_forward for
select [ID], null
from dbo.[MKTSEGMENTATIONSEGMENT]
where [SEGMENTATIONID] = @ID
and [SEQUENCE] between @SEGMENTSEQUENCE and @BOTTOMSEQ
and [ID] not in (select [ID] from @SEGMENTSTABLE)
order by [SEQUENCE];
exec dbo.[USP_MKTSEGMENTATIONSEGMENT_RESEQUENCESEGMENTS] @CURSOR, @SEQ output, default, default, @CHANGEAGENTID, @CURRENTDATE;
end
--Clear the cache for this segment and all segments after it
select
@MINSEGMENTID = [ID]
from dbo.[MKTSEGMENTATIONSEGMENT]
where [SEGMENTATIONID] = @ID
and [SEQUENCE] = @MINSEQ;
exec dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE] @MINSEGMENTID, 0, 1;
end
if @BRIEFS is not null
begin
/*******************************/
/* Update the briefs sequences */
/*******************************/
--Put the brief IDs into a temp table
insert into @BRIEFSTABLE
select T.c.value('(ID)[1]','uniqueidentifier') as 'ID'
from @BRIEFS.nodes('/BRIEFS/ITEM') T(c);
--Get the top and bottom sequences for the briefs being inserted
select
@TOPSEQ = min([MKTMARKETINGPLANBRIEF].[SEQUENCE]),
@BOTTOMSEQ = max([MKTMARKETINGPLANBRIEF].[SEQUENCE]),
@COUNTABOVE = sum(case when [MKTMARKETINGPLANBRIEF].[SEQUENCE] < @BRIEFSEQUENCE then 1 else 0 end),
@COUNTBELOW = sum(case when [MKTMARKETINGPLANBRIEF].[SEQUENCE] >= @BRIEFSEQUENCE then 1 else 0 end)
from dbo.[MKTMARKETINGPLANBRIEF]
inner join @BRIEFSTABLE as [T] on [T].[ID] = [MKTMARKETINGPLANBRIEF].[ID];
if @BRIEFSEQUENCE < @TOPSEQ
set @SEQ = @BRIEFSEQUENCE;
else
set @SEQ = @TOPSEQ;
if @TOPSEQ <= (@BRIEFSEQUENCE - 1)
begin
--Update the other briefs sequences before the drop node first
set @CURSOR = cursor local fast_forward for
select [MKTMARKETINGPLANBRIEF].[ID]
from dbo.[MKTMARKETINGPLANBRIEF]
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[MARKETINGPLANITEMID] = [MKTMARKETINGPLANBRIEF].[MARKETINGPLANITEMID]
where [MKTSEGMENTATION].[ID] = @ID
and [MKTMARKETINGPLANBRIEF].[SEQUENCE] between @TOPSEQ and (@BRIEFSEQUENCE - 1)
and [MKTMARKETINGPLANBRIEF].[ID] not in (select [ID] from @BRIEFSTABLE)
order by [MKTMARKETINGPLANBRIEF].[SEQUENCE];
exec dbo.[USP_MKTMARKETINGPLANBRIEF_RESEQUENCEBRIEFS] @CURSOR, @SEQ output, @CHANGEAGENTID, @CURRENTDATE;
declare @ABOVECOUNTS as table(ID uniqueidentifier, [COUNT] int);
insert into
@ABOVECOUNTS
select
MKTSEGMENTATIONSEGMENT.ID,
COUNT(MKTMARKETINGPLANBRIEF.ID)
from
MKTSEGMENTATIONSEGMENT
left join
MKTMARKETINGPLANBRIEF on MKTMARKETINGPLANBRIEF.SEQUENCE < MKTSEGMENTATIONSEGMENT.NEXTBRIEFSEQUENCE
inner join
@BRIEFSTABLE as [BRIEFSTABLE] on [BRIEFSTABLE].ID = MKTMARKETINGPLANBRIEF.ID
where [SEGMENTATIONID] = @ID
and [NEXTBRIEFSEQUENCE] <> 0
and [NEXTBRIEFSEQUENCE] between @TOPSEQ and @BRIEFSEQUENCE
and MKTSEGMENTATIONSEGMENT.[SEQUENCE] < @SEGMENTSEQUENCE
group by
MKTSEGMENTATIONSEGMENT.ID;
update dbo.[MKTSEGMENTATIONSEGMENT] set
[NEXTBRIEFSEQUENCE] = [NEXTBRIEFSEQUENCE] - [ABOVECOUNTS].[COUNT],
[CHANGEDBYID] = @CHANGEAGENTID,
[DATECHANGED] = @CURRENTDATE
from
dbo.[MKTSEGMENTATIONSEGMENT]
inner join @ABOVECOUNTS as [ABOVECOUNTS] on [ABOVECOUNTS].ID = dbo.MKTSEGMENTATIONSEGMENT.ID
where [SEGMENTATIONID] = @ID
and [NEXTBRIEFSEQUENCE] <> 0
and [NEXTBRIEFSEQUENCE] between @TOPSEQ and @BRIEFSEQUENCE
and [SEQUENCE] < @SEGMENTSEQUENCE;
end
--Update the inserted briefs sequences
set @CURSOR = cursor local fast_forward for
select [ID] from @BRIEFSTABLE;
exec dbo.[USP_MKTMARKETINGPLANBRIEF_RESEQUENCEBRIEFS] @CURSOR, @SEQ output, @CHANGEAGENTID, @CURRENTDATE;
if @BRIEFSEQUENCE <= @BOTTOMSEQ
begin
--Now update the other briefs sequences after the drop node
set @CURSOR = cursor local fast_forward for
select [MKTMARKETINGPLANBRIEF].[ID]
from dbo.[MKTMARKETINGPLANBRIEF]
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[MARKETINGPLANITEMID] = [MKTMARKETINGPLANBRIEF].[MARKETINGPLANITEMID]
where [MKTSEGMENTATION].[ID] = @ID
and [MKTMARKETINGPLANBRIEF].[SEQUENCE] between @BRIEFSEQUENCE and @BOTTOMSEQ
and [MKTMARKETINGPLANBRIEF].[ID] not in (select [ID] from @BRIEFSTABLE)
order by [MKTMARKETINGPLANBRIEF].[SEQUENCE];
exec dbo.[USP_MKTMARKETINGPLANBRIEF_RESEQUENCEBRIEFS] @CURSOR, @SEQ output, @CHANGEAGENTID, @CURRENTDATE;
update dbo.[MKTSEGMENTATIONSEGMENT] set
[NEXTBRIEFSEQUENCE] = [NEXTBRIEFSEQUENCE] + @COUNTBELOW,
[CHANGEDBYID] = @CHANGEAGENTID,
[DATECHANGED] = @CURRENTDATE
where [SEGMENTATIONID] = @ID
and [NEXTBRIEFSEQUENCE] <> 0
and [NEXTBRIEFSEQUENCE] between (@BRIEFSEQUENCE - 1) and @BOTTOMSEQ
and [SEQUENCE] >= @SEGMENTSEQUENCE;
end
end
/*********************************************************/
/* Double check that the sequence reordering is correct. */
/*********************************************************/
declare @BRIEFSEQS table ([ID] uniqueidentifier primary key, [OLDSEQUENCE] int, [NEWSEQUENCE] int);
declare @SEGMENTSEQS table ([ID] uniqueidentifier primary key, [OLDSEQUENCE] int, [NEWSEQUENCE] int);
insert into @BRIEFSEQS ([ID], [OLDSEQUENCE], [NEWSEQUENCE])
select [ID], [SEQUENCE], row_number() over (order by [SEQUENCE])
from dbo.[MKTMARKETINGPLANBRIEF]
where [MARKETINGPLANITEMID] = (select [MARKETINGPLANITEMID] from dbo.[MKTSEGMENTATION] where [ID] = @ID)
order by [SEQUENCE];
if exists(select * from @BRIEFSEQS where [OLDSEQUENCE] <> [NEWSEQUENCE])
begin
raiserror('BBERR_MKTSEGMENTATIONSEGMENT_DRAGDROPINSERT_OUTOFORDER', 13, 1);
raiserror('Error: Briefs will be out of order.', 1, 11);
end
insert into @SEGMENTSEQS ([ID], [OLDSEQUENCE], [NEWSEQUENCE])
select SS.[ID], SS.[SEQUENCE], row_number() over (order by isnull(cast(B.[SEQUENCE] as decimal(18,1)), cast(SS.[NEXTBRIEFSEQUENCE] as decimal(18,1)) - 0.5), SS.[SEQUENCE])
from dbo.[MKTSEGMENTATIONSEGMENT] as SS
left join dbo.[MKTMARKETINGPLANBRIEF] as B on B.[ID] = SS.[MARKETINGPLANBRIEFID]
where SS.[SEGMENTATIONID] = @ID
order by isnull(cast(B.[SEQUENCE] as decimal(18,1)), cast(SS.[NEXTBRIEFSEQUENCE] as decimal(18,1)) - 0.5), SS.[SEQUENCE];
if exists(select * from dbo.[MKTSEGMENTATIONSEGMENT] as SS inner join @SEGMENTSEQS as S on S.[ID] = SS.[ID] where S.[OLDSEQUENCE] <> S.[NEWSEQUENCE])
begin
raiserror('BBERR_MKTSEGMENTATIONSEGMENT_DRAGDROPINSERT_OUTOFORDER', 13, 1);
raiserror('Error: Segments will be out of order.', 1, 11);
end
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;