UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@MEMBERSHIPLEVELID uniqueidentifier IN
@TOTALAMOUNT money IN
@DECIMALDIGITS tinyint IN

Definition

Copy


            CREATE function dbo.UFN_MEMBERSHIP_GETCONTRIBUTEDAMOUNTSBYLEVELID
            (
                @MEMBERSHIPLEVELID uniqueidentifier,
                @TOTALAMOUNT money,
                @DECIMALDIGITS tinyint
            )
            returns @RETVAL table
            (
                DESIGNATIONID uniqueidentifier, 
                AMOUNT money
            )
            with execute as caller
            as begin

                declare @DESIGNATIONID uniqueidentifier;
                declare @PERCENT decimal(20,4);
                declare @NUMDESIGNATIONS integer;
                declare @COUNTER tinyint = 1;
                declare @AMOUNTLEFT money = @TOTALAMOUNT;
                declare @CURRENTAMOUNT money;

                select @NUMDESIGNATIONS = coalesce(count(ID), 0)
                from dbo.MEMBERSHIPLEVELDESIGNATION
                where MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID

                declare DESIGNATIONCURSOR cursor local fast_forward
                for select DESIGNATIONID, [PERCENT] from dbo.MEMBERSHIPLEVELDESIGNATION
                where MEMBERSHIPLEVELID = @MEMBERSHIPLEVELID

                open DESIGNATIONCURSOR
                fetch next from DESIGNATIONCURSOR into @DESIGNATIONID, @PERCENT

                while @@FETCH_STATUS = 0
                begin
                    if @COUNTER < @NUMDESIGNATIONS
                    begin
                        set @CURRENTAMOUNT = round(@TOTALAMOUNT * 0.01 * @PERCENT,@DECIMALDIGITS)
                        set @AMOUNTLEFT -= @CURRENTAMOUNT
                    end
                    else
                    begin
                        set @CURRENTAMOUNT = @AMOUNTLEFT
                    end

                    insert into @RETVAL (DESIGNATIONID, AMOUNT)
                    values (@DESIGNATIONID, @CURRENTAMOUNT)

                    set @COUNTER += 1
                    fetch next from DESIGNATIONCURSOR into @DESIGNATIONID, @PERCENT
                end

                --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

                close DESIGNATIONCURSOR;
                deallocate DESIGNATIONCURSOR;

                return
            end