Page 7159 Invt. Analysis by Dimensions, source in 29

Source29

src/Layers/W1/BaseApp/Inventory/Analysis/InvtAnalysisbyDimensions.Page.al748 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.Inventory.Analysis;

using Microsoft.Finance.Analysis;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.Period;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using System.Text;
using System.Utilities;

page 7159 "Invt. Analysis by Dimensions"
{
    Caption = 'Invt. Analysis by Dimensions';
    DataCaptionExpression = CurrentItemAnalysisViewCode;
    DeleteAllowed = false;
    InsertAllowed = false;
    LinksAllowed = false;
    ModifyAllowed = false;
    PageType = Card;
    SaveValues = true;
    SourceTable = "Dimension Code Buffer";

    layout
    {
        area(content)
        {
            group(General)
            {
                Caption = 'General';
                field(CurrentItemAnalysisViewCode; CurrentItemAnalysisViewCode)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Analysis View Code';
                    ToolTip = 'Specifies the code for the analysis view that the filter belongs to.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        ItemAnalysisMgt.LookupItemAnalysisView(
                          CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
                          Dim1Filter, Dim2Filter, Dim3Filter);
                        ItemAnalysisMgt.SetLineAndColumnDim(
                          ItemAnalysisView, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);
                        UpdateFilterFields();
                        CurrPage.Update(false);
                    end;

                    trigger OnValidate()
                    begin
                        ItemAnalysisMgt.CheckAnalysisView(CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode, ItemAnalysisView);
                        ItemAnalysisMgt.SetItemAnalysisView(
                          CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
                          Dim1Filter, Dim2Filter, Dim3Filter);
                        OnValidateCurrentItemAnalysisViewCodeOnAfterSetItemAnalysisView(ItemAnalysisView);
                        ItemAnalysisMgt.SetLineAndColumnDim(
                          ItemAnalysisView, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);
                        UpdateFilterFields();
                        CurrPage.Update(false);
                    end;
                }
                field(LineDimCode; LineDimCode)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Show as Lines';
                    ToolTip = 'Specifies which values you want to show as lines in the window. This allows you to see the same matrix window from various perspectives, especially when you use both the Show as Lines field and the Show as Columns field.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        NewCode: Text[30];
                    begin
                        NewCode := ItemAnalysisMgt.GetDimSelection(LineDimCode, ItemAnalysisView);
                        if NewCode <> LineDimCode then begin
                            Text := NewCode;
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    begin
                        if (UpperCase(LineDimCode) = UpperCase(ColumnDimCode)) and (LineDimCode <> '') then begin
                            ColumnDimCode := '';
                            ItemAnalysisMgt.ValidateColumnDimTypeAndCode(
                              ItemAnalysisView, ColumnDimCode, ColumnDimType, LineDimType,
                              InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        end;
                        ItemAnalysisMgt.ValidateLineDimTypeAndCode(
                          ItemAnalysisView, LineDimCode, LineDimType, ColumnDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        if LineDimType = LineDimType::Period then
                            Rec.SetCurrentKey("Period Start")
                        else
                            Rec.SetCurrentKey(Code);
                        CurrPage.Update(false);
                    end;
                }
                field(ColumnDimCode; ColumnDimCode)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Show as Columns';
                    ToolTip = 'Specifies which values you want to show as columns in the window. This allows you to see the same matrix window from various perspectives, especially when you use both the Show as Lines field and the Show as Columns field.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        NewCode: Text[30];
                    begin
                        NewCode := ItemAnalysisMgt.GetDimSelection(ColumnDimCode, ItemAnalysisView);
                        if NewCode <> ColumnDimCode then begin
                            Text := NewCode;
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    begin
                        if (UpperCase(LineDimCode) = UpperCase(ColumnDimCode)) and (LineDimCode <> '') then begin
                            LineDimCode := '';
                            ItemAnalysisMgt.ValidateLineDimTypeAndCode(
                              ItemAnalysisView, LineDimCode, LineDimType, ColumnDimType,
                              InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        end;
                        ItemAnalysisMgt.ValidateColumnDimTypeAndCode(
                          ItemAnalysisView, ColumnDimCode, ColumnDimType, LineDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);

                        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update(false);
                    end;
                }
                field(ValueType; ValueType)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Show Value As';
                    ToolTip = 'Specifies how data is shown in the analysis view.';
                }
            }
            group(Filters)
            {
                Caption = 'Filters';
                field(DateFilter; DateFilter)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Date Filter';
                    ToolTip = 'Specifies the dates that will be used to filter the amounts in the window.';

                    trigger OnValidate()
                    var
                        FilterTokens: Codeunit "Filter Tokens";
                    begin
                        FilterTokens.MakeDateFilter(DateFilter);
                        ItemStatisticsBuffer.SetFilter("Date Filter", DateFilter);
                        DateFilter := ItemStatisticsBuffer.GetFilter("Date Filter");
                        InternalDateFilter := DateFilter;

                        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update();
                    end;
                }
                field(ItemFilter; ItemFilter)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Item Filter';
                    ToolTip = 'Specifies a filter to specify the items for which values will be shown in the matrix window.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        ItemList: Page "Item List";
                    begin
                        ItemList.LookupMode(true);
                        OnLookupItemFilterOnBeforeRunItemList(ItemList, ItemAnalysisView);
                        if ItemList.RunModal() = ACTION::LookupOK then begin
                            Text := ItemList.GetSelectionFilter();
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    var
                        ShouldUpdateColumnCaptions: Boolean;
                    begin
                        ItemStatisticsBuffer.SetFilter("Item Filter", ItemFilter);
                        ShouldUpdateColumnCaptions := ColumnDimType = ColumnDimType::Item;
                        OnValidateItemFilterOnAfterCalcShouldUpdateColumnCaptions(ItemAnalysisView, ItemStatisticsBuffer, ColumnDimType, ShouldUpdateColumnCaptions);
                        if ShouldUpdateColumnCaptions then
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update(false);
                    end;
                }
                field(LocationFilter; LocationFilter)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Location Filter';
                    ToolTip = 'Specifies the filter through which you want to analyze inventory entries.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        LocationList: Page "Location List";
                    begin
                        LocationList.LookupMode(true);
                        if LocationList.RunModal() = ACTION::LookupOK then begin
                            Text := LocationList.GetSelectionFilter();
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    var
                        ShouldUpdateColumnCaptions: Boolean;
                    begin
                        ItemStatisticsBuffer.SetFilter("Location Filter", LocationFilter);
                        ShouldUpdateColumnCaptions := ColumnDimType = ColumnDimType::Location;
                        OnValidateItemFilterOnAfterCalcShouldUpdateColumnCaptions(ItemAnalysisView, ItemStatisticsBuffer, ColumnDimType, ShouldUpdateColumnCaptions);
                        if ShouldUpdateColumnCaptions then
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update(false);
                    end;
                }
                field(BudgetFilter; BudgetFilter)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Budget Filter';
                    ToolTip = 'Specifies the budget that information in the matrix is shown for.';
                    Visible = false;
                }
                field(Dim1Filter; Dim1Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = ItemAnalysisMgt.GetCaptionClass(1, ItemAnalysisView);
                    Caption = 'Dimension 1 Filter';
                    Enabled = Dim1FilterEnable;
                    ToolTip = 'Specifies a filter for the Dimension 1 for which entries will be shown in the matrix window.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(ItemAnalysisMgt.LookUpDimFilter(ItemAnalysisView."Dimension 1 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        ItemStatisticsBuffer.SetFilter("Dimension 1 Filter", Dim1Filter);
                        if ColumnDimType = ColumnDimType::"Dimension 1" then
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update();
                    end;
                }
                field(Dim2Filter; Dim2Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = ItemAnalysisMgt.GetCaptionClass(2, ItemAnalysisView);
                    Caption = 'Dimension 2 Filter';
                    Enabled = Dim2FilterEnable;
                    ToolTip = 'Specifies a filter for the Dimension 2 for which entries will be shown in the matrix window.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(ItemAnalysisMgt.LookUpDimFilter(ItemAnalysisView."Dimension 2 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        ItemStatisticsBuffer.SetFilter("Dimension 2 Filter", Dim2Filter);
                        if ColumnDimType = ColumnDimType::"Dimension 2" then
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update();
                    end;
                }
                field(Dim3Filter; Dim3Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = ItemAnalysisMgt.GetCaptionClass(3, ItemAnalysisView);
                    Caption = 'Dimension 3 Filter';
                    Enabled = Dim3FilterEnable;
                    ToolTip = 'Specifies a filter for the Dimension 3 for which entries will be shown in the matrix window.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(ItemAnalysisMgt.LookUpDimFilter(ItemAnalysisView."Dimension 3 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        ItemStatisticsBuffer.SetFilter("Dimension 3 Filter", Dim3Filter);
                        if ColumnDimType = ColumnDimType::"Dimension 3" then
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        CurrPage.Update();
                    end;
                }
            }
            group(Options)
            {
                Caption = 'Options';
                field(ShowActualBudget; ShowActualBudget)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Show';
                    ToolTip = 'Specifies if the selected value is shown in the window.';
                }
                field(RoundingFactor; RoundingFactor)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Rounding Factor';
                    ToolTip = 'Specifies the factor that is used to round the amounts.';
                }
                field(ShowColumnName; ShowColumnName)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Show Column Name';
                    ToolTip = 'Specifies that the names of columns are shown in the matrix window.';

                    trigger OnValidate()
                    begin
                        GenerateColumnCaptions("Matrix Page Step Type"::Same);
                    end;
                }
                field(ShowOppositeSign; ShowOppositeSign)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Show Opposite Sign';
                    MultiLine = true;
                    ToolTip = 'Specifies whether to show debits as negative amounts (with minus signs) and credits as positive amounts in the matrix window.';
                }
            }
            group("Matrix Options")
            {
                Caption = 'Matrix Options';
                field(PeriodType; PeriodType)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'View by';
                    ToolTip = 'Specifies by which period amounts are displayed.';

                    trigger OnValidate()
                    begin
                        FindPeriod('');
                        if ColumnDimType = ColumnDimType::Period then
                            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                    end;
                }
                field(MATRIX_CaptionRange; MATRIX_CaptionRange)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Column Set';
                    Editable = false;
                    ToolTip = 'Specifies the range of values that are displayed in the matrix window, for example, the total period. To change the contents of the field, choose Next Set or Previous Set.';
                }
            }
        }
    }

    actions
    {
        area(navigation)
        {
            group("&Actions")
            {
                Caption = '&Actions';
                Image = "Action";
                action(ReverseLinesAndColumns)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Reverse Lines and Columns';
                    Image = Undo;
                    ToolTip = 'Change the display of the matrix by inverting the values in the Show as Lines and Show as Columns fields.';

                    trigger OnAction()
                    var
                        TempDimCode: Text[30];
                    begin
                        TempDimCode := ColumnDimCode;
                        ColumnDimCode := LineDimCode;
                        LineDimCode := TempDimCode;
                        ItemAnalysisMgt.ValidateLineDimTypeAndCode(
                          ItemAnalysisView, LineDimCode, LineDimType, ColumnDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        ItemAnalysisMgt.ValidateColumnDimTypeAndCode(
                          ItemAnalysisView, ColumnDimCode, ColumnDimType, LineDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                    end;
                }
                action(ExportToExcel)
                {
                    ApplicationArea = Dimensions;
                    Caption = 'Export to Excel';
                    Image = ExportToExcel;
                    ToolTip = 'Export the information in the analysis report to Excel.';

                    trigger OnAction()
                    var
                        ItemAnalysisViewEntry: Record "Item Analysis View Entry";
                        ItemAnalysisViewToExcel: Codeunit "Export Item Analysis View";
                    begin
                        ItemAnalysisViewToExcel.SetCommonFilters(
                          CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode,
                          ItemAnalysisViewEntry, DateFilter, ItemFilter, Dim1Filter, Dim2Filter, Dim3Filter, LocationFilter);
                        ItemAnalysisViewEntry.FindFirst();
                        ItemAnalysisViewToExcel.ExportData(
                          ItemAnalysisViewEntry, ShowColumnName, DateFilter, ItemFilter, BudgetFilter,
                          Dim1Filter, Dim2Filter, Dim3Filter, ShowActualBudget.AsInteger(), LocationFilter, ShowOppositeSign);
                    end;
                }
            }
        }
        area(processing)
        {
            action(ShowMatrix)
            {
                ApplicationArea = Dimensions;
                Caption = '&Show Matrix';
                Image = ShowMatrix;
                ToolTip = 'View the actual analysis report according to the selected filters and options.';

                trigger OnAction()
                var
                    MatrixForm: Page "Invt. Analys by Dim. Matrix";
                begin
                    Clear(MatrixForm);
                    MatrixForm.LoadMatrix(
                        MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns,
                        LineDimType, ColumnDimType, RoundingFactor, DateFilter,
                        ValueType, ItemAnalysisView, CurrentItemAnalysisViewCode,
                        ItemFilter, LocationFilter, BudgetFilter, Dim1Filter, Dim2Filter, Dim3Filter, ShowOppositeSign);
                    OnShowMatrixActionOnBeforeRunMatrixForm(MatrixForm, ItemAnalysisView);
                    MatrixForm.RunModal();
                end;
            }
            action("Previous Set")
            {
                ApplicationArea = Dimensions;
                Caption = 'Previous Set';
                Image = PreviousSet;
                ToolTip = 'Go to the previous set of data.';

                trigger OnAction()
                begin
                    GenerateColumnCaptions("Matrix Page Step Type"::Previous);
                end;
            }
            action("Next Set")
            {
                ApplicationArea = Dimensions;
                Caption = 'Next Set';
                Image = NextSet;
                ToolTip = 'Go to the next set of data.';

                trigger OnAction()
                begin
                    GenerateColumnCaptions("Matrix Page Step Type"::Next);
                end;
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process';

                actionref("Previous Set_Promoted"; "Previous Set")
                {
                }
                actionref(ShowMatrix_Promoted; ShowMatrix)
                {
                }
                actionref("Next Set_Promoted"; "Next Set")
                {
                }
                actionref(ExportToExcel_Promoted; ExportToExcel)
                {
                }
                actionref(ReverseLinesAndColumns_Promoted; ReverseLinesAndColumns)
                {
                }
            }
        }
    }

    trigger OnInit()
    begin
        Dim3FilterEnable := true;
        Dim2FilterEnable := true;
        Dim1FilterEnable := true;
    end;

    trigger OnOpenPage()
    begin
        CurrentAnalysisArea := CurrentAnalysisArea::Inventory;

        GLSetup.Get();

        ItemAnalysisMgt.AnalysisViewSelection(
          CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
          Dim1Filter, Dim2Filter, Dim3Filter);

        if (NewItemAnalysisCode <> '') and (NewItemAnalysisCode <> CurrentItemAnalysisViewCode) then begin
            CurrentItemAnalysisViewCode := NewItemAnalysisCode;
            ItemAnalysisMgt.CheckAnalysisView(CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode, ItemAnalysisView);
            ItemAnalysisMgt.SetItemAnalysisView(
              CurrentAnalysisArea.AsInteger(), CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
              Dim1Filter, Dim2Filter, Dim3Filter);
        end;

        ItemAnalysisMgt.SetLineAndColumnDim(
          ItemAnalysisView, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);
        UpdateFilterFields();

        FindPeriod('');
        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
    end;

    var
        MATRIX_MatrixRecords: array[32] of Record "Dimension Code Buffer";
        GLSetup: Record "General Ledger Setup";
        ItemStatisticsBuffer: Record "Item Statistics Buffer";
        ItemAnalysisMgt: Codeunit "Item Analysis Management";
        MATRIX_CaptionSet: array[32] of Text[80];
        MATRIX_CaptionRange: Text;
        FirstColumn: Text;
        LastColumn: Text;
        MATRIX_PrimKeyFirstCaption: Text;
        MATRIX_CurrentNoOfColumns: Integer;
        CurrentAnalysisArea: Enum "Analysis Area Type";
        CurrentItemAnalysisViewCode: Code[10];
        ItemFilter: Code[250];
        LocationFilter: Code[250];
        BudgetFilter: Code[250];
        ValueType: Enum "Item Analysis Value Type";
        ShowActualBudget: Enum "Item Analysis Show Type";
        RoundingFactor: Enum "Analysis Rounding Factor";
        PeriodType: Enum "Analysis Period Type";
        Dim1Filter: Code[250];
        Dim2Filter: Code[250];
        Dim3Filter: Code[250];
        LineDimCode: Text[30];
        ColumnDimCode: Text[30];
        DateFilter: Text[30];
        InternalDateFilter: Text[30];
        PeriodInitialized: Boolean;
        ShowColumnName: Boolean;
        ShowOppositeSign: Boolean;
#pragma warning disable AA0074
        Text100: Label 'Period';
#pragma warning restore AA0074
        NewItemAnalysisCode: Code[10];
        Dim1FilterEnable: Boolean;
        Dim2FilterEnable: Boolean;
        Dim3FilterEnable: Boolean;

    protected var
        ItemAnalysisView: Record "Item Analysis View";
        LineDimType: Enum "Item Analysis Dimension Type";
        ColumnDimType: Enum "Item Analysis Dimension Type";

    protected procedure GenerateColumnCaptions(StepType: Enum "Matrix Page Step Type")
    var
        MATRIX_PeriodRecords: array[32] of Record Date;
        Location: Record Location;
        Item: Record Item;
        Customer: Record Customer;
        Vendor: Record Vendor;
        MatrixMgt: Codeunit "Matrix Management";
        RecRef: RecordRef;
        i: Integer;
    begin
        Clear(MATRIX_CaptionSet);
        Clear(MATRIX_MatrixRecords);
        FirstColumn := '';
        LastColumn := '';
        MATRIX_CurrentNoOfColumns := ArrayLen(MATRIX_CaptionSet);

        case ColumnDimCode of
            Text100: // Period
                begin
                    MatrixMgt.GeneratePeriodMatrixData(StepType.AsInteger(), ArrayLen(MATRIX_CaptionSet), ShowColumnName,
                      PeriodType, DateFilter, MATRIX_PrimKeyFirstCaption,
                      MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns, MATRIX_PeriodRecords);
                    for i := 1 to ArrayLen(MATRIX_CaptionSet) do begin
                        MATRIX_MatrixRecords[i]."Period Start" := MATRIX_PeriodRecords[i]."Period Start";
                        MATRIX_MatrixRecords[i]."Period End" := MATRIX_PeriodRecords[i]."Period End";
                    end;
                    FirstColumn := Format(MATRIX_PeriodRecords[1]."Period Start");
                    LastColumn := Format(MATRIX_PeriodRecords[MATRIX_CurrentNoOfColumns]."Period End");
                end;
            Location.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    Location.SetFilter(Code, LocationFilter);
                    RecRef.GetTable(Location);
                    RecRef.SetTable(Location);
                    MatrixMgt.GenerateMatrixData(RecRef, StepType.AsInteger(), ArrayLen(MATRIX_CaptionSet), 1,
                      MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                            RecRef, "Matrix Page Step Type"::Same.AsInteger(), ArrayLen(MATRIX_CaptionSet), 2,
                            MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            Item.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    Item.SetFilter("No.", ItemFilter);
                    RecRef.GetTable(Item);
                    RecRef.SetTable(Item);

                    MatrixMgt.GenerateMatrixData(RecRef, StepType.AsInteger(), ArrayLen(MATRIX_CaptionSet), 1,
                      MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                            RecRef, "Matrix Page Step Type"::Same.AsInteger(), ArrayLen(MATRIX_CaptionSet), 3,
                            MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            Customer.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    RecRef.GetTable(Customer);
                    RecRef.SetTable(Customer);
                    MatrixMgt.GenerateMatrixData(RecRef, StepType.AsInteger(), ArrayLen(MATRIX_CaptionSet), 1,
                      MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(RecRef, "Matrix Page Step Type"::Same.AsInteger(), ArrayLen(MATRIX_CaptionSet), 2,
                          MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            Vendor.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    RecRef.GetTable(Vendor);
                    RecRef.SetTable(Vendor);
                    MatrixMgt.GenerateMatrixData(RecRef, StepType.AsInteger(), ArrayLen(MATRIX_CaptionSet), 1,
                      MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                            RecRef, "Matrix Page Step Type"::Same.AsInteger(), ArrayLen(MATRIX_CaptionSet), 2,
                            MATRIX_PrimKeyFirstCaption, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            ItemAnalysisView."Dimension 1 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  ItemAnalysisView."Dimension 1 Code",
                  Dim1Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaption, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
            ItemAnalysisView."Dimension 2 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  ItemAnalysisView."Dimension 2 Code",
                  Dim2Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaption, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
            ItemAnalysisView."Dimension 3 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  ItemAnalysisView."Dimension 3 Code",
                  Dim3Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaption, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
        end;

        OnAfterGenerateColumnCaptions(
            MatrixMgt, ItemAnalysisView, MATRIX_MatrixRecords, MATRIX_CaptionSet, MATRIX_PrimKeyFirstCaption, MATRIX_CaptionRange,
            MATRIX_CurrentNoOfColumns, ColumnDimCode, StepType, FirstColumn, LastColumn, ShowColumnName);
    end;

    local procedure FindPeriod(SearchText: Code[3])
    var
        PeriodPageMgt: Codeunit PeriodPageManagement;
    begin
        PeriodPageMgt.FindPeriodOnMatrixPage(
          DateFilter, InternalDateFilter, SearchText, PeriodType,
          (LineDimType <> LineDimType::Period) and (ColumnDimType <> ColumnDimType::Period));
    end;

    local procedure UpdateFilterFields()
    var
        ItemAnalysisViewFilter: Record "Item Analysis View Filter";
    begin
        ItemFilter := ItemAnalysisView."Item Filter";
        Dim1Filter := '';
        Dim2Filter := '';
        Dim3Filter := '';

        Dim1FilterEnable := ItemAnalysisView."Dimension 1 Code" <> '';
        Dim2FilterEnable := ItemAnalysisView."Dimension 2 Code" <> '';
        Dim3FilterEnable := ItemAnalysisView."Dimension 3 Code" <> '';

        if Dim1FilterEnable then
            if ItemAnalysisViewFilter.Get(
                 ItemAnalysisView."Analysis Area", ItemAnalysisView.Code, ItemAnalysisView."Dimension 1 Code")
            then
                Dim1Filter := ItemAnalysisViewFilter."Dimension Value Filter";

        if Dim2FilterEnable then
            if ItemAnalysisViewFilter.Get(
                 ItemAnalysisView."Analysis Area", ItemAnalysisView.Code, ItemAnalysisView."Dimension 2 Code")
            then
                Dim2Filter := ItemAnalysisViewFilter."Dimension Value Filter";

        if Dim3FilterEnable then
            if ItemAnalysisViewFilter.Get(
                 ItemAnalysisView."Analysis Area", ItemAnalysisView.Code, ItemAnalysisView."Dimension 3 Code")
            then
                Dim3Filter := ItemAnalysisViewFilter."Dimension Value Filter";

        OnAfterUpdateFilterFields(ItemAnalysisView, ItemFilter, Dim1Filter, Dim2Filter, Dim3Filter);
    end;

    procedure SetCurrentAnalysisViewCode(NewAnalysisViewCode: Code[10])
    begin
        NewItemAnalysisCode := NewAnalysisViewCode;
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterGenerateColumnCaptions(var MatrixMgt: Codeunit "Matrix Management"; var ItemAnalysisView: Record "Item Analysis View"; var MATRIX_MatrixRecords: array[32] of Record "Dimension Code Buffer"; var MATRIX_CaptionSet: array[32] of Text[1024]; var MATRIX_PrimKeyFirstCaption: Text; var MATRIX_CaptionRange: Text; MATRIX_CurrentNoOfColumns: Integer; ColumnDimCode: Text[30]; StepType: Enum "Matrix Page Step Type"; var FirstColumn: Text; var LastColumn: Text; ShowColumnName: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterUpdateFilterFields(var ItemAnalysisView: Record "Item Analysis View"; var ItemFilter: Code[250]; var Dim1Filter: Code[250]; var Dim2Filter: Code[250]; var Dim3Filter: Code[250])
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnLookupItemFilterOnBeforeRunItemList(var ItemList: Page "Item List"; ItemAnalysisView: Record "Item Analysis View")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnShowMatrixActionOnBeforeRunMatrixForm(var InvtAnalysByDimMatrix: Page "Invt. Analys by Dim. Matrix"; ItemAnalysisView: Record "Item Analysis View")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnValidateCurrentItemAnalysisViewCodeOnAfterSetItemAnalysisView(var ItemAnalysisView: Record "Item Analysis View")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateItemFilterOnAfterCalcShouldUpdateColumnCaptions(var ItemAnalysisView: Record "Item Analysis View"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; ColumnDimType: Enum "Item Analysis Dimension Type"; var ShouldUpdateColumnCaptions: Boolean)
    begin
    end;
}