USP_APPEALMAILINGSETUP_CREATEORUPDATESEGMENT
Creates or updates the underlying segment for an appeal mailing from the setup form.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@ID | uniqueidentifier | INOUT | |
@CURRENTAPPUSERID | uniqueidentifier | IN | |
@CHANGEAGENTID | uniqueidentifier | IN | |
@APPEALMAILINGID | uniqueidentifier | IN | |
@NAME | nvarchar(100) | IN | |
@SELECTIONS | xml | IN |
Definition
Copy
CREATE procedure dbo.USP_APPEALMAILINGSETUP_CREATEORUPDATESEGMENT
(
@ID uniqueidentifier output,
@CURRENTAPPUSERID uniqueidentifier = null,
@CHANGEAGENTID uniqueidentifier = null,
@APPEALMAILINGID uniqueidentifier,
@NAME nvarchar(100),
@SELECTIONS xml
)
with execute as owner
as
begin
--This procedure creates a segment and a view that unions the selections together. This is required specifically for the appeal mailing setup form.
set nocount on;
declare @CURRENTDATE datetime = getDate();
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @UPDATE bit = 1;
if @ID is null
begin
set @ID = newId();
set @UPDATE = 0;
end
declare @BBECRECORDSOURCEID uniqueidentifier;
set @BBECRECORDSOURCEID = dbo.UFN_MKTRECORDSOURCE_GETFIRSTBBECRECORDSOURCEID();
declare @NEWNAME nvarchar(100);
select @NEWNAME = MKTSEGMENTATION.NAME from dbo.MKTSEGMENTATION inner join dbo.MKTSEGMENTATIONSEGMENT on MKTSEGMENTATIONSEGMENT.SEGMENTATIONID = MKTSEGMENTATION.ID where MKTSEGMENTATIONSEGMENT.SEGMENTID = @ID;
declare @MKTSEGMENTNAME nvarchar(100) = dbo.UFN_MKTSEGMENT_GETUNIQUENAME(@ID, @NAME, null);
declare @MKTSEGMENTDESCRIPTION nvarchar(255) = 'Auto generated segment for mailing "' + @NAME + '".';
if @UPDATE = 0 or @NAME <> @NEWNAME
set @MKTSEGMENTNAME = dbo.[UFN_MKTSEGMENT_GETUNIQUENAME](@ID, @NAME, null);
else
set @MKTSEGMENTNAME = dbo.[UFN_MKTSEGMENT_GETNAME](@ID);
if @UPDATE = 0
-- Save the segment
insert into dbo.MKTSEGMENT
(
ID,
NAME,
DESCRIPTION,
SEGMENTTYPECODE,
SEGMENTCATEGORYCODEID,
CODE,
QUERYVIEWCATALOGID,
PARTDEFINITIONVALUESID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
values
(
@ID,
@MKTSEGMENTNAME,
@MKTSEGMENTDESCRIPTION,
1,
null,
'',
@BBECRECORDSOURCEID,
null,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
);
else
update dbo.MKTSEGMENT
set
NAME = @MKTSEGMENTNAME,
DESCRIPTION = @MKTSEGMENTDESCRIPTION,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID = @ID;
declare @SEGMENTFAMILYTYPECODE tinyint;
select @SEGMENTFAMILYTYPECODE = SEGMENTFAMILYTYPECODE from dbo.MKTSEGMENT where ID = @ID;
if @UPDATE = 0
-- Insert a parameter set for the refresh process for this segment
insert into dbo.MKTSEGMENTREFRESHPROCESS
(
ID,
SEGMENTID,
ADDEDBYID,
CHANGEDBYID,
DATEADDED,
DATECHANGED
)
values
(
newid(),
@ID,
@CHANGEAGENTID,
@CHANGEAGENTID,
@CURRENTDATE,
@CURRENTDATE
);
-- Save all the selections
if @UPDATE = 0
exec dbo.USP_MKTSEGMENT_GETSELECTIONS_ADDFROMXML @ID, null, @SELECTIONS, @CHANGEAGENTID, @CURRENTDATE;
else
exec dbo.USP_MKTSEGMENT_GETSELECTIONS_UPDATEFROMXML @ID, null, @SELECTIONS, @CHANGEAGENTID, @CURRENTDATE;
-- Create the VIEW and add it to the IDSETREGISTER
declare @SEGSQL nvarchar(max);
declare @VIEWSQL nvarchar(max);
declare @SEGMENTVIEW nvarchar(60);
declare @TABLECOUNT int;
declare @BASETABLE nvarchar(255);
declare @UNIONTABLE nvarchar(255);
declare @SELECTIONNAME nvarchar(300);
declare @SEGMENTNAME nvarchar(100);
declare @SEGMENTDESCRIPTION nvarchar(255);
declare @DATATYPE nvarchar(128);
declare @SELECTIONID uniqueidentifier;
declare @IDSETREGISTERID uniqueidentifier;
declare @RECORDTYPEID uniqueidentifier;
declare @RETVAL int;
begin try
set @TABLECOUNT = 1;
set @BASETABLE = null;
-- Get the segment information
select
@SEGMENTVIEW = dbo.UFN_MKTSEGMENT_MAKEVIEWNAME(MKTSEGMENT.ID),
@SEGMENTNAME = MKTSEGMENT.NAME + ' (Segment)',
@SEGMENTDESCRIPTION = MKTSEGMENT.DESCRIPTION,
@DATATYPE = QUERYVIEWCATALOG.PRIMARYKEYTYPENAME,
@RECORDTYPEID = QUERYVIEWCATALOG.RECORDTYPEID
from
dbo.MKTSEGMENT
inner join
dbo.QUERYVIEWCATALOG on QUERYVIEWCATALOG.ID = MKTSEGMENT.QUERYVIEWCATALOGID
where
MKTSEGMENT.ID = @ID;
-- Segment selections
declare SEGMENTCURSOR cursor local fast_forward for
select
MKTSEGMENTSELECTION.SELECTIONID
from
dbo.MKTSEGMENTSELECTION
inner join
dbo.IDSETREGISTER on MKTSEGMENTSELECTION.SELECTIONID = IDSETREGISTER.ID
where
MKTSEGMENTSELECTION.SEGMENTID = @ID;
open SEGMENTCURSOR;
fetch next from SEGMENTCURSOR into @SELECTIONID;
while (@@FETCH_STATUS = 0)
begin
--Remove the CR and LF characters since we are inserting this name into a dash-dash (--) comment in the SQL we are building...
select
@SELECTIONNAME = replace(replace(NAME, char(13), ''), char(10), '')
from
dbo.IDSETREGISTER
where
ID = @SELECTIONID;
if @BASETABLE is null
begin
set @BASETABLE = 'T' + convert(nvarchar(10), @TABLECOUNT) + '';
set @SEGSQL = 'select '+ @BASETABLE +'.ID from dbo.' + dbo.UFN_MKTSELECTION_GETFUNCTIONNAME(@SELECTIONID) + ' as ' + @BASETABLE + ' --' + @SELECTIONNAME + char(13);
end
else
begin
set @UNIONTABLE = 'T' + convert(nvarchar(10), @TABLECOUNT) + '';
set @SEGSQL = isnull(@SEGSQL,'') + 'union select '+ @UNIONTABLE +'.ID from dbo.' + dbo.UFN_MKTSELECTION_GETFUNCTIONNAME(@SELECTIONID) + ' as ' + @UNIONTABLE + ' --' + @SELECTIONNAME + char(13);
end
set @TABLECOUNT = @TABLECOUNT + 1;
fetch next from SEGMENTCURSOR into @SELECTIONID;
end;
close SEGMENTCURSOR;
deallocate SEGMENTCURSOR;
-- Create or alter the segment view
declare @OBJID int;
select @OBJID = object_id(@SEGMENTVIEW, N'V');
if @OBJID is null
set @VIEWSQL = 'create';
else
set @VIEWSQL = 'alter';
set @VIEWSQL = @VIEWSQL + ' view dbo.' + @SEGMENTVIEW + '' + char(13) +
'as' + char(13) +
(case when @BASETABLE is null
then 'select top(0) cast(null as ' + @DATATYPE + ') as ID'
else @SEGSQL
end);
exec (@VIEWSQL);
-- Grant rights for new views
if @OBJID is null
exec ('grant select on dbo.' + @SEGMENTVIEW + ' to BBAPPFXSERVICEROLE');
-- Add to the ID Set Register
-- Get the view row count
declare @COUNTSQL nvarchar(max);
declare @PARAMETERS nvarchar(max);
declare @NUMROWS int;
set @COUNTSQL = 'select @NUMROWS = count(*) from dbo.' + @SEGMENTVIEW + '';
set @PARAMETERS = N'@NUMROWS int OUTPUT'
exec sp_executeSQL @COUNTSQL, @PARAMETERS, @NUMROWS OUTPUT;
-- Get the ID set ID if this is an edit operation, else it will be null. Also get the segment record type.
select distinct
@IDSETREGISTERID = MKTSEGMENT.IDSETREGISTERID,
@RECORDTYPEID = isnull(IDSETREGISTER.RECORDTYPEID, @RECORDTYPEID)
from
dbo.MKTSEGMENT
left join
dbo.MKTSEGMENTSELECTION on MKTSEGMENTSELECTION.SEGMENTID = MKTSEGMENT.ID
left join
dbo.IDSETREGISTER on MKTSEGMENTSELECTION.SELECTIONID = IDSETREGISTER.ID
where
MKTSEGMENT.ID = @ID;
-- Create the ID set...
exec dbo.USP_IDSETREGISTER_CREATEORUPDATE
@IDSETREGISTERID output,
@SEGMENTNAME,
@SEGMENTDESCRIPTION,
@SEGMENTVIEW,
0,
@RECORDTYPEID,
0,
1,
@NUMROWS,
@CHANGEAGENTID;
-- Mark as inactive so it is hidden from searches
-- Make sure the RECORDTYPEID gets set. The SP doesn't update it on an UPDATE.
update dbo.IDSETREGISTER
set
RECORDTYPEID = @RECORDTYPEID,
ACTIVE = 0,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID = @IDSETREGISTERID;
-- Save the ID set ID on the segment table...
update dbo.MKTSEGMENT
set
IDSETREGISTERID = @IDSETREGISTERID,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
ID = @ID;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
set @RETVAL = 1;
end catch
return isnull(@RETVAL, 0);
end