USP_MKTSEGMENTLIST_UPDATEEXISTINGSELECTIONS

Updates any existing selections created from the list segment to use the newest imported data for the segment.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN
@ROLLBACK bit IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


create procedure dbo.[USP_MKTSEGMENTLIST_UPDATEEXISTINGSELECTIONS]
(
  @SEGMENTID uniqueidentifier,
  @ROLLBACK bit = 0,
  @CHANGEAGENTID uniqueidentifier = null
)
as
  set nocount on;

  declare @NEWQUERYVIEWCATALOGID uniqueidentifier;
  declare @NEWRECORDTYPEID uniqueidentifier;
  declare @NEWRECORDTYPENAME nvarchar(50);
  declare @NEWVIEWNAME nvarchar(128);
  declare @OLDQUERYVIEWCATALOGID uniqueidentifier;
  declare @OLDRECORDTYPEID uniqueidentifier;
  declare @OLDVIEWNAME nvarchar(128);
  declare @ADHOCQUERYID uniqueidentifier;
  declare @QUERYDEFINITIONXML xml;
  declare @CURRENTDATE datetime;

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

    set @CURRENTDATE = getdate();
    set @ROLLBACK = isnull(@ROLLBACK, 0);

    if @ROLLBACK = 0
      --Grab the new queryview info...

      select
        @NEWQUERYVIEWCATALOGID = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID],
        @NEWRECORDTYPEID = [RECORDTYPE].[ID],
        @NEWRECORDTYPENAME = [RECORDTYPE].[NAME],
        @NEWVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME]
      from dbo.[MKTSEGMENT]
      inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
      inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID]
      inner join dbo.[RECORDTYPE] on [RECORDTYPE].[ID] = [QUERYVIEWCATALOG].[RECORDTYPEID]
      where [MKTSEGMENT].[ID] = @SEGMENTID;
    else
      --Rollback, so grab the previous query view info...

      with [PREV] ([ID]) as
      (
        select top 1 [MKTSEGMENTLIST].[ID]
        from dbo.[MKTSEGMENT]
        inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[SEGMENTID] = [MKTSEGMENT].[ID]
        where [MKTSEGMENT].[ID] = @SEGMENTID
        and [MKTSEGMENT].[CURRENTSEGMENTLISTID] <> [MKTSEGMENTLIST].[ID]
        order by [MKTSEGMENTLIST].[DATEADDED] desc
      )
      select
        @NEWQUERYVIEWCATALOGID = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID],
        @NEWRECORDTYPEID = [RECORDTYPE].[ID],
        @NEWRECORDTYPENAME = [RECORDTYPE].[NAME],
        @NEWVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME]
      from [PREV]
      inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [PREV].[ID]
      inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID]
      inner join dbo.[RECORDTYPE] on [RECORDTYPE].[ID] = [QUERYVIEWCATALOG].[RECORDTYPEID];

    --Grab the old queryview info...

    select top 1
      @OLDQUERYVIEWCATALOGID = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID],
      @OLDRECORDTYPEID = [QUERYVIEWCATALOG].[RECORDTYPEID],
      @OLDVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME]
    from dbo.[MKTSEGMENTLIST]
    inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID]
    where [MKTSEGMENTLIST].[SEGMENTID] = @SEGMENTID
    and [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] <> @NEWQUERYVIEWCATALOGID
    order by [MKTSEGMENTLIST].[DATEADDED] desc;

    --Loop through all adhoc queries created against the old queryview and update them to use the new queryview...

    declare ADHOCQUERYCURSOR cursor local fast_forward for
      select [ID], [QUERYDEFINITIONXML]
      from dbo.[ADHOCQUERY]
      where [QUERYVIEWCATALOGID] = @OLDQUERYVIEWCATALOGID;

    open ADHOCQUERYCURSOR;
    fetch next from ADHOCQUERYCURSOR into @ADHOCQUERYID, @QUERYDEFINITIONXML;

    while (@@FETCH_STATUS = 0)
    begin
      --Replace the record type, QueryView ID, and all references to the old QueryView objectname...

      set @QUERYDEFINITIONXML.modify(N'declare namespace bbspec="Blackbaud.AppFx.WebService.API.1"; replace value of /bbspec:AdHocQuery[1]/@RecordType with sql:variable("@NEWRECORDTYPENAME")');
      set @QUERYDEFINITIONXML.modify(N'declare namespace bbspec="Blackbaud.AppFx.WebService.API.1"; replace value of /bbspec:AdHocQuery[1]/bbspec:QueryView[1]/@ID with sql:variable("@NEWQUERYVIEWCATALOGID")');
      set @QUERYDEFINITIONXML = replace(cast(@QUERYDEFINITIONXML as nvarchar(max)), @OLDVIEWNAME, @NEWVIEWNAME);

      --Update the Ad-hoc query record...

      update dbo.[ADHOCQUERY] set
        [QUERYVIEWCATALOGID] = @NEWQUERYVIEWCATALOGID,
        [QUERYDEFINITIONXML] = @QUERYDEFINITIONXML,
        [CHANGEDBYID] = @CHANGEAGENTID,
        [DATECHANGED] = @CURRENTDATE
      where [ID] = @ADHOCQUERYID;

      fetch next from ADHOCQUERYCURSOR into @ADHOCQUERYID, @QUERYDEFINITIONXML;
    end

    close ADHOCQUERYCURSOR;
    deallocate ADHOCQUERYCURSOR;

    --Update the record type for all ID sets that have the old record type.  This

    --includes the standard ID set, duplicate ID set, any selections, and any segments.

    if @OLDRECORDTYPEID <> @NEWRECORDTYPEID
      update dbo.[IDSETREGISTER] set
        [RECORDTYPEID] = @NEWRECORDTYPEID,
        [CHANGEDBYID] = @CHANGEAGENTID,
        [DATECHANGED] = @CURRENTDATE
      where [RECORDTYPEID] = @OLDRECORDTYPEID;
  end try

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

  return 0;