Table 330 Currency Exchange Rate

App
Base Application
Namespace
Microsoft.Finance.Currency
Versions
17-28

Fields, 8Keys, 1Procedures, 14Events, 8

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/Currency/CurrencyExchangeRate.Table.al717 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.Currency;

table 330 "Currency Exchange Rate"
{
    Caption = 'Currency Exchange Rate';
    DataCaptionFields = "Currency Code";
    DrillDownPageID = "Currency Exchange Rates";
    LookupPageID = "Currency Exchange Rates";
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Currency Code"; Code[10])
        {
            Caption = 'Currency Code';
            ToolTip = 'Specifies the code of the currency on this line.';
            Editable = false;
            NotBlank = true;
            TableRelation = Currency;

            trigger OnValidate()
            begin
                if "Currency Code" = "Relational Currency Code" then
                    Error(
                      Text000, FieldCaption("Currency Code"), FieldCaption("Relational Currency Code"));
            end;
        }
        field(2; "Starting Date"; Date)
        {
            Caption = 'Starting Date';
            ToolTip = 'Specifies the date on which the exchange rate on this line comes into effect.';
            NotBlank = true;
        }
        field(3; "Exchange Rate Amount"; Decimal)
        {
            Caption = 'Exchange Rate Amount';
            ToolTip = 'Specifies the amounts that are used to calculate exchange rates for the currency on this line.';
            DecimalPlaces = 1 : 6;
            MinValue = 0;
            AutoFormatType = 0;

            trigger OnValidate()
            begin
                TestField("Exchange Rate Amount");
            end;
        }
        field(4; "Adjustment Exch. Rate Amount"; Decimal)
        {
            AccessByPermission = TableData Currency = R;
            Caption = 'Adjustment Exch. Rate Amount';
            ToolTip = 'Specifies the amounts that are used to calculate exchange rates that will be used by the Adjust Exchange Rates batch job.';
            DecimalPlaces = 1 : 6;
            MinValue = 0;
            AutoFormatType = 0;

            trigger OnValidate()
            begin
                TestField("Adjustment Exch. Rate Amount");
            end;
        }
        field(5; "Relational Currency Code"; Code[10])
        {
            Caption = 'Relational Currency Code';
            ToolTip = 'Specifies how you want to set up the two currencies, one of the currencies can be LCY, for which you want to register exchange rates.';
            TableRelation = Currency;

            trigger OnValidate()
            begin
                if "Currency Code" = "Relational Currency Code" then
                    Error(
                      Text000, FieldCaption("Currency Code"), FieldCaption("Relational Currency Code"));
            end;
        }
        field(6; "Relational Exch. Rate Amount"; Decimal)
        {
            AccessByPermission = TableData Currency = R;
            Caption = 'Relational Exch. Rate Amount';
            ToolTip = 'Specifies the amounts that are used to calculate exchange rates for the foreign currency on this line.';
            DecimalPlaces = 1 : 6;
            MinValue = 0;
            AutoFormatType = 0;

            trigger OnValidate()
            begin
                TestField("Relational Exch. Rate Amount");
            end;
        }
        field(7; "Fix Exchange Rate Amount"; Enum "Fix Exch. Rate Amount Type")
        {
            Caption = 'Fix Exchange Rate Amount';
            ToolTip = 'Specifies if the currency''s exchange rate can be changed on invoices and journal lines.';
        }
        field(8; "Relational Adjmt Exch Rate Amt"; Decimal)
        {
            AccessByPermission = TableData Currency = R;
            Caption = 'Relational Adjmt Exch Rate Amt';
            ToolTip = 'Specifies the amounts that are used to calculate exchange rates that will be used by the Adjust Exchange Rates batch job.';
            DecimalPlaces = 1 : 6;
            MinValue = 0;
            AutoFormatType = 0;

            trigger OnValidate()
            begin
                TestField("Relational Adjmt Exch Rate Amt");
            end;
        }
    }

    keys
    {
        key(Key1; "Currency Code", "Starting Date")
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    var
        CurrencyExchRate2: array[2] of Record "Currency Exchange Rate";
        CurrencyExchRate3: array[3] of Record "Currency Exchange Rate";
        RelExchangeRateAmt: Decimal;
        ExchangeRateAmt: Decimal;
        RelCurrencyCode: Code[10];
        FixExchangeRateAmt: Enum "Fix Exch. Rate Amount Type";
        CurrencyFactor: Decimal;
        UseAdjmtAmounts: Boolean;
        CurrencyCode2: array[2] of Code[10];
        Date2: array[2] of Date;

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'The currency code in the %1 field and the %2 field cannot be the same.';
#pragma warning restore AA0470
#pragma warning restore AA0074

    procedure ExchangeAmtLCYToFCY(Date: Date; CurrencyCode: Code[10]; Amount: Decimal; Factor: Decimal): Decimal
    var
        IsHandled: Boolean;
    begin
        OnBeforeExchangeAmtLCYToFCY(Rec, Date, CurrencyCode, Amount, Factor, RelExchangeRateAmt, ExchangeRateAmt, RelCurrencyCode, FixExchangeRateAmt, IsHandled);
        if IsHandled then
            exit(Amount);
        if CurrencyCode = '' then
            exit(Amount);
        FindCurrency(Date, CurrencyCode, 1);
        TestField("Exchange Rate Amount");
        TestField("Relational Exch. Rate Amount");
        if "Relational Currency Code" = '' then
            if "Fix Exchange Rate Amount" = "Fix Exchange Rate Amount"::Both then
                Amount := (Amount / "Relational Exch. Rate Amount") * "Exchange Rate Amount"
            else
                Amount := Amount * Factor
        else begin
            RelExchangeRateAmt := "Relational Exch. Rate Amount";
            ExchangeRateAmt := "Exchange Rate Amount";
            RelCurrencyCode := "Relational Currency Code";
            FixExchangeRateAmt := "Fix Exchange Rate Amount";
            FindCurrency(Date, RelCurrencyCode, 2);
            TestField("Exchange Rate Amount");
            TestField("Relational Exch. Rate Amount");
            case FixExchangeRateAmt of
                "Fix Exchange Rate Amount"::"Relational Currency":
                    ExchangeRateAmt :=
                      (Factor * RelExchangeRateAmt * "Relational Exch. Rate Amount") /
                      "Exchange Rate Amount";
                "Fix Exchange Rate Amount"::Currency:
                    RelExchangeRateAmt :=
                      (ExchangeRateAmt * "Exchange Rate Amount") /
                      (Factor * "Relational Exch. Rate Amount");
                "Fix Exchange Rate Amount"::Both:
                    case "Fix Exchange Rate Amount" of
                        "Fix Exchange Rate Amount"::"Relational Currency":
                            "Exchange Rate Amount" :=
                              (Factor * RelExchangeRateAmt * "Relational Exch. Rate Amount") /
                              ExchangeRateAmt;
                        "Fix Exchange Rate Amount"::Currency:
                            "Relational Exch. Rate Amount" :=
                              (ExchangeRateAmt * "Exchange Rate Amount") /
                              (Factor * RelExchangeRateAmt);
                    end;
            end;
            Amount := (Amount / RelExchangeRateAmt) * ExchangeRateAmt;
            Amount := (Amount / "Relational Exch. Rate Amount") * "Exchange Rate Amount";
        end;
        exit(Amount);
    end;

    procedure ExchangeAmtFCYToLCY(Date: Date; CurrencyCode: Code[10]; Amount: Decimal; Factor: Decimal): Decimal
    var
        IsHandled: Boolean;
    begin
        OnBeforeExchangeAmtFCYToLCY(Rec, Date, CurrencyCode, Amount, Factor, UseAdjmtAmounts, RelExchangeRateAmt, ExchangeRateAmt, RelCurrencyCode, FixExchangeRateAmt, IsHandled);
        if IsHandled then
            exit(Amount);
        if CurrencyCode = '' then
            exit(Amount);
        FindCurrency(Date, CurrencyCode, 1);
        if not UseAdjmtAmounts then begin
            TestField("Exchange Rate Amount");
            TestField("Relational Exch. Rate Amount");
        end else begin
            TestField("Adjustment Exch. Rate Amount");
            TestField("Relational Adjmt Exch Rate Amt");
            "Exchange Rate Amount" := "Adjustment Exch. Rate Amount";
            "Relational Exch. Rate Amount" := "Relational Adjmt Exch Rate Amt";
            OnExchangeAmtFCYToLCYOnAfterSetRelationalExchRateAmount(Rec);
        end;
        if "Relational Currency Code" = '' then
            if "Fix Exchange Rate Amount" = "Fix Exchange Rate Amount"::Both then
                Amount := (Amount / "Exchange Rate Amount") * "Relational Exch. Rate Amount"
            else
                Amount := Amount / Factor
        else begin
            RelExchangeRateAmt := "Relational Exch. Rate Amount";
            ExchangeRateAmt := "Exchange Rate Amount";
            RelCurrencyCode := "Relational Currency Code";
            FixExchangeRateAmt := "Fix Exchange Rate Amount";
            FindCurrency(Date, RelCurrencyCode, 2);
            if not UseAdjmtAmounts then begin
                TestField("Exchange Rate Amount");
                TestField("Relational Exch. Rate Amount");
            end else begin
                TestField("Adjustment Exch. Rate Amount");
                TestField("Relational Adjmt Exch Rate Amt");
                "Exchange Rate Amount" := "Adjustment Exch. Rate Amount";
                "Relational Exch. Rate Amount" := "Relational Adjmt Exch Rate Amt";
                OnExchangeAmtFCYToLCYOnAfterSetRelationalExchRateAmount(Rec);
            end;
            case FixExchangeRateAmt of
                "Fix Exchange Rate Amount"::"Relational Currency":
                    ExchangeRateAmt :=
                      (RelExchangeRateAmt * "Relational Exch. Rate Amount") /
                      ("Exchange Rate Amount" * Factor);
                "Fix Exchange Rate Amount"::Currency:
                    RelExchangeRateAmt :=
                      ((Factor * ExchangeRateAmt * "Exchange Rate Amount") /
                       "Relational Exch. Rate Amount");
                "Fix Exchange Rate Amount"::Both:
                    case "Fix Exchange Rate Amount" of
                        "Fix Exchange Rate Amount"::"Relational Currency":
                            "Exchange Rate Amount" :=
                              (RelExchangeRateAmt * "Relational Exch. Rate Amount") /
                              (ExchangeRateAmt * Factor);
                        "Fix Exchange Rate Amount"::Currency:
                            "Relational Exch. Rate Amount" :=
                              ((Factor * ExchangeRateAmt * "Exchange Rate Amount") /
                               RelExchangeRateAmt);
                        "Fix Exchange Rate Amount"::Both:
                            begin
                                Amount := (Amount / ExchangeRateAmt) * RelExchangeRateAmt;
                                Amount := (Amount / "Exchange Rate Amount") * "Relational Exch. Rate Amount";
                                exit(Amount);
                            end;
                    end;
            end;
            Amount := (Amount / RelExchangeRateAmt) * ExchangeRateAmt;
            Amount := (Amount / "Relational Exch. Rate Amount") * "Exchange Rate Amount";
        end;
        exit(Amount);
    end;

    procedure ExchangeRate(Date: Date; CurrencyCode: Code[10]): Decimal
    var
        IsHandled: Boolean;
    begin
        OnBeforeExchangeRate(Rec, Date, CurrencyCode, CurrencyFactor, UseAdjmtAmounts, RelExchangeRateAmt, ExchangeRateAmt, RelCurrencyCode, IsHandled);
        if IsHandled then
            exit(CurrencyFactor);
        if CurrencyCode = '' then
            exit(1);
        FindCurrency(Date, CurrencyCode, 1);
        if not UseAdjmtAmounts then begin
            TestField("Exchange Rate Amount");
            TestField("Relational Exch. Rate Amount");
        end else begin
            TestField("Adjustment Exch. Rate Amount");
            TestField("Relational Adjmt Exch Rate Amt");
            "Exchange Rate Amount" := "Adjustment Exch. Rate Amount";
            "Relational Exch. Rate Amount" := "Relational Adjmt Exch Rate Amt";
            OnExchangeRateOnAfterSetRelationalExchRateAmount(Rec);
        end;
        RelExchangeRateAmt := "Relational Exch. Rate Amount";
        ExchangeRateAmt := "Exchange Rate Amount";
        RelCurrencyCode := "Relational Currency Code";
        if "Relational Currency Code" = '' then
            CurrencyFactor := "Exchange Rate Amount" / "Relational Exch. Rate Amount"
        else begin
            FindCurrency(Date, RelCurrencyCode, 2);
            if not UseAdjmtAmounts then begin
                TestField("Exchange Rate Amount");
                TestField("Relational Exch. Rate Amount");
            end else begin
                TestField("Adjustment Exch. Rate Amount");
                TestField("Relational Adjmt Exch Rate Amt");
                "Exchange Rate Amount" := "Adjustment Exch. Rate Amount";
                "Relational Exch. Rate Amount" := "Relational Adjmt Exch Rate Amt";
                OnExchangeRateOnAfterSetRelationalExchRateAmount(Rec);
            end;
            CurrencyFactor := (ExchangeRateAmt * "Exchange Rate Amount") / (RelExchangeRateAmt * "Relational Exch. Rate Amount");
        end;
        exit(CurrencyFactor);
    end;

    procedure ExchangeAmtLCYToFCYOnlyFactor(Amount: Decimal; Factor: Decimal): Decimal
    begin
        Amount := Factor * Amount;
        exit(Amount);
    end;

    procedure ExchangeAmtFCYToLCYAdjmt(Date: Date; CurrencyCode: Code[10]; Amount: Decimal; Factor: Decimal): Decimal
    begin
        UseAdjmtAmounts := true;
        exit(ExchangeAmtFCYToLCY(Date, CurrencyCode, Amount, Factor));
    end;

    procedure ExchangeRateAdjmt(Date: Date; CurrencyCode: Code[10]): Decimal
    begin
        UseAdjmtAmounts := true;
        exit(ExchangeRate(Date, CurrencyCode));
    end;

    procedure ExchangeAmount(Amount: Decimal; FromCurrencyCode: Code[10]; ToCurrencyCode: Code[10]; UsePostingDate: Date): Decimal
    var
        ToCurrency: Record Currency;
    begin
        if (FromCurrencyCode = ToCurrencyCode) or (Amount = 0) then
            exit(Amount);

        Amount :=
          ExchangeAmtFCYToFCY(
            UsePostingDate, FromCurrencyCode, ToCurrencyCode, Amount);

        if ToCurrencyCode <> '' then begin
            ToCurrency.Get(ToCurrencyCode);
            Amount := Round(Amount, ToCurrency."Amount Rounding Precision");
        end else
            Amount := Round(Amount);

        exit(Amount);
    end;

    procedure FindCurrency(Date: Date; CurrencyCode: Code[10]; CacheNo: Integer)
    var
        ShouldUseCache: Boolean;
    begin
        ShouldUseCache := (CurrencyCode2[CacheNo] = CurrencyCode) and (Date2[CacheNo] = Date);
        OnFindCurrencyOnAfterCalcShouldUseCache(Rec, CacheNo, ShouldUseCache);
        if ShouldUseCache then
            Rec := CurrencyExchRate2[CacheNo]
        else begin
            if Date = 0D then
                Date := WorkDate();
            CurrencyExchRate2[CacheNo].SetRange("Currency Code", CurrencyCode);
            CurrencyExchRate2[CacheNo].SetRange("Starting Date", 0D, Date);
            OnFindCurrencyOnAfterCurrencyExchRate2SetFilters(CurrencyExchRate2[CacheNo], CurrencyCode, Date, Rec);
            CurrencyExchRate2[CacheNo].FindLast();
            Rec := CurrencyExchRate2[CacheNo];
            CurrencyCode2[CacheNo] := CurrencyCode;
            Date2[CacheNo] := Date;
        end;
        OnAfterFindCurrency(Rec, CurrencyExchRate2, Date, CurrencyCode, CacheNo);
    end;

    procedure ExchangeAmtFCYToFCY(Date: Date; FromCurrencyCode: Code[10]; ToCurrencyCode: Code[10]; Amount: Decimal): Decimal
    var
        IsHandled: Boolean;
    begin
        OnBeforeExchangeAmtFCYToFCY(Rec, Date, FromCurrencyCode, ToCurrencyCode, Amount, CurrencyExchRate3, IsHandled);
        if IsHandled then
            exit(Amount);
        if FromCurrencyCode = ToCurrencyCode then
            exit(Amount);
        if ToCurrencyCode = '' then begin
            FindCurrency2(Date, FromCurrencyCode, 1);
            if CurrencyExchRate3[1]."Relational Currency Code" = '' then
                exit(
                  (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
                  CurrencyExchRate3[1]."Relational Exch. Rate Amount");

            FindCurrency2(Date, CurrencyExchRate3[1]."Relational Currency Code", 3);
            Amount :=
              ((Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
               CurrencyExchRate3[1]."Relational Exch. Rate Amount");
            exit(
              (Amount / CurrencyExchRate3[3]."Exchange Rate Amount") *
              CurrencyExchRate3[3]."Relational Exch. Rate Amount");
        end;
        if FromCurrencyCode = '' then begin
            FindCurrency2(Date, ToCurrencyCode, 2);
            if CurrencyExchRate3[2]."Relational Currency Code" = '' then
                exit(
                  (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
                  CurrencyExchRate3[2]."Exchange Rate Amount");

            FindCurrency2(Date, CurrencyExchRate3[2]."Relational Currency Code", 3);
            Amount :=
              ((Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
               CurrencyExchRate3[2]."Exchange Rate Amount");
            exit(
              (Amount / CurrencyExchRate3[3]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[3]."Exchange Rate Amount");
        end;
        FindCurrency2(Date, FromCurrencyCode, 1);
        FindCurrency2(Date, ToCurrencyCode, 2);
        if CurrencyExchRate3[1]."Currency Code" = CurrencyExchRate3[2]."Relational Currency Code" then
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        if CurrencyExchRate3[1]."Relational Currency Code" = CurrencyExchRate3[2]."Currency Code" then
            exit(
              (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
              CurrencyExchRate3[1]."Relational Exch. Rate Amount");

        if CurrencyExchRate3[1]."Relational Currency Code" = CurrencyExchRate3[2]."Relational Currency Code" then begin
            Amount :=
              ((Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
               CurrencyExchRate3[1]."Relational Exch. Rate Amount");
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        end;
        if (CurrencyExchRate3[1]."Relational Currency Code" = '') and
           (CurrencyExchRate3[2]."Relational Currency Code" <> '')
        then begin
            FindCurrency2(Date, CurrencyExchRate3[2]."Relational Currency Code", 3);
            Amount :=
              (Amount * CurrencyExchRate3[1]."Relational Exch. Rate Amount") /
              CurrencyExchRate3[1]."Exchange Rate Amount";
            Amount :=
              (Amount / CurrencyExchRate3[3]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[3]."Exchange Rate Amount";
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        end;
        if (CurrencyExchRate3[1]."Relational Currency Code" <> '') and
           (CurrencyExchRate3[2]."Relational Currency Code" = '')
        then begin
            FindCurrency2(Date, CurrencyExchRate3[1]."Relational Currency Code", 3);
            Amount :=
              (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
              CurrencyExchRate3[1]."Relational Exch. Rate Amount";
            Amount :=
              (Amount / CurrencyExchRate3[3]."Exchange Rate Amount") *
              CurrencyExchRate3[3]."Relational Exch. Rate Amount";
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        end;
    end;

    local procedure FindCurrency2(Date: Date; CurrencyCode: Code[10]; Number: Integer)
    begin
        if Date = 0D then
            Date := WorkDate();
        CurrencyExchRate3[Number].SetRange("Currency Code", CurrencyCode);
        CurrencyExchRate3[Number].SetRange("Starting Date", 0D, Date);
        OnFindCurrency2OnAfterCurrencyExchRate3SetFilters(CurrencyExchRate3[Number], CurrencyCode, Date, Rec);
        CurrencyExchRate3[Number].FindLast();
        CurrencyExchRate3[Number].TestField("Exchange Rate Amount");
        CurrencyExchRate3[Number].TestField("Relational Exch. Rate Amount");
    end;

    procedure ApplnExchangeAmtFCYToFCY(Date: Date; FromCurrencyCode: Code[10]; ToCurrencyCode: Code[10]; Amount: Decimal; var ExchRateFound: Boolean): Decimal
    var
        IsHandled: Boolean;
    begin
        OnBeforeApplnExchangeAmtFCYToFCY(Rec, Date, FromCurrencyCode, ToCurrencyCode, Amount, ExchRateFound, CurrencyExchRate3, IsHandled);
        if IsHandled then
            exit(Amount);
        if FromCurrencyCode = ToCurrencyCode then
            exit(Amount);
        if ToCurrencyCode = '' then begin
            ExchRateFound := FindApplnCurrency(Date, FromCurrencyCode, 1);
            if not ExchRateFound then
                exit(0);

            if CurrencyExchRate3[1]."Relational Currency Code" = '' then
                exit(
                  (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
                  CurrencyExchRate3[1]."Relational Exch. Rate Amount");

            ExchRateFound := FindApplnCurrency(Date, CurrencyExchRate3[1]."Relational Currency Code", 3);
            if not ExchRateFound then
                exit(0);

            Amount :=
              (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
              CurrencyExchRate3[1]."Relational Exch. Rate Amount";
            exit(
              (Amount / CurrencyExchRate3[3]."Exchange Rate Amount") *
              CurrencyExchRate3[3]."Relational Exch. Rate Amount");
        end;
        if FromCurrencyCode = '' then begin
            ExchRateFound := FindApplnCurrency(Date, ToCurrencyCode, 2);
            if not ExchRateFound then
                exit(0);

            if CurrencyExchRate3[2]."Relational Currency Code" = '' then
                exit(
                  (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
                  CurrencyExchRate3[2]."Exchange Rate Amount");

            ExchRateFound := FindApplnCurrency(Date, CurrencyExchRate3[2]."Relational Currency Code", 3);
            if not ExchRateFound then
                exit(0);

            Amount :=
              ((Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
               CurrencyExchRate3[2]."Exchange Rate Amount");
            exit(
              (Amount / CurrencyExchRate3[3]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[3]."Exchange Rate Amount");
        end;
        ExchRateFound := FindApplnCurrency(Date, FromCurrencyCode, 1);
        if not ExchRateFound then
            exit(0);

        ExchRateFound := FindApplnCurrency(Date, ToCurrencyCode, 2);
        if not ExchRateFound then
            exit(0);

        if CurrencyExchRate3[1]."Currency Code" = CurrencyExchRate3[2]."Relational Currency Code" then
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        if CurrencyExchRate3[1]."Relational Currency Code" = CurrencyExchRate3[2]."Currency Code" then
            exit(
              (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
              CurrencyExchRate3[1]."Relational Exch. Rate Amount");

        if CurrencyExchRate3[1]."Relational Currency Code" = CurrencyExchRate3[2]."Relational Currency Code" then begin
            Amount :=
              ((Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
               CurrencyExchRate3[1]."Relational Exch. Rate Amount");
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        end;
        if (CurrencyExchRate3[1]."Relational Currency Code" = '') and
           (CurrencyExchRate3[2]."Relational Currency Code" <> '')
        then begin
            ExchRateFound := FindApplnCurrency(Date, CurrencyExchRate3[2]."Relational Currency Code", 3);
            if not ExchRateFound then
                exit(0);

            Amount :=
              (Amount * CurrencyExchRate3[1]."Relational Exch. Rate Amount") /
              CurrencyExchRate3[1]."Exchange Rate Amount";
            Amount :=
              (Amount / CurrencyExchRate3[3]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[3]."Exchange Rate Amount";
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        end;
        if (CurrencyExchRate3[1]."Relational Currency Code" <> '') and
           (CurrencyExchRate3[2]."Relational Currency Code" = '')
        then begin
            ExchRateFound := FindApplnCurrency(Date, CurrencyExchRate3[1]."Relational Currency Code", 3);
            if not ExchRateFound then
                exit(0);

            Amount :=
              (Amount / CurrencyExchRate3[1]."Exchange Rate Amount") *
              CurrencyExchRate3[1]."Relational Exch. Rate Amount";
            Amount :=
              (Amount / CurrencyExchRate3[3]."Exchange Rate Amount") *
              CurrencyExchRate3[3]."Relational Exch. Rate Amount";
            exit(
              (Amount / CurrencyExchRate3[2]."Relational Exch. Rate Amount") *
              CurrencyExchRate3[2]."Exchange Rate Amount");
        end;
    end;

    local procedure FindApplnCurrency(Date: Date; CurrencyCode: Code[10]; Number: Integer): Boolean
    begin
        CurrencyExchRate3[Number].SetRange("Currency Code", CurrencyCode);
        CurrencyExchRate3[Number].SetRange("Starting Date", 0D, Date);
        if not CurrencyExchRate3[Number].FindLast() then
            exit(false);

        CurrencyExchRate3[Number].TestField("Exchange Rate Amount");
        CurrencyExchRate3[Number].TestField("Relational Exch. Rate Amount");
        exit(true);
    end;

    procedure GetCurrentCurrencyFactor(CurrencyCode: Code[10]): Decimal
    begin
        SetRange("Currency Code", CurrencyCode);
        if FindLast() then
            if "Relational Exch. Rate Amount" <> 0 then
                exit("Exchange Rate Amount" / "Relational Exch. Rate Amount");
    end;

    procedure GetLastestExchangeRate(CurrencyCode: Code[10]; var Date: Date; var Amt: Decimal)
    var
        IsHandled: Boolean;
    begin
        OnBeforeGetLatestExchangeRate(Rec, CurrencyCode, Date, Amt, IsHandled);
        if IsHandled then
            exit;
        Date := 0D;
        Amt := 0;
        SetRange("Currency Code", CurrencyCode);
        if FindLast() then begin
            Date := "Starting Date";
            if "Exchange Rate Amount" <> 0 then
                Amt := "Relational Exch. Rate Amount" / "Exchange Rate Amount";
        end;
    end;

    procedure CurrencyExchangeRateExist(CurrencyCode: Code[10]; Date: Date): Boolean
    var
        CurrencyExchangeRate: Record "Currency Exchange Rate";
    begin
        CurrencyExchangeRate.SetRange("Currency Code", CurrencyCode);
        CurrencyExchangeRate.SetRange("Starting Date", 0D, Date);
        exit(not CurrencyExchangeRate.IsEmpty);
    end;

    procedure SetCurrentCurrencyFactor(CurrencyCode: Code[10]; CurrencyFactor: Decimal)
    var
        RateForTodayExists, IsHandled: Boolean;
    begin
        OnBeforeSetCurrentCurrencyFactor(Rec, CurrencyCode, CurrencyFactor, IsHandled);
        if IsHandled then
            exit;
        "Currency Code" := CurrencyCode;
        TestField("Currency Code");
        RateForTodayExists := Get(CurrencyCode, Today);
        "Exchange Rate Amount" := 1;
        "Relational Exch. Rate Amount" := 1 / CurrencyFactor;
        "Adjustment Exch. Rate Amount" := "Exchange Rate Amount";
        "Relational Adjmt Exch Rate Amt" := "Relational Exch. Rate Amount";
        if RateForTodayExists then begin
            "Relational Currency Code" := '';
            Modify();
        end else begin
            "Starting Date" := Today;
            Insert();
        end;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterFindCurrency(var CurrencyExchangeRate: Record "Currency Exchange Rate"; var CurrencyExchangeRateArray: array[2] of Record "Currency Exchange Rate"; Date: Date; CurrencyCode: Code[10]; CacheNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnExchangeAmtFCYToLCYOnAfterSetRelationalExchRateAmount(var CurrencyExchangeRate: Record "Currency Exchange Rate")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindCurrencyOnAfterCalcShouldUseCache(var CurrencyExchangeRate: Record "Currency Exchange Rate"; CacheNo: Integer; var ShouldUseCache: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindCurrencyOnAfterCurrencyExchRate2SetFilters(var CurrencyExchRate2: Record "Currency Exchange Rate"; CurrencyCode: Code[10]; Date: Date; var CurrencyExchangeRate: Record "Currency Exchange Rate")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnExchangeRateOnAfterSetRelationalExchRateAmount(var CurrencyExchangeRate: Record "Currency Exchange Rate")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindCurrency2OnAfterCurrencyExchRate3SetFilters(var CurrencyExchRate3: Record "Currency Exchange Rate"; CurrencyCode: Code[10]; Date: Date; var CurrencyExchangeRate: Record "Currency Exchange Rate")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeExchangeAmtLCYToFCY(var CurrencyExchangeRate: Record "Currency Exchange Rate"; Date: Date; CurrencyCode: Code[10]; var Amount: Decimal; Factor: Decimal; var RelExchangeRateAmt: Decimal; var ExchangeRateAmt: Decimal; var RelCurrencyCode: Code[10]; FixExchangeRateAmt: Enum "Fix Exch. Rate Amount Type"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeExchangeAmtFCYToLCY(var CurrencyExchangeRate: Record "Currency Exchange Rate"; Date: Date; CurrencyCode: Code[10]; var Amount: Decimal; Factor: Decimal; UseAdjmtAmounts: Boolean; var RelExchangeRateAmt: Decimal; var ExchangeRateAmt: Decimal; var RelCurrencyCode: Code[10]; FixExchangeRateAmt: Enum "Fix Exch. Rate Amount Type"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeExchangeRate(var CurrencyExchangeRate: Record "Currency Exchange Rate"; Date: Date; CurrencyCode: Code[10]; var CurrencyFactor: Decimal; UseAdjmtAmounts: Boolean; var RelExchangeRateAmt: Decimal; var ExchangeRateAmt: Decimal; var RelCurrencyCode: Code[10]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeExchangeAmtFCYToFCY(var CurrencyExchangeRate: Record "Currency Exchange Rate"; Date: Date; FromCurrencyCode: Code[10]; ToCurrencyCode: Code[10]; var Amount: Decimal; CurrencyExchRate3: array[3] of Record "Currency Exchange Rate"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeApplnExchangeAmtFCYToFCY(var CurrencyExchangeRate: Record "Currency Exchange Rate"; Date: Date; FromCurrencyCode: Code[10]; ToCurrencyCode: Code[10]; var Amount: Decimal; var ExchRateFound: Boolean; CurrencyExchRate3: array[3] of Record "Currency Exchange Rate"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetLatestExchangeRate(var CurrencyExchangeRate: Record "Currency Exchange Rate"; CurrencyCode: Code[10]; var Date: Date; var Amount: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetCurrentCurrencyFactor(var CurrencyExchangeRate: Record "Currency Exchange Rate"; CurrencyCode: Code[10]; CurrencyFactor: Decimal; var IsHandled: Boolean)
    begin
    end;
}