Page 9249 Analysis by Dimensions Matrix

App
Base Application
Namespace
Microsoft.Finance.Analysis
Versions
17-28
Source table
367

Procedures, 4Events, 17Obsolete, 6

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/Analysis/AnalysisbyDimensionsMatrix.Page.al1741 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.Analysis;

using Microsoft.CashFlow.Account;
using Microsoft.CashFlow.Forecast;
using Microsoft.Finance.Consolidation;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Period;
using System.Utilities;

/// <summary>
/// Matrix page displaying analysis data in a grid format with configurable dimensions.
/// Provides interactive drill-down capabilities and dynamic column generation for multi-dimensional analysis.
/// </summary>
/// <remarks>
/// Used by Analysis by Dimensions to display financial data in matrix format.
/// Supports up to 32 matrix columns with dynamic captions and drill-down to underlying entries.
/// </remarks>
page 9249 "Analysis by Dimensions Matrix"
{
    Caption = 'Analysis by Dimensions Matrix';
    DataCaptionExpression = AnalysisViewCode;
    DeleteAllowed = false;
    Editable = false;
    InsertAllowed = false;
    LinksAllowed = false;
    ModifyAllowed = false;
    PageType = List;
    SourceTable = "Dimension Code Buffer";
    SourceTableTemporary = true;

    layout
    {
        area(content)
        {
            repeater(Control1)
            {
                IndentationColumn = Rec.Indentation;
                IndentationControls = Name;
                ShowCaption = false;
                field("Code"; Rec.Code)
                {
                    ApplicationArea = Dimensions;
                    Style = Strong;
                    StyleExpr = Emphasize;

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        LookupDimCode(AnalysisByDimParameters."Line Dim Option", LineDimCode, Rec.Code);
                    end;
                }
                field(Name; Rec.Name)
                {
                    ApplicationArea = Dimensions;
                    Style = Strong;
                    StyleExpr = Emphasize;
                }
                field(TotalAmount; Rec.Amount)
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    Caption = 'Total Amount';
                    Style = Strong;
                    StyleExpr = Emphasize;
                    ToolTip = 'Specifies the total amount for the amount type that you select in the Show field in the Options FastTab.';

                    trigger OnDrillDown()
                    begin
                        DrillDown(false);
                    end;
                }
                field(Field1; MATRIX_CellData[1])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[1];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field1Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(1);
                        DrillDown(true);
                    end;
                }
                field(Field2; MATRIX_CellData[2])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[2];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field2Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(2);
                        DrillDown(true);
                    end;
                }
                field(Field3; MATRIX_CellData[3])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[3];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field3Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(3);
                        DrillDown(true);
                    end;
                }
                field(Field4; MATRIX_CellData[4])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[4];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field4Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(4);
                        DrillDown(true);
                    end;
                }
                field(Field5; MATRIX_CellData[5])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[5];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field5Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(5);
                        DrillDown(true);
                    end;
                }
                field(Field6; MATRIX_CellData[6])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[6];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field6Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(6);
                        DrillDown(true);
                    end;
                }
                field(Field7; MATRIX_CellData[7])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[7];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field7Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(7);
                        DrillDown(true);
                    end;
                }
                field(Field8; MATRIX_CellData[8])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[8];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field8Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(8);
                        DrillDown(true);
                    end;
                }
                field(Field9; MATRIX_CellData[9])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[9];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field9Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(9);
                        DrillDown(true);
                    end;
                }
                field(Field10; MATRIX_CellData[10])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[10];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field10Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(10);
                        DrillDown(true);
                    end;
                }
                field(Field11; MATRIX_CellData[11])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[11];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field11Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(11);
                        DrillDown(true);
                    end;
                }
                field(Field12; MATRIX_CellData[12])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[12];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field12Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(12);
                        DrillDown(true);
                    end;
                }
                field(Field13; MATRIX_CellData[13])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[13];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field13Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(13);
                        DrillDown(true);
                    end;
                }
                field(Field14; MATRIX_CellData[14])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[14];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field14Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(14);
                        DrillDown(true);
                    end;
                }
                field(Field15; MATRIX_CellData[15])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[15];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field15Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(15);
                        DrillDown(true);
                    end;
                }
                field(Field16; MATRIX_CellData[16])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[16];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field16Visible;

                    trigger OnAssistEdit()
                    begin
                        MATRIX_UpdateMatrixRecord(16);
                        DrillDown(true);
                    end;
                }
                field(Field17; MATRIX_CellData[17])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[17];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field17Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(17);
                        DrillDown(true);
                    end;
                }
                field(Field18; MATRIX_CellData[18])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[18];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field18Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(18);
                        DrillDown(true);
                    end;
                }
                field(Field19; MATRIX_CellData[19])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[19];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field19Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(19);
                        DrillDown(true);
                    end;
                }
                field(Field20; MATRIX_CellData[20])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[20];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field20Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(20);
                        DrillDown(true);
                    end;
                }
                field(Field21; MATRIX_CellData[21])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[21];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field21Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(21);
                        DrillDown(true);
                    end;
                }
                field(Field22; MATRIX_CellData[22])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[22];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field22Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(22);
                        DrillDown(true);
                    end;
                }
                field(Field23; MATRIX_CellData[23])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[23];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field23Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(23);
                        DrillDown(true);
                    end;
                }
                field(Field24; MATRIX_CellData[24])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[24];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field24Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(24);
                        DrillDown(true);
                    end;
                }
                field(Field25; MATRIX_CellData[25])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[25];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field25Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(25);
                        DrillDown(true);
                    end;
                }
                field(Field26; MATRIX_CellData[26])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[26];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field26Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(26);
                        DrillDown(true);
                    end;
                }
                field(Field27; MATRIX_CellData[27])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[27];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field27Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(27);
                        DrillDown(true);
                    end;
                }
                field(Field28; MATRIX_CellData[28])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[28];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field28Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(28);
                        DrillDown(true);
                    end;
                }
                field(Field29; MATRIX_CellData[29])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[29];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field29Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(29);
                        DrillDown(true);
                    end;
                }
                field(Field30; MATRIX_CellData[30])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[30];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field30Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(30);
                        DrillDown(true);
                    end;
                }
                field(Field31; MATRIX_CellData[31])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[31];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field31Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(31);
                        DrillDown(true);
                    end;
                }
                field(Field32; MATRIX_CellData[32])
                {
                    ApplicationArea = Dimensions;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + ColumnCaptions[32];
                    Style = Strong;
                    StyleExpr = Emphasize;
                    Visible = Field32Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_UpdateMatrixRecord(32);
                        DrillDown(true);
                    end;
                }
            }
        }
    }

    actions
    {
        area(navigation)
        {
            group("&Actions")
            {
                Caption = '&Actions';
                Image = "Action";
                action(ExportToExcel)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Export to Excel';
                    Image = ExportToExcel;
                    ToolTip = 'Export the information in the analysis report to Excel.';

                    trigger OnAction()
                    var
                        AnalysisViewEntry: Record "Analysis View Entry";
                        AnalysisViewToExcel: Codeunit "Export Analysis View";
                    begin
                        SetCommonFilters(AnalysisViewEntry);
                        if (not AnalysisViewEntry.Find('-')) and (AnalysisByDimParameters."Show Actual/Budgets" = AnalysisByDimParameters."Show Actual/Budgets"::"Actual Amounts") then
                            Error(NoEntriesToExportToExcelErr);
                        AnalysisViewToExcel.ExportData(AnalysisViewEntry, AnalysisByDimParameters);
                    end;
                }
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process';

                actionref(ExportToExcel_Promoted; ExportToExcel)
                {
                }
            }
        }
    }

    trigger OnAfterGetRecord()
    var
        MATRIX_CurrentColumnOrdinal: Integer;
        MATRIX_Steps: Integer;
    begin
        Rec.Amount := MatrixMgt.RoundAmount(CalcAmount(false), AnalysisByDimParameters."Rounding Factor");

        MATRIX_CurrentColumnOrdinal := 0;
        if MATRIX_PrimKeyFirstCol <> '' then
            TempDimensionCodeBuffer.SetPosition(MATRIX_PrimKeyFirstCol);
        if MATRIX_OnFindRecord('=><') then begin
            MATRIX_CurrentColumnOrdinal := 1;

            repeat
                MATRIX_ColumnOrdinal := MATRIX_CurrentColumnOrdinal;
                MATRIX_OnAfterGetRecord();
                MATRIX_Steps := MATRIX_OnNextRecord(1);
                MATRIX_CurrentColumnOrdinal := MATRIX_CurrentColumnOrdinal + MATRIX_Steps;
            until (MATRIX_CurrentColumnOrdinal - MATRIX_Steps = MATRIX_NoOfMatrixColumns) or (MATRIX_Steps = 0);
            if MATRIX_CurrentColumnOrdinal <> 1 then
                MATRIX_OnNextRecord(1 - MATRIX_CurrentColumnOrdinal);
        end;

        SetVisible();
        FormatLine();
    end;

    trigger OnFindRecord(Which: Text): Boolean
    begin
        exit(FindRec(AnalysisByDimParameters."Line Dim Option", Rec, Which));
    end;

    trigger OnInit()
    begin
        Field32Visible := true;
        Field31Visible := true;
        Field30Visible := true;
        Field29Visible := true;
        Field28Visible := true;
        Field27Visible := true;
        Field26Visible := true;
        Field25Visible := true;
        Field24Visible := true;
        Field23Visible := true;
        Field22Visible := true;
        Field21Visible := true;
        Field20Visible := true;
        Field19Visible := true;
        Field18Visible := true;
        Field17Visible := true;
        Field16Visible := true;
        Field15Visible := true;
        Field14Visible := true;
        Field13Visible := true;
        Field12Visible := true;
        Field11Visible := true;
        Field10Visible := true;
        Field9Visible := true;
        Field8Visible := true;
        Field7Visible := true;
        Field6Visible := true;
        Field5Visible := true;
        Field4Visible := true;
        Field3Visible := true;
        Field2Visible := true;
        Field1Visible := true;
    end;

    trigger OnNextRecord(Steps: Integer): Integer
    begin
        exit(NextRecord(AnalysisByDimParameters."Line Dim Option", Rec, Steps));
    end;

    trigger OnOpenPage()
    var
        CashFlowForecast: Record "Cash Flow Forecast";
        GLAcc: Record "G/L Account";
    begin
        MATRIX_NoOfMatrixColumns := ArrayLen(MATRIX_CellData);

        ValidateAnalysisViewCode();

        InitRecord(Rec, AnalysisByDimParameters."Line Dim Option");
        InitRecord(TempDimensionCodeBuffer, AnalysisByDimParameters."Column Dim Option");

        if (LineDimCode = '') and (ColumnDimCode = '') then begin
            case AnalysisByDimParameters."Analysis Account Source" of
                AnalysisByDimParameters."Analysis Account Source"::"G/L Account":
                    LineDimCode := GLAcc.TableCaption;
                AnalysisByDimParameters."Analysis Account Source"::"Cash Flow Account":
                    LineDimCode := CashFlowForecast.TableCaption();
                else
                    OnOpenPageOnAccountSourceElseCase(AnalysisView, LineDimCode);
            end;
            ColumnDimCode := Text000;
        end;

        CalculateClosingDateFilter();

        SetVisible();
        if AnalysisByDimParameters."Line Dim Option" = AnalysisByDimParameters."Line Dim Option"::Period then
            Rec.Code := '';
    end;

    var
#pragma warning disable AA0074
        Text000: Label 'Period';
        Text002: Label 'You have not yet defined an analysis view.';
#pragma warning restore AA0074
        TempDimensionCodeBuffer: Record "Dimension Code Buffer" temporary;
        GLSetup: Record "General Ledger Setup";
        AnalysisView: Record "Analysis View";
        AnalysisViewEntry: Record "Analysis View Entry";
        AnalysisViewBudgetEntry: Record "Analysis View Budget Entry";
        TempDimensionCodeAmountBuffer: Record "Dimension Code Amount Buffer" temporary;
        Currency: Record Currency;
        CurrExchRate: Record "Currency Exchange Rate";
        PeriodOption: Record Date;
        MatrixMgt: Codeunit "Matrix Management";
        AnalysisViewCode: Code[10];
        LineDimCode: Text[30];
        ColumnDimCode: Text[30];
        ExcludeClosingDateFilter: Text;
        MATRIX_CellData: array[32] of Decimal;
        MATRIX_PrimKeyFirstCol: Text[1024];
        MatrixAmount: Decimal;
        CurrExchDate: Date;
        MATRIX_ColumnOrdinal: Integer;
        MATRIX_NoOfMatrixColumns: Integer;
        ColumnCaptions: array[32] of Text[250];
        RoundingFactorFormatString: Text;
        Field1Visible: Boolean;
        Field2Visible: Boolean;
        Field3Visible: Boolean;
        Field4Visible: Boolean;
        Field5Visible: Boolean;
        Field6Visible: Boolean;
        Field7Visible: Boolean;
        Field8Visible: Boolean;
        Field9Visible: Boolean;
        Field10Visible: Boolean;
        Field11Visible: Boolean;
        Field12Visible: Boolean;
        Field13Visible: Boolean;
        Field14Visible: Boolean;
        Field15Visible: Boolean;
        Field16Visible: Boolean;
        Field17Visible: Boolean;
        Field18Visible: Boolean;
        Field19Visible: Boolean;
        Field20Visible: Boolean;
        Field21Visible: Boolean;
        Field22Visible: Boolean;
        Field23Visible: Boolean;
        Field24Visible: Boolean;
        Field25Visible: Boolean;
        Field26Visible: Boolean;
        Field27Visible: Boolean;
        Field28Visible: Boolean;
        Field29Visible: Boolean;
        Field30Visible: Boolean;
        Field31Visible: Boolean;
        Field32Visible: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text003: Label 'Unsupported Account Source %1.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        NoEntriesToExportToExcelErr: Label 'There are no entries to export to Excel.';

    protected var
        AnalysisByDimParameters: Record "Analysis by Dim. Parameters";
        Emphasize: Boolean;

    local procedure InitRecord(var DimCodeBuf: Record "Dimension Code Buffer"; DimOption: Enum "Analysis Dimension Option")
    var
        GLAccount: Record "G/L Account";
        CashFlowAccount: Record "Cash Flow Account";
        BusinessUnit: Record "Business Unit";
        CashFlowForecast: Record "Cash Flow Forecast";
    begin
        case DimOption of
            DimOption::"G/L Account":
                begin
                    if AnalysisByDimParameters."Account Filter" <> '' then
                        GLAccount.SetFilter("No.", AnalysisByDimParameters."Account Filter");
                    if GLAccount.FindSet() then
                        repeat
                            CopyGLAccToBuf(GLAccount, DimCodeBuf);
                        until GLAccount.Next() = 0;
                end;
            DimOption::"Cash Flow Account":
                begin
                    if AnalysisByDimParameters."Account Filter" <> '' then
                        CashFlowAccount.SetFilter("No.", AnalysisByDimParameters."Account Filter");
                    if CashFlowAccount.FindSet() then
                        repeat
                            CopyCFAccToBuf(CashFlowAccount, DimCodeBuf);
                        until CashFlowAccount.Next() = 0;
                end;
            DimOption::Period:
                begin
                    PeriodOption.SetRange("Period Type", AnalysisByDimParameters."Period Type");
                    if AnalysisByDimParameters."Date Filter" <> '' then begin
                        PeriodOption.FilterGroup(2);
                        PeriodOption.SetFilter("Period Start", AnalysisByDimParameters."Date Filter");
                        PeriodOption.FilterGroup(0);
                    end;
                end;
            DimOption::"Business Unit":
                begin
                    if AnalysisByDimParameters."Bus. Unit Filter" <> '' then
                        BusinessUnit.SetFilter(Code, AnalysisByDimParameters."Bus. Unit Filter");
                    if BusinessUnit.FindSet() then
                        repeat
                            CopyBusUnitToBuf(BusinessUnit, DimCodeBuf);
                        until BusinessUnit.Next() = 0;
                end;
            DimOption::"Cash Flow Forecast":
                begin
                    if AnalysisByDimParameters."Cash Flow Forecast Filter" <> '' then
                        CashFlowForecast.SetFilter("No.", AnalysisByDimParameters."Cash Flow Forecast Filter");
                    if CashFlowForecast.FindSet() then
                        repeat
                            CopyCashFlowToBuf(CashFlowForecast, DimCodeBuf);
                        until CashFlowForecast.Next() = 0;
                end;
            DimOption::"Dimension 1":
                InitDimValue(
                  DimCodeBuf, AnalysisView."Dimension 1 Code", AnalysisByDimParameters."Dimension 1 Filter");
            DimOption::"Dimension 2":
                InitDimValue(
                  DimCodeBuf, AnalysisView."Dimension 2 Code", AnalysisByDimParameters."Dimension 2 Filter");
            DimOption::"Dimension 3":
                InitDimValue(
                  DimCodeBuf, AnalysisView."Dimension 3 Code", AnalysisByDimParameters."Dimension 3 Filter");
            DimOption::"Dimension 4":
                InitDimValue(
                  DimCodeBuf, AnalysisView."Dimension 4 Code", AnalysisByDimParameters."Dimension 4 Filter");
            else
                RunOnInitRecordOnCaseElse(DimOption, DimCodeBuf, AnalysisView, AnalysisByDimParameters);
        end;
        if Rec.FindFirst() then;
    end;

    local procedure RunOnInitRecordOnCaseElse(DimOption: Enum "Analysis Dimension Option"; var DimCodeBuf: Record "Dimension Code Buffer"; var AnalysisView: Record "Analysis View"; var AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
    begin
        OnInitRecordOnCaseElse(DimOption, DimCodeBuf, AnalysisView, AnalysisByDimParameters);
    end;

    local procedure FindRec(DimOption: Enum "Analysis Dimension Option"; var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[250]) Result: Boolean
    begin
        case DimOption of
            DimOption::"G/L Account",
            DimOption::"Cash Flow Account",
            DimOption::"Business Unit",
            DimOption::"Cash Flow Forecast",
            DimOption::"Dimension 1",
            DimOption::"Dimension 2",
            DimOption::"Dimension 3",
            DimOption::"Dimension 4":
                exit(DimCodeBuf.Find(Which));
            DimOption::Period:
                // Make specifial length of Which parameter in order to find PeriodPageMgt.FindDate procedure
                exit(FindPeriod(DimCodeBuf, CopyStr(Which, 1, 3)));
            else
                OnFindRecOnCaseElse(DimOption, Which, DimCodeBuf, Result);
        end;
    end;

    local procedure NextRecord(DimOption: Enum "Analysis Dimension Option"; var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer) Result: Integer
    begin
        case DimOption of
            DimOption::"G/L Account",
            DimOption::"Cash Flow Account",
            DimOption::"Business Unit",
            DimOption::"Cash Flow Forecast",
            DimOption::"Dimension 1",
            DimOption::"Dimension 2",
            DimOption::"Dimension 3",
            DimOption::"Dimension 4":
                exit(DimCodeBuf.Next(Steps));
            DimOption::Period:
                exit(NextPeriod(DimCodeBuf, Steps));
            else
                OnNextRecOnCaseElse(DimOption, Steps, DimCodeBuf, Result);
        end;
    end;

    local procedure CopyGLAccToBuf(var TheGLAcc: Record "G/L Account"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheGLAcc."No.";
        TheDimCodeBuf.Name := TheGLAcc.Name;
        TheDimCodeBuf.Totaling := TheGLAcc.Totaling;
        TheDimCodeBuf.Indentation := TheGLAcc.Indentation;
        TheDimCodeBuf."Show in Bold" := TheGLAcc."Account Type" <> TheGLAcc."Account Type"::Posting;
        TheDimCodeBuf.Insert();
    end;

    local procedure CopyCFAccToBuf(var TheCFAcc: Record "Cash Flow Account"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheCFAcc."No.";
        TheDimCodeBuf.Name := TheCFAcc.Name;
        TheDimCodeBuf.Totaling := TheCFAcc.Totaling;
        TheDimCodeBuf.Indentation := TheCFAcc.Indentation;
        TheDimCodeBuf."Show in Bold" := TheCFAcc."Account Type" <> TheCFAcc."Account Type"::Entry;
        TheDimCodeBuf.Insert();
    end;

    local procedure CopyPeriodToBuf(var ThePeriod: Record Date; var TheDimCodeBuf: Record "Dimension Code Buffer")
    var
        Period2: Record Date;
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := Format(ThePeriod."Period Start");
        TheDimCodeBuf."Period Start" := ThePeriod."Period Start";
        if AnalysisByDimParameters."Closing Entries" = AnalysisByDimParameters."Closing Entries"::Include then
            TheDimCodeBuf."Period End" := ClosingDate(ThePeriod."Period End")
        else
            TheDimCodeBuf."Period End" := ThePeriod."Period End";
        if AnalysisByDimParameters."Date Filter" <> '' then begin
            Period2.SetFilter("Period End", AnalysisByDimParameters."Date Filter");
            if Period2.GetRangeMax("Period End") < TheDimCodeBuf."Period End" then
                TheDimCodeBuf."Period End" := Period2.GetRangeMax("Period End");
        end;
        TheDimCodeBuf.Name := ThePeriod."Period Name";
        if TheDimCodeBuf.Insert() then;
    end;

    local procedure CopyBusUnitToBuf(var TheBusUnit: Record "Business Unit"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheBusUnit.Code;
        TheDimCodeBuf.Name := TheBusUnit.Name;
        TheDimCodeBuf.Insert();
    end;

    local procedure CopyCashFlowToBuf(var TheCashFlowForecast: Record "Cash Flow Forecast"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheCashFlowForecast."No.";
        TheDimCodeBuf.Name := TheCashFlowForecast.Description;
        TheDimCodeBuf.Insert();
    end;

    local procedure CopyDimValueToBuf(var TheDimVal: Record "Dimension Value"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheDimVal.Code;
        TheDimCodeBuf.Name := TheDimVal.Name;
        TheDimCodeBuf.Totaling := TheDimVal.Totaling;
        TheDimCodeBuf.Indentation := TheDimVal.Indentation;
        TheDimCodeBuf."Show in Bold" :=
          TheDimVal."Dimension Value Type" <> TheDimVal."Dimension Value Type"::Standard;
        TheDimCodeBuf.Insert();
    end;

    local procedure CalculateClosingDateFilter()
    var
        AccountingPeriod: Record "Accounting Period";
        FirstRec: Boolean;
    begin
        if AnalysisByDimParameters."Closing Entries" = AnalysisByDimParameters."Closing Entries"::Include then
            ExcludeClosingDateFilter := ''
        else begin
            AccountingPeriod.SetCurrentKey("New Fiscal Year");
            AccountingPeriod.SetRange("New Fiscal Year", true);
            FirstRec := true;
            if AccountingPeriod.Find('-') then
                repeat
                    if FirstRec then
                        ExcludeClosingDateFilter :=
                          StrSubstNo('<>%1', ClosingDate(AccountingPeriod."Starting Date" - 1))
                    else
                        ExcludeClosingDateFilter :=
                          ExcludeClosingDateFilter + StrSubstNo('&<>%1', ClosingDate(AccountingPeriod."Starting Date" - 1));
                    FirstRec := false;
                until AccountingPeriod.Next() = 0;
        end;
    end;

    local procedure LookupDimCode(DimOption: Enum "Analysis Dimension Option"; DimCode: Text[30]; "Code": Text[30])
    var
        GLAcc: Record "G/L Account";
        BusUnit: Record "Business Unit";
        CFAccount: Record "Cash Flow Account";
        CashFlowForecast: Record "Cash Flow Forecast";
        DimVal: Record "Dimension Value";
    begin
        case DimOption of
            DimOption::"G/L Account":
                begin
                    GLAcc.Get(Code);
                    PAGE.RunModal(PAGE::"G/L Account List", GLAcc);
                end;
            DimOption::Period:
                ;
            DimOption::"Business Unit":
                begin
                    BusUnit.Get(Code);
                    PAGE.RunModal(PAGE::"Business Unit List", BusUnit);
                end;
            DimOption::"Cash Flow Account":
                begin
                    CFAccount.Get(Code);
                    PAGE.RunModal(PAGE::"Cash Flow Account List", CFAccount);
                end;
            DimOption::"Cash Flow Forecast":
                begin
                    CashFlowForecast.Get(Code);
                    PAGE.RunModal(PAGE::"Cash Flow Forecast List", CashFlowForecast);
                end;
            DimOption::"Dimension 1", DimOption::"Dimension 2",
            DimOption::"Dimension 3", DimOption::"Dimension 4":
                begin
                    DimVal.SetRange("Dimension Code", DimCode);
                    DimVal.Get(DimCode, Code);

                    PAGE.RunModal(PAGE::"Dimension Value List", DimVal);
                end;
            else
                RunOnLookupDimCodeOnCaseElse(DimOption, Code);
        end;
    end;

    local procedure RunOnLookupDimCodeOnCaseElse(DimOption: Enum "Analysis Dimension Option"; var "Code": Text[30])
    begin
        OnLookupDimCodeOnCaseElse(DimOption, Code);
    end;

    local procedure SetCommonFilters(var TheAnalysisViewEntry: Record "Analysis View Entry")
    var
        DateFilter2: Text;
    begin
        if AnalysisByDimParameters."Date Filter" = '' then
            DateFilter2 := ExcludeClosingDateFilter
        else begin
            if AnalysisByDimParameters."Amount Type" = AnalysisByDimParameters."Amount Type"::"Net Change" then
                DateFilter2 := AnalysisByDimParameters."Date Filter"
            else begin
                TheAnalysisViewEntry.SetFilter("Posting Date", AnalysisByDimParameters."Date Filter");
                DateFilter2 := StrSubstNo('..%1', TheAnalysisViewEntry.GetRangeMax("Posting Date"));
            end;
            if ExcludeClosingDateFilter <> '' then
                DateFilter2 := StrSubstNo('%1 & %2', DateFilter2, ExcludeClosingDateFilter);
        end;
        TheAnalysisViewEntry.Reset();

        TheAnalysisViewEntry.SetRange("Analysis View Code", AnalysisView.Code);
        if AnalysisByDimParameters."Bus. Unit Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Business Unit Code", AnalysisByDimParameters."Bus. Unit Filter");
        if AnalysisByDimParameters."Cash Flow Forecast Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Cash Flow Forecast No.", AnalysisByDimParameters."Cash Flow Forecast Filter");

        if AnalysisByDimParameters."Account Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Account No.", AnalysisByDimParameters."Account Filter");

        TheAnalysisViewEntry.SetRange("Account Source", AnalysisByDimParameters."Analysis Account Source");

        TheAnalysisViewEntry.SetFilter("Posting Date", DateFilter2);
        if AnalysisByDimParameters."Dimension 1 Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Dimension 1 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 1 Filter", AnalysisView."Dimension 1 Code"));
        if AnalysisByDimParameters."Dimension 2 Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Dimension 2 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 2 Filter", AnalysisView."Dimension 2 Code"));
        if AnalysisByDimParameters."Dimension 3 Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Dimension 3 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 3 Filter", AnalysisView."Dimension 3 Code"));
        if AnalysisByDimParameters."Dimension 4 Filter" <> '' then
            TheAnalysisViewEntry.SetFilter("Dimension 4 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 4 Filter", AnalysisView."Dimension 4 Code"));

        OnAfterSetCommonFilters(TheAnalysisViewEntry, AnalysisByDimParameters);
    end;

    local procedure SetDimFilters(var TheAnalysisViewEntry: Record "Analysis View Entry"; LineOrColumn: Option Line,Column)
    var
        DimCodeBuf: Record "Dimension Code Buffer";
        DimOption: Enum "Analysis Dimension Option";
    begin
        if LineOrColumn = LineOrColumn::Line then begin
            DimCodeBuf := Rec;
            DimOption := AnalysisByDimParameters."Line Dim Option";
        end else begin
            DimCodeBuf := TempDimensionCodeBuffer;
            DimOption := AnalysisByDimParameters."Column Dim Option";
        end;
        case DimOption of
            DimOption::"G/L Account",
          DimOption::"Cash Flow Account":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewEntry.SetRange("Account No.", DimCodeBuf.Code)
                else
                    TheAnalysisViewEntry.SetFilter("Account No.", DimCodeBuf.Totaling);
            DimOption::Period:
                begin
                    if AnalysisByDimParameters."Amount Type" = AnalysisByDimParameters."Amount Type"::"Net Change" then
                        TheAnalysisViewEntry.SetRange(
                          "Posting Date", DimCodeBuf."Period Start", DimCodeBuf."Period End")
                    else
                        TheAnalysisViewEntry.SetRange("Posting Date", 0D, DimCodeBuf."Period End");
                    if (AnalysisByDimParameters."Closing Entries" = AnalysisByDimParameters."Closing Entries"::Exclude) and (ExcludeClosingDateFilter <> '') then
                        TheAnalysisViewEntry.SetFilter(
                          "Posting Date", TheAnalysisViewEntry.GetFilter("Posting Date") +
                          '&' + ExcludeClosingDateFilter);
                end;
            DimOption::"Business Unit":
                TheAnalysisViewEntry.SetRange("Business Unit Code", DimCodeBuf.Code);
            DimOption::"Cash Flow Forecast":
                TheAnalysisViewEntry.SetRange("Cash Flow Forecast No.", DimCodeBuf.Code);
            DimOption::"Dimension 1":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewEntry.SetRange("Dimension 1 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewEntry.SetFilter("Dimension 1 Value Code", DimCodeBuf.Totaling);
            DimOption::"Dimension 2":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewEntry.SetRange("Dimension 2 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewEntry.SetFilter("Dimension 2 Value Code", DimCodeBuf.Totaling);
            DimOption::"Dimension 3":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewEntry.SetRange("Dimension 3 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewEntry.SetFilter("Dimension 3 Value Code", DimCodeBuf.Totaling);
            DimOption::"Dimension 4":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewEntry.SetRange("Dimension 4 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewEntry.SetFilter("Dimension 4 Value Code", DimCodeBuf.Totaling);
        end;

        OnAfterSetDimFiltersProcedure(TheAnalysisViewEntry, AnalysisView, DimOption, DimCodeBuf);
    end;

    local procedure SetCommonBudgetFilters(var TheAnalysisViewBudgetEntry: Record "Analysis View Budget Entry")
    begin
        TheAnalysisViewBudgetEntry.Reset();
        TheAnalysisViewBudgetEntry.SetRange("Analysis View Code", AnalysisView.Code);
        if AnalysisByDimParameters."Bus. Unit Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Business Unit Code", AnalysisByDimParameters."Bus. Unit Filter");
        if AnalysisByDimParameters."Budget Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Budget Name", AnalysisByDimParameters."Budget Filter");
        if AnalysisByDimParameters."Account Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("G/L Account No.", AnalysisByDimParameters."Account Filter");
        if AnalysisByDimParameters."Date Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Posting Date", AnalysisByDimParameters."Date Filter");
        if AnalysisByDimParameters."Dimension 1 Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Dimension 1 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 1 Filter", AnalysisView."Dimension 1 Code"));
        if AnalysisByDimParameters."Dimension 2 Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Dimension 2 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 2 Filter", AnalysisView."Dimension 2 Code"));
        if AnalysisByDimParameters."Dimension 3 Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Dimension 3 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 3 Filter", AnalysisView."Dimension 3 Code"));
        if AnalysisByDimParameters."Dimension 4 Filter" <> '' then
            TheAnalysisViewBudgetEntry.SetFilter("Dimension 4 Value Code", GetDimValueTotaling(AnalysisByDimParameters."Dimension 4 Filter", AnalysisView."Dimension 4 Code"));

        OnAfterSetCommonBudgetFilters(TheAnalysisViewBudgetEntry, AnalysisByDimParameters);
    end;

    local procedure SetDimBudgetFilters(var TheAnalysisViewBudgetEntry: Record "Analysis View Budget Entry"; LineOrColumn: Option Line,Column)
    var
        DimCodeBuf: Record "Dimension Code Buffer";
        DimOption: Enum "Analysis Dimension Option";
    begin
        if LineOrColumn = LineOrColumn::Line then begin
            DimCodeBuf := Rec;
            DimOption := AnalysisByDimParameters."Line Dim Option";
        end else begin
            DimCodeBuf := TempDimensionCodeBuffer;
            DimOption := AnalysisByDimParameters."Column Dim Option";
        end;
        case DimOption of
            DimOption::"G/L Account":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewBudgetEntry.SetRange("G/L Account No.", DimCodeBuf.Code)
                else
                    TheAnalysisViewBudgetEntry.SetFilter("G/L Account No.", DimCodeBuf.Totaling);
            DimOption::Period:
                if AnalysisByDimParameters."Amount Type" = AnalysisByDimParameters."Amount Type"::"Net Change" then
                    TheAnalysisViewBudgetEntry.SetRange(
                      "Posting Date", DimCodeBuf."Period Start", DimCodeBuf."Period End")
                else
                    TheAnalysisViewBudgetEntry.SetRange("Posting Date", 0D, DimCodeBuf."Period End");
            DimOption::"Business Unit":
                TheAnalysisViewBudgetEntry.SetRange("Business Unit Code", DimCodeBuf.Code);
            DimOption::"Dimension 1":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewBudgetEntry.SetRange("Dimension 1 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewBudgetEntry.SetFilter("Dimension 1 Value Code", DimCodeBuf.Totaling);
            DimOption::"Dimension 2":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewBudgetEntry.SetRange("Dimension 2 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewBudgetEntry.SetFilter("Dimension 2 Value Code", DimCodeBuf.Totaling);
            DimOption::"Dimension 3":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewBudgetEntry.SetRange("Dimension 3 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewBudgetEntry.SetFilter("Dimension 3 Value Code", DimCodeBuf.Totaling);
            DimOption::"Dimension 4":
                if DimCodeBuf.Totaling = '' then
                    TheAnalysisViewBudgetEntry.SetRange("Dimension 4 Value Code", DimCodeBuf.Code)
                else
                    TheAnalysisViewBudgetEntry.SetFilter("Dimension 4 Value Code", DimCodeBuf.Totaling);
        end;

        OnAfterSetDimBudgetFiltersProcedure(TheAnalysisViewBudgetEntry, AnalysisView, DimOption, DimCodeBuf);
    end;

    local procedure DrillDown(SetColFilter: Boolean)
    begin
        if AnalysisByDimParameters."Show Actual/Budgets" = AnalysisByDimParameters."Show Actual/Budgets"::"Actual Amounts" then begin
            SetCommonFilters(AnalysisViewEntry);
            SetDimFilters(AnalysisViewEntry, 0);
            if SetColFilter then
                SetDimFilters(AnalysisViewEntry, 1);
            PAGE.Run(PAGE::"Analysis View Entries", AnalysisViewEntry);
        end;
        if AnalysisByDimParameters."Show Actual/Budgets" = AnalysisByDimParameters."Show Actual/Budgets"::"Budgeted Amounts" then begin
            SetCommonBudgetFilters(AnalysisViewBudgetEntry);
            SetDimBudgetFilters(AnalysisViewBudgetEntry, 0);
            if SetColFilter then
                SetDimBudgetFilters(AnalysisViewBudgetEntry, 1);
            PAGE.Run(PAGE::"Analysis View Budget Entries", AnalysisViewBudgetEntry);
        end;
    end;

    local procedure ValidateAnalysisViewCode()
    var
        IsSupported: Boolean;
    begin
        AnalysisView.Code := AnalysisViewCode;
        if not AnalysisView.Find('=<>') then
            Error(Text002);
        AnalysisViewCode := AnalysisView.Code;

        if not (AnalysisByDimParameters."Analysis Account Source" in
            [AnalysisByDimParameters."Analysis Account Source"::"G/L Account",
            AnalysisByDimParameters."Analysis Account Source"::"Cash Flow Account"])
        then begin
            AnalysisView.OnGetAnalysisViewSupported(AnalysisView, IsSupported);
            if not IsSupported then
                Error(Text003, AnalysisView."Account Source");
        end;
    end;

    local procedure CalcAmount(SetColFilter: Boolean): Decimal
    var
        Amount: Decimal;
        ColumnCode: Code[20];
    begin
        if SetColFilter then
            ColumnCode := TempDimensionCodeBuffer.Code
        else
            ColumnCode := '';
        if TempDimensionCodeAmountBuffer.Get(Rec.Code, ColumnCode) then
            exit(TempDimensionCodeAmountBuffer.Amount);
        case AnalysisByDimParameters."Show Actual/Budgets" of
            AnalysisByDimParameters."Show Actual/Budgets"::"Actual Amounts":
                Amount := CalcActualAmount(SetColFilter);
            AnalysisByDimParameters."Show Actual/Budgets"::"Budgeted Amounts":
                Amount := CalcBudgAmount(SetColFilter);
            AnalysisByDimParameters."Show Actual/Budgets"::Variance:
                Amount := CalcActualAmount(SetColFilter) - CalcBudgAmount(SetColFilter);
            AnalysisByDimParameters."Show Actual/Budgets"::"Variance%":
                begin
                    Amount := CalcBudgAmount(SetColFilter);
                    if Amount <> 0 then
                        Amount := Round(100 * (CalcActualAmount(SetColFilter) - Amount) / Amount);
                end;
            AnalysisByDimParameters."Show Actual/Budgets"::"Index%":
                begin
                    Amount := CalcBudgAmount(SetColFilter);
                    if Amount <> 0 then
                        Amount := Round(100 * CalcActualAmount(SetColFilter) / Amount);
                end;
        end;
        if AnalysisByDimParameters."Show Opposite Sign" then
            Amount := -Amount;
        TempDimensionCodeAmountBuffer."Line Code" := Rec.Code;
        TempDimensionCodeAmountBuffer."Column Code" := ColumnCode;
        TempDimensionCodeAmountBuffer.Amount := Amount;
        TempDimensionCodeAmountBuffer.Insert();
        exit(Amount);
    end;

    local procedure CalcActualAmount(SetColFilter: Boolean): Decimal
    var
        Amount: Decimal;
    begin
        AnalysisViewEntry.Reset();
        SetCommonFilters(AnalysisViewEntry);
        SetDimFilters(AnalysisViewEntry, 0);
        if SetColFilter then
            SetDimFilters(AnalysisViewEntry, 1);
        if AnalysisByDimParameters."Show In Add. Currency" then
            case AnalysisByDimParameters."Show Amount Field" of
                AnalysisByDimParameters."Show Amount Field"::Amount:
                    begin
                        AnalysisViewEntry.CalcSums("Add.-Curr. Amount");
                        Amount := AnalysisViewEntry."Add.-Curr. Amount";
                    end;
                AnalysisByDimParameters."Show Amount Field"::"Debit Amount":
                    begin
                        AnalysisViewEntry.CalcSums("Add.-Curr. Debit Amount");
                        Amount := AnalysisViewEntry."Add.-Curr. Debit Amount";
                    end;
                AnalysisByDimParameters."Show Amount Field"::"Credit Amount":
                    begin
                        AnalysisViewEntry.CalcSums("Add.-Curr. Credit Amount");
                        Amount := AnalysisViewEntry."Add.-Curr. Credit Amount";
                    end;
            end
        else
            case AnalysisByDimParameters."Show Amount Field" of
                AnalysisByDimParameters."Show Amount Field"::Amount:
                    begin
                        AnalysisViewEntry.CalcSums(Amount);
                        Amount := AnalysisViewEntry.Amount;
                    end;
                AnalysisByDimParameters."Show Amount Field"::"Debit Amount":
                    begin
                        AnalysisViewEntry.CalcSums("Debit Amount");
                        Amount := AnalysisViewEntry."Debit Amount";
                    end;
                AnalysisByDimParameters."Show Amount Field"::"Credit Amount":
                    begin
                        AnalysisViewEntry.CalcSums("Credit Amount");
                        Amount := AnalysisViewEntry."Credit Amount";
                    end;
            end;

        OnAfterCalcActualAmount(AnalysisViewEntry, AnalysisByDimParameters, Amount);

        exit(Amount);
    end;

    local procedure CalcBudgAmount(SetColFilter: Boolean): Decimal
    var
        Amount: Decimal;
    begin
        AnalysisViewBudgetEntry.Reset();
        SetCommonBudgetFilters(AnalysisViewBudgetEntry);
        SetDimBudgetFilters(AnalysisViewBudgetEntry, 0);
        if SetColFilter then
            SetDimBudgetFilters(AnalysisViewBudgetEntry, 1);
        AnalysisViewBudgetEntry.CalcSums(Amount);
        Amount := AnalysisViewBudgetEntry.Amount;
        case AnalysisByDimParameters."Show Amount Field" of
            AnalysisByDimParameters."Show Amount Field"::"Debit Amount":
                if Amount < 0 then
                    Amount := 0;
            AnalysisByDimParameters."Show Amount Field"::"Credit Amount":
                if Amount > 0 then
                    Amount := 0
                else
                    Amount := -Amount;
        end;
        if (Amount <> 0) and AnalysisByDimParameters."Show In Add. Currency" then begin
            if AnalysisViewBudgetEntry.GetFilter("Posting Date") = '' then
                CurrExchDate := WorkDate()
            else
                CurrExchDate := AnalysisViewBudgetEntry.GetRangeMin("Posting Date");
            Amount :=
              Round(
                CurrExchRate.ExchangeAmtLCYToFCY(
                  CurrExchDate, GLSetup."Additional Reporting Currency", Amount,
                  CurrExchRate.ExchangeRate(CurrExchDate, GLSetup."Additional Reporting Currency")),
                Currency."Amount Rounding Precision");
        end;

        OnAfterCalcBudgetAmount(AnalysisViewBudgetEntry, AnalysisByDimParameters, Amount);

        exit(Amount);
    end;

    local procedure MATRIX_UpdateMatrixRecord(MATRIX_NewColumnOrdinal: Integer)
    begin
        MATRIX_ColumnOrdinal := MATRIX_NewColumnOrdinal;
        TempDimensionCodeBuffer.SetPosition(MATRIX_PrimKeyFirstCol);
        MATRIX_OnFindRecord('=');
        if MATRIX_ColumnOrdinal <> 1 then
            MATRIX_OnNextRecord(MATRIX_ColumnOrdinal - 1);
    end;

    local procedure MATRIX_OnFindRecord(Which: Text[1024]): Boolean
    begin
        exit(FindRec(AnalysisByDimParameters."Column Dim Option", TempDimensionCodeBuffer, Which));
    end;

    local procedure MATRIX_OnNextRecord(Steps: Integer): Integer
    begin
        exit(NextRecord(AnalysisByDimParameters."Column Dim Option", TempDimensionCodeBuffer, Steps));
    end;

    local procedure MATRIX_OnAfterGetRecord()
    begin
        MatrixAmount := MatrixMgt.RoundAmount(CalcAmount(true), AnalysisByDimParameters."Rounding Factor");

        MATRIX_CellData[MATRIX_ColumnOrdinal] := MatrixAmount;
    end;

    /// <summary>
    /// Sets visibility properties for matrix columns based on column caption availability.
    /// Controls which matrix fields are displayed in the user interface.
    /// </summary>
    procedure SetVisible()
    begin
        Field1Visible := ColumnCaptions[1] <> '';
        Field2Visible := ColumnCaptions[2] <> '';
        Field3Visible := ColumnCaptions[3] <> '';
        Field4Visible := ColumnCaptions[4] <> '';
        Field5Visible := ColumnCaptions[5] <> '';
        Field6Visible := ColumnCaptions[6] <> '';
        Field7Visible := ColumnCaptions[7] <> '';
        Field8Visible := ColumnCaptions[8] <> '';
        Field9Visible := ColumnCaptions[9] <> '';
        Field10Visible := ColumnCaptions[10] <> '';
        Field11Visible := ColumnCaptions[11] <> '';
        Field12Visible := ColumnCaptions[12] <> '';
        Field13Visible := ColumnCaptions[13] <> '';
        Field14Visible := ColumnCaptions[14] <> '';
        Field15Visible := ColumnCaptions[15] <> '';
        Field16Visible := ColumnCaptions[16] <> '';
        Field17Visible := ColumnCaptions[17] <> '';
        Field18Visible := ColumnCaptions[18] <> '';
        Field19Visible := ColumnCaptions[19] <> '';
        Field20Visible := ColumnCaptions[20] <> '';
        Field21Visible := ColumnCaptions[21] <> '';
        Field22Visible := ColumnCaptions[22] <> '';
        Field23Visible := ColumnCaptions[23] <> '';
        Field24Visible := ColumnCaptions[24] <> '';
        Field25Visible := ColumnCaptions[25] <> '';
        Field26Visible := ColumnCaptions[26] <> '';
        Field27Visible := ColumnCaptions[27] <> '';
        Field28Visible := ColumnCaptions[28] <> '';
        Field29Visible := ColumnCaptions[29] <> '';
        Field30Visible := ColumnCaptions[30] <> '';
        Field31Visible := ColumnCaptions[31] <> '';
        Field32Visible := ColumnCaptions[32] <> '';
    end;


    /// <summary>
    /// Loads matrix parameters and configures column settings for analysis display.
    /// Initializes matrix captions, primary key values, and analysis parameters for data retrieval.
    /// </summary>
    /// <param name="NewAnalysisByDimParameters">Analysis parameters controlling data filtering and display options</param>
    /// <param name="LineDimCodeLocal">Dimension code for row grouping in the matrix</param>
    /// <param name="ColumnDimCodeLocal">Dimension code for column grouping in the matrix</param>
    /// <param name="NewMATRIX_ColumnCaptions">Array of column captions for matrix headers</param>
    /// <param name="NewPrimKeyFirstCol">Primary key value for first column in current column set</param>
    procedure Load(NewAnalysisByDimParameters: Record "Analysis by Dim. Parameters"; LineDimCodeLocal: Text[30]; ColumnDimCodeLocal: Text[30]; NewMATRIX_ColumnCaptions: array[32] of Text[250]; NewPrimKeyFirstCol: Text[1024])
    begin
        AnalysisByDimParameters := NewAnalysisByDimParameters;
        AnalysisViewCode := AnalysisByDimParameters."Analysis View Code";
        LineDimCode := LineDimCodeLocal;
        ColumnDimCode := ColumnDimCodeLocal;
        CopyArray(ColumnCaptions, NewMATRIX_ColumnCaptions, 1);
        MATRIX_PrimKeyFirstCol := NewPrimKeyFirstCol;
        RoundingFactorFormatString := MatrixMgt.FormatRoundingFactor(AnalysisByDimParameters."Rounding Factor", false);
    end;

    local procedure FormatLine()
    begin
        Emphasize := Rec."Show in Bold";
    end;

    local procedure FindPeriod(var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[3]) Found: Boolean
    var
        PeriodPageMgt: Codeunit PeriodPageManagement;
    begin
        Evaluate(PeriodOption."Period Start", DimCodeBuf.Code);
        FilterLinePeriod(DimCodeBuf);
        Found := PeriodPageMgt.FindDate(Which, PeriodOption, AnalysisByDimParameters."Period Type");
        if Found then
            CopyPeriodToBuf(PeriodOption, DimCodeBuf);
        exit(Found);
    end;

    local procedure NextPeriod(var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer) ResultSteps: Integer
    var
        PeriodPageMgt: Codeunit PeriodPageManagement;
    begin
        Evaluate(PeriodOption."Period Start", DimCodeBuf.Code);
        FilterLinePeriod(DimCodeBuf);
        ResultSteps := PeriodPageMgt.NextDate(Steps, PeriodOption, AnalysisByDimParameters."Period Type");
        if ResultSteps <> 0 then
            CopyPeriodToBuf(PeriodOption, DimCodeBuf);
        exit(ResultSteps);
    end;

    local procedure FilterLinePeriod(var DimCodeBuf: Record "Dimension Code Buffer")
    begin
        if AnalysisByDimParameters."Line Dim Option" = AnalysisByDimParameters."Line Dim Option"::Period then begin
            PeriodOption.SetRange("Period Start");
            PeriodOption.SetRange("Period Name");
            PeriodOption.SetFilter("Period Start", DimCodeBuf.GetFilter(Code));
            PeriodOption.SetFilter("Period Name", DimCodeBuf.GetFilter(Name));
        end;
    end;

    local procedure InitDimValue(var DimensionCodeBuffer: Record "Dimension Code Buffer"; DimensionCode: Code[20]; DimensionFilter: Text)
    var
        DimensionValue: Record "Dimension Value";
    begin
        OnBeforeInitDimValue(DimensionValue);
        if DimensionCode <> '' then begin
            DimensionValue.SetRange("Dimension Code", DimensionCode);
            if DimensionFilter <> '' then
                DimensionValue.SetFilter(Code, DimensionFilter);
            if DimensionValue.FindSet() then
                repeat
                    CopyDimValueToBuf(DimensionValue, DimensionCodeBuffer);
                until DimensionValue.Next() = 0;
        end;
    end;

    local procedure FormatStr(): Text
    begin
        exit(RoundingFactorFormatString);
    end;

    local procedure GetDimValueTotaling(DimValueFilter: Text; DimensionCode: Code[20]): Text
    var
        DimensionManagement: Codeunit DimensionManagement;
    begin
        DimensionManagement.ResolveDimValueFilter(DimValueFilter, DimensionCode);
        exit(DimValueFilter);
    end;

    /// <summary>
    /// Integration event raised after setting common filters on analysis view entries.
    /// Allows custom filtering logic to be applied to analysis view entry records.
    /// </summary>
    /// <param name="AnalysisViewEntry">Analysis view entry record with applied filters</param>
    /// <param name="AnalysisByDimParameters">Parameters controlling the analysis filtering</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterSetCommonFilters(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
    begin
    end;

    /// <summary>
    /// Integration event raised after setting common filters on analysis view budget entries.
    /// Allows custom filtering logic to be applied to budget entry records.
    /// </summary>
    /// <param name="AnalysisViewBudgetEntry">Analysis view budget entry record with applied filters</param>
    /// <param name="AnalysisByDimParameters">Parameters controlling the analysis filtering</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterSetCommonBudgetFilters(var AnalysisViewBudgetEntry: Record "Analysis View Budget Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
    begin
    end;

    /// <summary>
    /// Integration event raised after calculating actual amounts for analysis view entries.
    /// Allows modification of calculated amounts based on custom business logic.
    /// </summary>
    /// <param name="AnalysisViewEntry">Analysis view entry record used in calculation</param>
    /// <param name="AnalysisByDimParameters">Parameters controlling the analysis calculation</param>
    /// <param name="Amount">Calculated amount that can be modified by subscribers</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcActualAmount(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters"; var Amount: Decimal)
    begin
    end;

    /// <summary>
    /// Integration event raised after calculating budget amounts for analysis view budget entries.
    /// Allows modification of calculated budget amounts based on custom business logic.
    /// </summary>
    /// <param name="AnalysisViewBudgetEntry">Analysis view budget entry record used in calculation</param>
    /// <param name="AnalysisByDimParameters">Parameters controlling the analysis calculation</param>
    /// <param name="Amount">Calculated budget amount that can be modified by subscribers</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcBudgetAmount(var AnalysisViewBudgetEntry: Record "Analysis View Budget Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters"; var Amount: Decimal)
    begin
    end;

    /// <summary>
    /// Integration event raised after setting dimension filters on analysis view entries.
    /// Allows custom dimension filtering logic to be applied beyond standard filtering.
    /// </summary>
    /// <param name="TheAnalysisViewEntry">Analysis view entry record with dimension filters applied</param>
    /// <param name="AnalysisView">Analysis view configuration record</param>
    /// <param name="DimOption">Dimension option specifying which dimension is being filtered</param>
    /// <param name="DimCodeBuf">Dimension code buffer containing filter values</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDimFiltersProcedure(var TheAnalysisViewEntry: Record "Analysis View Entry"; AnalysisView: Record "Analysis View"; DimOption: Enum "Analysis Dimension Option"; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised after setting dimension filters on analysis view budget entries.
    /// Allows custom dimension filtering logic to be applied to budget entries beyond standard filtering.
    /// </summary>
    /// <param name="TheAnalysisViewBudgetEntry">Analysis view budget entry record with dimension filters applied</param>
    /// <param name="AnalysisView">Analysis view configuration record</param>
    /// <param name="DimOption">Dimension option specifying which dimension is being filtered</param>
    /// <param name="DimCodeBuf">Dimension code buffer containing filter values</param>
    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDimBudgetFiltersProcedure(var TheAnalysisViewBudgetEntry: Record "Analysis View Budget Entry"; AnalysisView: Record "Analysis View"; DimOption: Enum "Analysis Dimension Option"; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
    end;

    /// <summary>
    /// Integration event raised before initializing dimension value for analysis by dimensions matrix.
    /// Enables custom dimension value initialization logic.
    /// </summary>
    /// <param name="DimensionValue">Dimension Value record being initialized</param>
    [IntegrationEvent(true, false)]
    local procedure OnBeforeInitDimValue(var DimensionValue: Record "Dimension Value")
    begin
    end;

    /// <summary>
    /// Integration event raised for custom dimension option handling in record finding.
    /// Enables extensibility for additional dimension types beyond standard options.
    /// </summary>
    /// <param name="DimOption">Dimension option being processed</param>
    /// <param name="Which">Navigation direction or specific position</param>
    /// <param name="TheDimCodeBuf">Dimension code buffer for record operations</param>
    /// <param name="Result">Result of the find operation</param>
    [IntegrationEvent(true, false)]
    local procedure OnFindRecOnCaseElse(DimOption: Enum "Analysis Dimension Option"; Which: Text[250]; var TheDimCodeBuf: Record "Dimension Code Buffer"; var Result: Boolean)
    begin
    end;

    /// <summary>
    /// Integration event raised for custom dimension option handling in record navigation.
    /// Enables extensibility for additional dimension types in next record operations.
    /// </summary>
    /// <param name="DimOption">Dimension option being processed</param>
    /// <param name="Steps">Number of steps to navigate</param>
    /// <param name="TheDimCodeBuf">Dimension code buffer for navigation operations</param>
    /// <param name="Result">Number of steps actually taken</param>
    [IntegrationEvent(true, false)]
    local procedure OnNextRecOnCaseElse(DimOption: Enum "Analysis Dimension Option"; Steps: Integer; var TheDimCodeBuf: Record "Dimension Code Buffer"; var Result: Integer);
    begin
    end;

    /// <summary>
    /// Integration event raised for custom dimension option handling in record initialization.
    /// Enables extensibility for additional dimension types during record setup.
    /// </summary>
    /// <param name="DimOption">Dimension option being processed</param>
    /// <param name="TheDimCodeBuf">Dimension code buffer being initialized</param>
    /// <param name="AnalysisView">Analysis view configuration</param>
    /// <param name="AnalysisByDimParameters">Analysis by dimension parameters</param>
    [IntegrationEvent(true, false)]
    local procedure OnInitRecordOnCaseElse(DimOption: Enum "Analysis Dimension Option"; var TheDimCodeBuf: Record "Dimension Code Buffer"; var AnalysisView: Record "Analysis View"; var AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
    begin
    end;

    /// <summary>
    /// Integration event for custom dimension code lookup handling when dimension option requires custom implementation.
    /// </summary>
    /// <param name="DimOption">Dimension option requiring custom lookup logic</param>
    /// <param name="Code">Dimension code being looked up and selected</param>
    [IntegrationEvent(true, false)]
    local procedure OnLookupDimCodeOnCaseElse(DimOption: Enum "Analysis Dimension Option"; var "Code": Text[30])
    begin
    end;

    /// <summary>
    /// Integration event for custom page opening logic when account source requires non-standard dimension handling.
    /// </summary>
    /// <param name="AnalysisView">Analysis view configuration determining page behavior</param>
    /// <param name="LineDimCode">Line dimension code for custom page opening logic</param>
    [IntegrationEvent(false, false)]
    local procedure OnOpenPageOnAccountSourceElseCase(AnalysisView: Record "Analysis View"; var LineDimCode: Text[30])
    begin
    end;
}