USP_SQLVIEWCATALOG_UPDATESUMMARYTILEINFO

Parameters

Parameter Parameter Type Mode Description
@DATAFORMINSTANCECATALOGID uniqueidentifier IN
@RECORDTYPE nvarchar(100) IN
@SUMMARYTILE xml IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_SQLVIEWCATALOG_UPDATESUMMARYTILEINFO
(
    @DATAFORMINSTANCECATALOGID uniqueidentifier,
    @RECORDTYPE nvarchar(100),
    @SUMMARYTILE xml = null,
    @CHANGEAGENTID uniqueidentifier = null
)
as

set nocount on;

begin try

    declare @CONTEXTCACHE varbinary(128);
    declare @ERRORMSG nvarchar(max);
    declare @CURRENTDATE datetime;
    set @CURRENTDATE = getdate();

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


    if coalesce(cast(@SUMMARYTILE as nvarchar(max)), '') <> ''
    begin

        -- Get the ID of the record type from the string passed in.


        declare @RECORDTYPEID uniqueidentifier = null;
        select top 1 @RECORDTYPEID = ID from dbo.RECORDTYPE where upper(NAME) = upper(@RECORDTYPE);
        if @RECORDTYPEID is null
        begin
            set @ERRORMSG = 'Could not find the record type "' + @RECORDTYPE + '" in the RECORDTYPE table.';
            raiserror(@ERRORMSG,13,1);
        end

        -- Populate a table with the categories from the spec's SummaryTile element.


        declare @CATEGORYTABLE table (
            EXISTINGROWID uniqueidentifier,
            NAME nvarchar(100),
            TILENAME nvarchar(100),
            DEFAULTSEQUENCE int,
            DEFAULTVISIBLE bit,
            SUMMARYTILECONTEXTID uniqueidentifier
        );

        with xmlnamespaces (default 'bb_appfx_viewdataformtemplate')
        insert into @CATEGORYTABLE (NAME, TILENAME, DEFAULTSEQUENCE, DEFAULTVISIBLE)
        select
            T.c.value('(@Name)[1]','nvarchar(100)') as 'NAME',
            T.c.value('(@TileName)[1]','nvarchar(100)') as 'TILENAME',
            coalesce(T.c.value('(@DefaultSequence)[1]','int'), 0) as 'DEFAULTSEQUENCE',
            coalesce(T.c.value('(@DefaultVisible)[1]','bit'), 0) as 'DEFAULTVISIBLE'
        from
            @SUMMARYTILE.nodes('/SummaryTile/Categories/Category') T(c);

        -- Find the row in SUMMARYTILECONTEXT corresponding to this record type and category.

        update CATEGORYTABLE
        set SUMMARYTILECONTEXTID = SUMMARYTILECONTEXT.ID
        from
            @CATEGORYTABLE as CATEGORYTABLE
            inner join dbo.SUMMARYTILECONTEXT
                on SUMMARYTILECONTEXT.CATEGORYKEY = CATEGORYTABLE.NAME
        where
            SUMMARYTILECONTEXT.RECORDTYPEID = @RECORDTYPEID;

        -- If we weren't able to find a SUMMARYTILECONTEXT row for a category in the

        -- collection, throw an error.  We want LoadSpec to stop on this rather than

        -- fail silently.

        declare @MISSINGCATEGORYNAME nvarchar(100) = null;
        select top 1
            @MISSINGCATEGORYNAME = coalesce(NAME, '')
        from @CATEGORYTABLE
        where SUMMARYTILECONTEXTID is null;

        if @MISSINGCATEGORYNAME is not null
        begin
            set @ERRORMSG = 'Could not find the category "' + @MISSINGCATEGORYNAME;
            set @ERRORMSG = @ERRORMSG + '" for the record type "' + @RECORDTYPE;
            set @ERRORMSG = @ERRORMSG + '".  Please ensure a row for this combination exists in the SUMMARYTILECONTEXT table.';
            raiserror(@ERRORMSG,13,1);
        end


        -- Find existing rows in the database table that match those in the spec.


        update CATEGORYTABLE
        set
            EXISTINGROWID = AVAILABLESUMMARYTILE.ID
        from @CATEGORYTABLE as CATEGORYTABLE
        inner join dbo.AVAILABLESUMMARYTILE
            on AVAILABLESUMMARYTILE.SUMMARYTILECONTEXTID = CATEGORYTABLE.SUMMARYTILECONTEXTID
        where
            AVAILABLESUMMARYTILE.DATAFORMINSTANCECATALOGID = @DATAFORMINSTANCECATALOGID


        -- Make the summary tile information in the database match what came in from the spec.

        -- 1. Insert rows from the spec that do not have a match in the database.

        -- 2. Update rows in the database that matched rows in the spec.

        -- 3. Delete rows in the database that are not present in the database.


        -- Step 1. Insert rows from the spec that do not have a match in the database.

        insert into AVAILABLESUMMARYTILE
        (
            ID,
            DATAFORMINSTANCECATALOGID,
            SUMMARYTILECONTEXTID,
            TILENAME,
            SEQUENCE,
            ISVISIBLEBYDEFAULT,
            ADDEDBYID,
            CHANGEDBYID,
            DATEADDED,
            DATECHANGED
        )
        select
            newid(),
            @DATAFORMINSTANCECATALOGID,
            CATEGORYTABLE.SUMMARYTILECONTEXTID,
            CATEGORYTABLE.TILENAME,
            CATEGORYTABLE.DEFAULTSEQUENCE,
            CATEGORYTABLE.DEFAULTVISIBLE,
            @CHANGEAGENTID,
            @CHANGEAGENTID,
            @CURRENTDATE,
            @CURRENTDATE
        from
            @CATEGORYTABLE as CATEGORYTABLE
        where
            CATEGORYTABLE.EXISTINGROWID is null;


        -- Step 2. Update rows in the database that matched rows in the spec.

        update dbo.AVAILABLESUMMARYTILE
        set
            TILENAME = CATEGORYTABLE.TILENAME,
            SEQUENCE = CATEGORYTABLE.DEFAULTSEQUENCE,
            ISVISIBLEBYDEFAULT = CATEGORYTABLE.DEFAULTVISIBLE,
            CHANGEDBYID = @CHANGEAGENTID,
            DATECHANGED = @CURRENTDATE
        from
            dbo.AVAILABLESUMMARYTILE
            inner join @CATEGORYTABLE as CATEGORYTABLE
                on CATEGORYTABLE.EXISTINGROWID = AVAILABLESUMMARYTILE.ID

        -- Step 3. Delete rows in the database that are not present in the database.

        --         Make sure we use CONTEXT_INFO appropriately for the audit info.


        set @CONTEXTCACHE = CONTEXT_INFO();
        set CONTEXT_INFO @CHANGEAGENTID;

        delete from dbo.AVAILABLESUMMARYTILE
        where
            DATAFORMINSTANCECATALOGID = @DATAFORMINSTANCECATALOGID
            and SUMMARYTILECONTEXTID not in (
                select SUMMARYTILECONTEXTID from @CATEGORYTABLE
            );

        if not @CONTEXTCACHE is null
            set CONTEXT_INFO @CONTEXTCACHE;

    end -- @SUMMARYTILE is not empty

    else
    begin
        -- @SUMMARYTILE is null or empty

        -- Remove the summary tile information in the database, if it's there.

        -- Make sure we use CONTEXT_INFO appropriately for the audit info.


        set @CONTEXTCACHE = CONTEXT_INFO();
        set CONTEXT_INFO @CHANGEAGENTID;

        delete from dbo.AVAILABLESUMMARYTILE
        where DATAFORMINSTANCECATALOGID = @DATAFORMINSTANCECATALOGID;

        if not @CONTEXTCACHE is null
            set CONTEXT_INFO @CONTEXTCACHE;
    end

end try
begin catch
    exec dbo.USP_RAISE_ERROR;
    return 1;
end catch

return 0;