USP_DATALIST_MKTSEGMENTATIONFINDERNUMBER

Displays a list of finder number ranges for a marketing effort.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN Input parameter indicating the context ID for the data list.
@CURRENTAPPUSERID uniqueidentifier IN Input parameter indicating the ID of the current user.

Definition

Copy


CREATE procedure dbo.[USP_DATALIST_MKTSEGMENTATIONFINDERNUMBER]
(
  @SEGMENTATIONID uniqueidentifier,
  @CURRENTAPPUSERID uniqueidentifier = null
)
as
  set nocount on;

  declare @MAILINGTYPECODE tinyint;
  declare @DATATABLE nvarchar(128);
  declare @WIDTH int;
  declare @CHECKDIGIT bit;
  declare @ID uniqueidentifier;
  declare @VENDORID uniqueidentifier;
  declare @MIN bigint;
  declare @MAX bigint;
  declare @QUANTITY bigint;
  declare @SQL nvarchar(max);
  declare @ASSIGNED bigint;
  declare @LASTHOUSEFILERANGEID uniqueidentifier;

  declare @CALCULATIONS table (
    [ID] uniqueidentifier not null,
    [VENDORID] uniqueidentifier,
    [MIN] bigint not null,
    [MAX] bigint not null,
    [QUANTITY] bigint not null,
    [ASSIGNED] bigint,
    [REMAINING] bigint,
    [CHECKDIGIT] bit not null
  );

  select
    @MAILINGTYPECODE = [MAILINGTYPECODE],
    @DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([ID])
  from dbo.[MKTSEGMENTATION]
  where [ID] = @SEGMENTATIONID;

  if @MAILINGTYPECODE = 2 -- memberships

    set @SQL = 'select @ASSIGNED = count(distinct [FINDERNUMBER]) from dbo.[' + @DATATABLE + '] where [FINDERNUMBER] > 0 and [FINDERNUMBER] between @MIN and @MAX';
  else        
    set @SQL = 'select @ASSIGNED = count([FINDERNUMBER]) from dbo.[' + @DATATABLE + '] where [FINDERNUMBER] > 0 and [FINDERNUMBER] between @MIN and @MAX';


  insert into @CALCULATIONS ([ID], [VENDORID], [MIN], [MAX], [QUANTITY], [ASSIGNED], [REMAINING], [CHECKDIGIT])
    select 
      [ID],
      [VENDORID],
      [MIN],
      [MAX],
      [MAX] - [MIN] + 1 as [QUANTITY],
      0 as [ASSIGNED],
      [MAX] - [MIN] + 1 as [REMAINING],
      [CHECKDIGIT]
    from dbo.[MKTSEGMENTATIONFINDERNUMBER]
    where [SEGMENTATIONID] = @SEGMENTATIONID;

  if not exists(select top 1 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLE)
    set @DATATABLE = null;

  select 
    @LASTHOUSEFILERANGEID = [ID]
  from dbo.[MKTSEGMENTATIONFINDERNUMBER]
  where [SEGMENTATIONID] = @SEGMENTATIONID
  and [VENDORID] is null
  and [MIN] = (select max([MIN]) from dbo.[MKTSEGMENTATIONFINDERNUMBER] where [SEGMENTATIONID] = @SEGMENTATIONID and [VENDORID] is null);


  declare CALCULATE cursor local fast_forward for
    select [ID], [VENDORID], [MIN], [MAX], [QUANTITY], [CHECKDIGIT]
    from @CALCULATIONS;

  open CALCULATE;
  fetch next from CALCULATE into @ID, @VENDORID, @MIN, @MAX, @QUANTITY, @CHECKDIGIT;

  while (@@FETCH_STATUS = 0)
    begin
      if @CHECKDIGIT = 1
        begin
          set @MIN = @MIN * 10;
          set @MAX = (@MAX * 10) + 9;
        end

      if @VENDORID is null
        begin
          set @ASSIGNED = 0;

          if not @DATATABLE is null
            exec sp_executesql @SQL, N'@ASSIGNED bigint output, @MIN bigint, @MAX bigint', @ASSIGNED = @ASSIGNED output, @MIN = @MIN, @MAX = @MAX;

          if @ID = @LASTHOUSEFILERANGEID
            set @ASSIGNED = isnull(@ASSIGNED, 0) + dbo.[UFN_MKTSEGMENTATIONSEED_GETSEEDCOUNT](@SEGMENTATIONID);

          update @CALCULATIONS set
            [ASSIGNED] = @ASSIGNED,
            [REMAINING] = case when @QUANTITY - @ASSIGNED < 0 then 0 else @QUANTITY - @ASSIGNED end
          where [ID] = @ID;
        end
      else
        update @CALCULATIONS set
          [ASSIGNED] = @QUANTITY,
          [REMAINING] = 0
        where [ID] = @ID;

      fetch next from CALCULATE into @ID, @VENDORID, @MIN, @MAX, @QUANTITY, @CHECKDIGIT;
    end

  close CALCULATE;
  deallocate CALCULATE;


  select
    @WIDTH = [FIXEDWIDTH],
    @CHECKDIGIT = [CHECKDIGIT]
  from dbo.[MKTFINDERNUMBER];

  select  
    [FN].[ID],
    isnull([C].[KEYNAME], '<House file>') as [VENDOR],
    [CAL].[QUANTITY],
    case 
      when [FN].[INUSE] = 1 then dbo.[UFN_MKTSEGMENTATIONFINDERNUMBER_BUILDRANGE]([FN].[MIN], [FN].[MAX], [FN].[FIXEDWIDTH], [FN].[CHECKDIGIT]) 
      else dbo.[UFN_MKTSEGMENTATIONFINDERNUMBER_BUILDRANGE]([FN].[MIN], [FN].[MAX], @WIDTH, @CHECKDIGIT
    end [RANGE],
    case 
      when [FN].[INUSE] = 1 then case [FN].[CHECKDIGIT] when 1 then 'Mod 10' else 'None' end
      else case @CHECKDIGIT when 1 then 'Mod 10' else 'None' end 
    end [CHECKDIGIT],
    case when [FN].[INUSE] = 1 then [FN].[FIXEDWIDTH] else @WIDTH end as [WIDTH],
    [CAL].[ASSIGNED],
    [CAL].[REMAINING]
  from @CALCULATIONS as [CAL]
  inner join dbo.[MKTSEGMENTATIONFINDERNUMBER] as [FN] on [FN].[ID] = [CAL].[ID]
  left outer join dbo.[CONSTITUENT] as [C] on [FN].[VENDORID] = [C].[ID];

  return 0;