USP_DATAFORMTEMPLATE_EDIT_PDCOMPOSITESEGMENTMAPPINGLIST

The save procedure used by the edit dataform template "Composite Segment Mapping List 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.
@MAPPINGS xml IN Mappings

Definition

Copy


CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_PDCOMPOSITESEGMENTMAPPINGLIST (
  @ID uniqueidentifier
  ,@CHANGEAGENTID uniqueidentifier = null
  ,@MAPPINGS as xml
  )
as
set nocount on;

declare @DEFAULT_GUID uniqueidentifier = '99999999-9999-9999-9999-999999999999';

if @CHANGEAGENTID is null
  exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

declare @CURRENTDATE datetime;

set @CURRENTDATE = getdate();

-- I am not sure why this even exists since it is derived from PDACCOUNTSTRUCTUREID. I am probably wrong and don't understand the table structure.

declare @PDCOMPOSITESEGMENTID uniqueidentifier;

select @PDCOMPOSITESEGMENTID = PDACCOUNTTABLESAVAILABLEFORSEGMENTID
from PDACCOUNTSTRUCTURE
where PDACCOUNTSTRUCTURE.ID = @ID

declare @TMAPPINGS as table (
  ID uniqueidentifier
  ,ID1 uniqueidentifier
  ,ID2 uniqueidentifier
  ,ID3 uniqueidentifier
  ,ID4 uniqueidentifier
  ,[NAME] nvarchar(50)
  ,SEGMENTID uniqueidentifier
  );

insert into @TMAPPINGS (
  ID
  ,ID1
  ,ID2
  ,ID3
  ,ID4
  ,[NAME]
  ,SEGMENTID
  )
select coalesce(ID, newid())
  ,ID1
  ,ID2
  ,ID3
  ,ID4
  ,[NAME]
  ,SEGMENTID
from UFN_PDCOMPOSITESEGMENTENTRIES_FROMITEMLISTXML(@MAPPINGS)

--Pre-check for duplicates

if exists (
    select
        1
    from
        @TMAPPINGS T
    group by
        T.ID1, T.ID2, T.ID3, T.ID4
    having
        count(1) > 1
    )
begin
    raiserror('CK_PDCOMPOSITESEGMENTMAPPINGENTRY_VALIDMAPPING', 16, 1);
    return 1;
end

merge dbo.PDCOMPOSITESEGMENTMAPPING as target
using (
  select ID
    ,[NAME]
    ,SEGMENTID
  from @TMAPPINGS
  ) as source
  on (target.ID = source.ID)
when matched
  then
    update
    set target.[NAME] = source.[NAME]
      ,target.PDACCOUNTSEGMENTVALUEID = source.SEGMENTID
      ,target.CHANGEDBYID = @CHANGEAGENTID
      ,target.DATECHANGED = @CURRENTDATE
      ,target.COMPOSITESEGMENTKEY = ''
when not matched by target
  then
    insert (
      ID
      ,[NAME]
      ,PDACCOUNTSEGMENTVALUEID
      ,PDCOMPOSITESEGMENTID
      ,PDACCOUNTSTRUCTUREID
      ,ADDEDBYID
      ,CHANGEDBYID
      ,DATEADDED
      ,DATECHANGED
      )
    values (
      source.ID
      ,source.[NAME]
      ,source.SEGMENTID
      ,@PDCOMPOSITESEGMENTID -- ??

      ,@ID -- PDACCOUNTSTRUCTUREID

      ,@CHANGEAGENTID
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@CURRENTDATE
      )
when not matched by source
  and target.PDACCOUNTSTRUCTUREID = @ID
  then
    delete;

/* we must delete and re-add all entries because it attempts to validate uniqueness, and if we didn't delete them we would have a timing issue */
delete
from dbo.PDCOMPOSITESEGMENTMAPPINGENTRY
from dbo.PDCOMPOSITESEGMENTMAPPINGENTRY ENTRIES
inner join @TMAPPINGS NEWROWS on ENTRIES.PDCOMPOSITESEGMENTMAPPINGID = NEWROWS.ID

merge dbo.PDCOMPOSITESEGMENTMAPPINGENTRY as target
using (
  select MAPPINGID
    ,CSTL.ID as TABLELISTID
    ,LONGDESCRIPTIONID
    ,case 
      when LONGDESCRIPTIONID = @DEFAULT_GUID
        then 1
      else 0
      end as ISDEFAULT
  from (
    select ID as MAPPINGID
      ,CAST(SUBSTRING(COL, 3, 1) as int) as SEQUENCE
      ,LDID as LONGDESCRIPTIONID
    from (
      select ID
        ,ID1
        ,ID2
        ,ID3
        ,ID4
      from @TMAPPINGS
      ) p
    UNPIVOT(LDID for COL in (
          ID1
          ,ID2
          ,ID3
          ,ID4
          )) as unpvt
    ) as unpvt
  inner join dbo.PDCOMPOSITESEGMENTTABLELIST as CSTL on unpvt.SEQUENCE = CSTL.SEQUENCE
    and CSTL.PDCOMPOSITESEGMENTID = @PDCOMPOSITESEGMENTID
  ) as source
  on (
      target.PDCOMPOSITESEGMENTMAPPINGID = source.MAPPINGID
      and target.PDCOMPOSITESEGMENTTABLELISTID = source.TABLELISTID
      )
when matched
  and not source.LONGDESCRIPTIONID is null
  then
    update
    set target.LONGDESCRIPTIONID = source.LONGDESCRIPTIONID
      ,target.ISDEFAULT = source.ISDEFAULT
      ,target.CHANGEDBYID = @CHANGEAGENTID
   ,target.DATECHANGED = @CURRENTDATE
when not matched by target
  and not source.LONGDESCRIPTIONID is null
  then
    insert (
      ID
      ,PDCOMPOSITESEGMENTMAPPINGID
      ,PDCOMPOSITESEGMENTTABLELISTID
      ,LONGDESCRIPTIONID
      ,ISDEFAULT
      ,ADDEDBYID
      ,CHANGEDBYID
      ,DATEADDED
      ,DATECHANGED
      )
    values (
      newid()
      ,source.MAPPINGID
      ,source.TABLELISTID
      ,source.LONGDESCRIPTIONID
      ,source.ISDEFAULT
      ,@CHANGEAGENTID
      ,@CHANGEAGENTID
      ,@CURRENTDATE
      ,@CURRENTDATE
      );

return 0;