USP_MKTSEGMENTATIONSEGMENT_DELETE

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

  declare @ACTIVE bit;
  declare @MAILINGTYPECODE tinyint;
  declare @SEGMENTATIONID uniqueidentifier;
  declare @SEGMENTATIONPACKAGEID uniqueidentifier;
  declare @PACKAGEID uniqueidentifier;
  declare @RECORDSOURCEID uniqueidentifier;
  declare @SEQUENCE int;
  declare @SEGMENTTYPECODE tinyint;
  declare @ISVENDORMANAGED bit;
  declare @DATATABLE nvarchar(128);
  declare @SQL nvarchar(max);
  declare @RESPONSECOUNTS table([OFFERS] int, [RESPONDERS] int, [RESPONSES] int, [TOTALGIFTAMOUNT] money, [AVERAGEGIFTAMOUNT] money, [ORGANIZATIONTOTALGIFTAMOUNT] money, [ORGANIZATIONAVERAGEGIFTAMOUNT] money);

  begin try
    /* Grab some info so we can remove the package and reorder the rest of the segments after the delete */
    select 
      @SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
      @DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]),
      @SEGMENTATIONPACKAGEID = (select [ID] from dbo.[MKTSEGMENTATIONPACKAGE] where [MKTSEGMENTATIONPACKAGE].[SEGMENTATIONID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] and [MKTSEGMENTATIONPACKAGE].[PACKAGEID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]),
      @PACKAGEID = [MKTSEGMENTATIONSEGMENT].[PACKAGEID],
      @SEQUENCE = [MKTSEGMENTATIONSEGMENT].[SEQUENCE],
      @RECORDSOURCEID = [MKTSEGMENT].[QUERYVIEWCATALOGID],
      @SEGMENTTYPECODE = [MKTSEGMENT].[SEGMENTTYPECODE],
      @ISVENDORMANAGED = (case when [MKTSEGMENT].[SEGMENTTYPECODE] = 2 then dbo.[UFN_MKTSEGMENT_ISVENDORMANAGEDLIST]([MKTSEGMENT].[ID]) else 0 end)
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
    where [MKTSEGMENTATIONSEGMENT].[ID] = @ID;

    select
      @ACTIVE = [ACTIVE],
      @MAILINGTYPECODE = [MKTSEGMENTATION].[MAILINGTYPECODE]
    from dbo.[MKTSEGMENTATION] where [ID] = @SEGMENTATIONID;

    if @ACTIVE = 0 and @MAILINGTYPECODE <> 4
      -- check if the mailing is currently being activated

      exec dbo.[USP_MKTSEGMENTATION_CHECKACTIVATION] @SEGMENTATIONID;

    if @MAILINGTYPECODE = 4 and exists (select top 1 1 from sys.tables where name = @DATATABLE)
      begin
        insert into @RESPONSECOUNTS
          exec dbo.[USP_MKTSEGMENTATIONSEGMENT_GETRESPONSECOUNTS] @ID, null, null;

        if (select top 1 [RESPONSES] from @RESPONSECOUNTS) > 0
          begin
            raiserror('ERR_MKTSEGMENTATIONSEGMENTPASSIVE_HASRESPONSES', 13, 1);
            return 1;
          end          
      end

    /* Delete each test segment individually so the packages get adjusted correctly */
    declare @TESTSEGMENTID uniqueidentifier;
    declare TESTSEGMENTCURSOR cursor local fast_forward for
      select [ID]
      from dbo.[MKTSEGMENTATIONTESTSEGMENT]
      where [SEGMENTID] = @ID
      order by [SEQUENCE] desc;

    open TESTSEGMENTCURSOR;
    fetch next from TESTSEGMENTCURSOR into @TESTSEGMENTID;

    while (@@FETCH_STATUS = 0)
      begin
        exec dbo.[USP_MKTSEGMENTATIONTESTSEGMENT_DELETE] @TESTSEGMENTID, @CHANGEAGENTID;

        fetch next from TESTSEGMENTCURSOR into @TESTSEGMENTID;
      end;

    close TESTSEGMENTCURSOR;
    deallocate TESTSEGMENTCURSOR;

    /* Clear any segment cache */
    if @SEGMENTTYPECODE in (1, 3, 4, 5) or (@SEGMENTTYPECODE = 2 and @ISVENDORMANAGED = 0)  --Constituent, revenue, membership, sponsorship, or imported list

      exec dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE] @ID, 1, 0;
    if @SEGMENTTYPECODE = 2 and @ISVENDORMANAGED = 1  --Vendor managed list

      delete from dbo.[MKTSEGMENTATIONSEGMENTCACHEINFO] where [SEGMENTID] = @ID;
    if @SEGMENTTYPECODE in (6, 7, 8)
      begin
        declare @MKTSEGMENTATIONSEGMENTACTIVEID uniqueidentifier;

        select
          @MKTSEGMENTATIONSEGMENTACTIVEID = [ID]
        from dbo.[MKTSEGMENTATIONSEGMENTACTIVE]
        where [SEGMENTID] = @ID;

        exec dbo.[USP_MKTSEGMENTATIONSEGMENTACTIVE_DELETEBYID_WITHCHANGEAGENTID] @MKTSEGMENTATIONSEGMENTACTIVEID, @CHANGEAGENTID;
      end

    /* Delete segmentation segment rows from the MKTSOURCECODEPART table. */
    declare @MKTSOURCECODEPARTID uniqueidentifier;
    declare MKTSOURCECODEPARTCURSOR cursor local fast_forward for
      select [ID]
      from dbo.[MKTSOURCECODEPART]
      where [SEGMENTATIONSEGMENTID] = @ID;

    open MKTSOURCECODEPARTCURSOR;
    fetch next from MKTSOURCECODEPARTCURSOR into @MKTSOURCECODEPARTID;

    while (@@FETCH_STATUS = 0)
      begin
        exec dbo.[USP_MKTSOURCECODEPART_DELETEBYID_WITHCHANGEAGENTID] @MKTSOURCECODEPARTID, @CHANGEAGENTID;

        fetch next from MKTSOURCECODEPARTCURSOR into @MKTSOURCECODEPARTID;
      end;

    close MKTSOURCECODEPARTCURSOR;
    deallocate MKTSOURCECODEPARTCURSOR;

    /* delete the mailing data and source analysis rule data */
    if @ACTIVE = 0 or @MAILINGTYPECODE = 4
      begin
        if exists(select top 1 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLE)
          begin
            set @SQL = 'delete from dbo.[' + @DATATABLE + '] where [SEGMENTID] = @ID;';

            exec sp_executesql @SQL, N'@ID uniqueidentifier', @ID = @ID;
          end

        set @DATATABLE = dbo.[UFN_MKTSOURCEANALYSISRULE_MAKETABLENAME](@RECORDSOURCEID);

        if exists(select top 1 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLE)
          begin
            set @SQL = 'delete from dbo.[' + @DATATABLE + '] where [SEGMENTID] = @ID;';

            exec sp_executesql @SQL, N'@ID uniqueidentifier', @ID = @ID;
          end
      end

    /* Delete segment from segmented house file import */
    if dbo.[UFN_MKTCONSTITUENTFILEIMPORT_IMPORTTABLEEXISTS](@SEGMENTATIONID) = 1
      begin
        set @DATATABLE = dbo.[UFN_MKTCONSTITUENTFILEIMPORT_BUILDTABLENAME](@SEGMENTATIONID);
        set @SQL = 'delete from dbo.[' + @DATATABLE + '] where [SEGMENTATIONSEGMENTID] = @ID;';
        exec sp_executesql @SQL, N'@ID uniqueidentifier', @ID = @ID;
      end

    /* Delete the segment */
    exec dbo.[USP_MKTSEGMENTATIONSEGMENT_DELETEBYID_WITHCHANGEAGENTID] @ID, @CHANGEAGENTID;

    /* Remove the package, only if is not being used by any other segments or test segments.*/
    if not exists(select [ID] from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @PACKAGEID) and
       not exists(select [MKTSEGMENTATIONTESTSEGMENT].[ID] from dbo.[MKTSEGMENTATIONTESTSEGMENT] inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTATIONTESTSEGMENT].[PACKAGEID] = @PACKAGEID)
      exec dbo.[USP_MKTSEGMENTATIONPACKAGE_DELETE] @SEGMENTATIONPACKAGEID, @CHANGEAGENTID;

    /* Reorder the rest of the segments */
    update dbo.[MKTSEGMENTATIONSEGMENT] set
      [SEQUENCE] = ([SEQUENCE] - 1),
      [CHANGEDBYID] = @CHANGEAGENTID,
      [DATECHANGED] = getdate()
    where [SEGMENTATIONID] = @SEGMENTATIONID
    and [SEQUENCE] > @SEQUENCE;
  end try

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

  return 0;