USP_DATAFORMTEMPLATE_EDIT_CURRENCYEXCHANGERATE

The save procedure used by the edit dataform template "Currency Exchange Rate 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.
@FROMCURRENCYID uniqueidentifier IN From currency
@TOCURRENCYID uniqueidentifier IN To currency
@RATE decimal(20, 8) IN Rate
@ASOFDATETIME datetime IN As of date/time
@TYPECODE tinyint IN Type
@SOURCECODEID uniqueidentifier IN Source
@TIMEZONEENTRYID uniqueidentifier IN Time zone

Definition

Copy


                    CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_CURRENCYEXCHANGERATE (
                        @ID uniqueidentifier,
                        @CHANGEAGENTID uniqueidentifier = null,
                        @FROMCURRENCYID uniqueidentifier,
                        @TOCURRENCYID uniqueidentifier,
                        @RATE decimal(20,8),
                        @ASOFDATETIME datetime,
                        @TYPECODE tinyint,
                        @SOURCECODEID uniqueidentifier,
                        @TIMEZONEENTRYID uniqueidentifier
                    ) as
                        set nocount on;

                        declare @CURRENTDATE datetime = getdate();

                        if @ID is null
                            set @ID = newid();

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

                        if @TIMEZONEENTRYID is null
                            set @TIMEZONEENTRYID = dbo.UFN_TIMEZONEENTRY_GETSYSTEMDEFAULT();

                        begin try

                            --Bug 103436 - AdamBu - Only date/time and source can be edited on existing rates.  As such,

                            --    error if the call is attempting to change anything else.

                            if exists(
                                select 1
                                from dbo.CURRENCYEXCHANGERATE
                                where ID = @ID
                                    and(
                                        (@FROMCURRENCYID is not null and FROMCURRENCYID <> @FROMCURRENCYID)
                                        or (@TOCURRENCYID is not null and TOCURRENCYID <> @TOCURRENCYID)
                                        or (@RATE <> 0 and RATE <> @RATE)
                                        or (@TYPECODE is not null and TYPECODE <> @TYPECODE)
                                    )
                            )
                            begin
                                raiserror('ERR_CANNOTEDITFIELDS - Only date, time, and source can be edited on existing exchange rates.', 13, 1);
                            end

                            declare @UTCOFFSET integer = dbo.UFN_TIMEZONEENTRY_GETTIMEZONEOFFSETFROMUTC(@TIMEZONEENTRYID, @ASOFDATETIME, 0);
                            declare @ASOFDATETIMEOFFSET datetimeoffset = TODATETIMEOFFSET(@ASOFDATETIME, @UTCOFFSET);

                            declare @NEXTRATEASOFDATE datetimeoffset;
                            declare @OLDASOFDATE datetimeoffset;
                            declare @OLDISLATESTRATEFORASOFDATE bit = 0;
                            declare @OLDTYPECODE tinyint;

                            select 
                                @OLDASOFDATE = ASOFDATE,
                                @OLDISLATESTRATEFORASOFDATE = ISLATESTRATEFORASOFDATE,
                                @OLDTYPECODE = TYPECODE
                            from
                                dbo.CURRENCYEXCHANGERATE
                            where
                                ID = @ID;

                            --Get the next ASOFDATE after the ASOFDATE of the updated record.

                            if @OLDTYPECODE <> 2
                                select top 1
                                    @NEXTRATEASOFDATE = ASOFDATE
                                from 
                                    dbo.CURRENCYEXCHANGERATE
                                where 
                                    FROMCURRENCYID = @FROMCURRENCYID
                                    and TOCURRENCYID = @TOCURRENCYID
                                    and ASOFDATE > @ASOFDATETIMEOFFSET
                                order by
                                    ASOFDATE; 

                            update dbo.CURRENCYEXCHANGERATE
                            set
                                ASOFDATE = @ASOFDATETIMEOFFSET,
                                SOURCECODEID = @SOURCECODEID,
                                TIMEZONEENTRYID = @TIMEZONEENTRYID,
                                NEXTRATEASOFDATE = 
                                    case when @NEXTRATEASOFDATE is null or @OLDTYPECODE = 2
                                        then null 
                                        else DATEADD(ms, -1, @NEXTRATEASOFDATE
                                    end,

                                -- If we changed the ASOFDATE and there are multiple rates having the same ASOFDATE, 

                                -- USP_CURRENCYEXCHANGERATE_HANDLEEXCHANGERATEINSERT will handle setting ISLATESTRATEFORASOFDATE correctly.

                                ISLATESTRATEFORASOFDATE = 
                                    case when @OLDASOFDATE <> @ASOFDATETIMEOFFSET
                                        then 1 
                                        else @OLDISLATESTRATEFORASOFDATE
                                    end,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CURRENTDATE
                            where 
                                ID = @ID;


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

                    return 0;