Page 9223 Item Statistics Matrix

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

Procedures, 6Events, 6Obsolete, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Analysis/ItemStatisticsMatrix.Page.al1318 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.Foundation.Enums;
using Microsoft.Foundation.Period;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
using System.Utilities;

page 9223 "Item Statistics Matrix"
{
    Caption = 'Item Statistics Matrix';
    DataCaptionExpression = ItemName;
    Editable = false;
    LinksAllowed = false;
    PageType = List;
    SourceTable = "Dimension Code Buffer";

    layout
    {
        area(content)
        {
            repeater(Control1)
            {
                IndentationColumn = NameIndent;
                IndentationControls = Name;
                ShowCaption = false;
                field(Name; Rec.Name)
                {
                    ApplicationArea = Suite;
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the name of the record.';
                }
                field(Amount; Rec.Amount)
                {
                    ApplicationArea = Suite;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    Caption = 'Total Amount';
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the total value for the amount type that you select in the Show field.';

                    trigger OnDrillDown()
                    begin
                        if not ((ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Profit Calculation") and
                                    ((Rec.Name = ItemBuffer.FieldCaption("Profit (LCY)")) or (Rec.Name = ItemBuffer.FieldCaption("Profit %"))) or
                                    ((ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Cost Specification") and (Rec.Name = ItemBuffer.FieldCaption("Inventoriable Costs"))))
                            then begin
                            SetCommonFilters(ItemBuffer);
                            SetFilters(ItemBuffer, 0);
                            DrillDown();
                        end;
                    end;
                }
                field(Field1; MATRIX_CellData[1])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[1];
                    Visible = Field1Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(1);
                    end;
                }
                field(Field2; MATRIX_CellData[2])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[2];
                    Visible = Field2Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(2);
                    end;
                }
                field(Field3; MATRIX_CellData[3])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[3];
                    Visible = Field3Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(3);
                    end;
                }
                field(Field4; MATRIX_CellData[4])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[4];
                    Visible = Field4Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(4);
                    end;
                }
                field(Field5; MATRIX_CellData[5])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[5];
                    Visible = Field5Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(5);
                    end;
                }
                field(Field6; MATRIX_CellData[6])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[6];
                    Visible = Field6Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(6);
                    end;
                }
                field(Field7; MATRIX_CellData[7])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[7];
                    Visible = Field7Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(7);
                    end;
                }
                field(Field8; MATRIX_CellData[8])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[8];
                    Visible = Field8Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(8);
                    end;
                }
                field(Field9; MATRIX_CellData[9])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[9];
                    Visible = Field9Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(9);
                    end;
                }
                field(Field10; MATRIX_CellData[10])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[10];
                    Visible = Field10Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(10);
                    end;
                }
                field(Field11; MATRIX_CellData[11])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[11];
                    Visible = Field11Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(11);
                    end;
                }
                field(Field12; MATRIX_CellData[12])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[12];
                    Visible = Field12Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(12);
                    end;
                }
                field(Field13; MATRIX_CellData[13])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[13];
                    Visible = Field13Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(13);
                    end;
                }
                field(Field14; MATRIX_CellData[14])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[14];
                    Visible = Field14Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(14);
                    end;
                }
                field(Field15; MATRIX_CellData[15])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[15];
                    Visible = Field15Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(15);
                    end;
                }
                field(Field16; MATRIX_CellData[16])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[16];
                    Visible = Field16Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(16);
                    end;
                }
                field(Field17; MATRIX_CellData[17])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[17];
                    Visible = Field17Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(17);
                    end;
                }
                field(Field18; MATRIX_CellData[18])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[18];
                    Visible = Field18Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(18);
                    end;
                }
                field(Field19; MATRIX_CellData[19])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[19];
                    Visible = Field19Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(19);
                    end;
                }
                field(Field20; MATRIX_CellData[20])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[20];
                    Visible = Field20Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(20);
                    end;
                }
                field(Field21; MATRIX_CellData[21])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[21];
                    Visible = Field21Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(21);
                    end;
                }
                field(Field22; MATRIX_CellData[22])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[22];
                    Visible = Field22Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(22);
                    end;
                }
                field(Field23; MATRIX_CellData[23])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[23];
                    Visible = Field23Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(23);
                    end;
                }
                field(Field24; MATRIX_CellData[24])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[24];
                    Visible = Field24Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(24);
                    end;
                }
                field(Field25; MATRIX_CellData[25])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[25];
                    Visible = Field25Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(25);
                    end;
                }
                field(Field26; MATRIX_CellData[26])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[26];
                    Visible = Field26Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(26);
                    end;
                }
                field(Field27; MATRIX_CellData[27])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[27];
                    Visible = Field27Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(27);
                    end;
                }
                field(Field28; MATRIX_CellData[28])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[28];
                    Visible = Field28Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(28);
                    end;
                }
                field(Field29; MATRIX_CellData[29])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[29];
                    Visible = Field29Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(29);
                    end;
                }
                field(Field30; MATRIX_CellData[30])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[30];
                    Visible = Field30Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(30);
                    end;
                }
                field(Field31; MATRIX_CellData[31])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[31];
                    Visible = Field31Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(31);
                    end;
                }
                field(Field32; MATRIX_CellData[32])
                {
                    ApplicationArea = All;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[32];
                    Visible = Field32Visible;

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(32);
                    end;
                }
            }
        }
    }

    actions
    {
    }

    trigger OnAfterGetRecord()
    var
        MATRIX_Steps: Integer;
    begin
        NameIndent := 0;
        Rec.Amount := Calculate(false);
        MATRIX_ColumnOrdinal := 0;
        if MATRIX_OnFindRecord('=><') then begin
            MATRIX_ColumnOrdinal := 1;
            repeat
                MATRIX_OnAfterGetRecord(MATRIX_ColumnOrdinal);
                MATRIX_Steps := MATRIX_OnNextRecord(1);
                MATRIX_ColumnOrdinal := MATRIX_ColumnOrdinal + MATRIX_Steps;
            until (MATRIX_ColumnOrdinal - MATRIX_Steps = ArrayLen(MatrixRecords)) or (MATRIX_Steps = 0);
            if MATRIX_ColumnOrdinal <> 1 then
                MATRIX_OnNextRecord(1 - MATRIX_ColumnOrdinal);
        end;
        NameOnFormat();
    end;

    trigger OnFindRecord(Which: Text): Boolean
    begin
        IntegerLineSetFilter();
        exit(FindRec(ItemBuffer."Line 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(NextRec(ItemBuffer."Line Option", Rec, Steps));
    end;

    trigger OnOpenPage()
    begin
        Field1Visible := 1 <= MATRIX_CurrentNoOfMatrixColumn;
        Field2Visible := 2 <= MATRIX_CurrentNoOfMatrixColumn;
        Field3Visible := 3 <= MATRIX_CurrentNoOfMatrixColumn;
        Field4Visible := 4 <= MATRIX_CurrentNoOfMatrixColumn;
        Field5Visible := 5 <= MATRIX_CurrentNoOfMatrixColumn;
        Field6Visible := 6 <= MATRIX_CurrentNoOfMatrixColumn;
        Field7Visible := 7 <= MATRIX_CurrentNoOfMatrixColumn;
        Field8Visible := 8 <= MATRIX_CurrentNoOfMatrixColumn;
        Field9Visible := 9 <= MATRIX_CurrentNoOfMatrixColumn;
        Field10Visible := 10 <= MATRIX_CurrentNoOfMatrixColumn;
        Field11Visible := 11 <= MATRIX_CurrentNoOfMatrixColumn;
        Field12Visible := 12 <= MATRIX_CurrentNoOfMatrixColumn;
        Field13Visible := 13 <= MATRIX_CurrentNoOfMatrixColumn;
        Field14Visible := 14 <= MATRIX_CurrentNoOfMatrixColumn;
        Field15Visible := 15 <= MATRIX_CurrentNoOfMatrixColumn;
        Field16Visible := 16 <= MATRIX_CurrentNoOfMatrixColumn;
        Field17Visible := 17 <= MATRIX_CurrentNoOfMatrixColumn;
        Field18Visible := 18 <= MATRIX_CurrentNoOfMatrixColumn;
        Field19Visible := 19 <= MATRIX_CurrentNoOfMatrixColumn;
        Field20Visible := 20 <= MATRIX_CurrentNoOfMatrixColumn;
        Field21Visible := 21 <= MATRIX_CurrentNoOfMatrixColumn;
        Field22Visible := 22 <= MATRIX_CurrentNoOfMatrixColumn;
        Field23Visible := 23 <= MATRIX_CurrentNoOfMatrixColumn;
        Field24Visible := 24 <= MATRIX_CurrentNoOfMatrixColumn;
        Field25Visible := 25 <= MATRIX_CurrentNoOfMatrixColumn;
        Field26Visible := 26 <= MATRIX_CurrentNoOfMatrixColumn;
        Field27Visible := 27 <= MATRIX_CurrentNoOfMatrixColumn;
        Field28Visible := 28 <= MATRIX_CurrentNoOfMatrixColumn;
        Field29Visible := 29 <= MATRIX_CurrentNoOfMatrixColumn;
        Field30Visible := 30 <= MATRIX_CurrentNoOfMatrixColumn;
        Field31Visible := 31 <= MATRIX_CurrentNoOfMatrixColumn;
        Field32Visible := 32 <= MATRIX_CurrentNoOfMatrixColumn;

        if Item."No." <> '' then
            ItemFilter := Item."No.";
        if Item.GetFilter("Date Filter") <> '' then
            DateFilter := Item.GetFilter(Item."Date Filter");
        if Item.GetFilter("Variant Filter") <> '' then
            VariantFilter := Item.GetFilter(Item."Variant Filter");
        if Item.GetFilter("Location Filter") <> '' then
            LocationFilter := Item.GetFilter(Item."Location Filter");

        if ColumnDimCode = '' then
            ColumnDimCode := Text002;
        ItemBuffer."Column Option" := DimCodeToOption(ColumnDimCode);
        PeriodInitialized := DateFilter <> '';
        FindPeriod('');
        ItemName := StrSubstNo('%1  %2', Item."No.", Item.Description);
    end;

    var
        Item: Record Item;
        ItemBuffer: Record "Item Statistics Buffer";
        IntegerLine: Record "Integer";
        MatrixRecord: Record "Dimension Code Buffer";
        MatrixRecords: array[32] of Record "Dimension Code Buffer";
        MatrixMgt: Codeunit "Matrix Management";
        ColumnDimCode: Text[30];
        ItemName: Text[250];
        PeriodType: Enum "Analysis Period Type";
        RoundingFactor: Enum "Analysis Rounding Factor";
        AmountType: Enum "Analysis Amount Type";
        DateFilter: Text;
        InternalDateFilter: Text;
        ItemFilter: Text;
        VariantFilter: Text;
        LocationFilter: Text;
        ItemChargesFilter: Text;
        PeriodInitialized: Boolean;
        PerUnit: Boolean;
        Qty: Decimal;
        CellAmount: Decimal;
#pragma warning disable AA0074
        Text002: Label 'Period';
#pragma warning restore AA0074
        MATRIX_CurrentNoOfMatrixColumn: Integer;
        MATRIX_ColumnOrdinal: Integer;
        MATRIX_CellData: array[32] of Decimal;
        MATRIX_CaptionSet: array[32] of Text[80];
        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;
        NameIndent: Integer;

    protected var
        IncludeExpected: Boolean;

    local procedure IntegerLineSetFilter()
    begin
        if ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Profit Calculation" then
            IntegerLine.SetRange(Number, 1, 5)
        else
            if ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Cost Specification" then
                IntegerLine.SetRange(Number, 1, 9);

        OnAfterIntegerLineSetFilter(ItemBuffer, IntegerLine);
    end;

    local procedure DimCodeToOption(DimCode: Text[30]): Enum "Item Statistics Column Option"
    var
        Location: Record Location;
    begin
        case DimCode of
            '':
                exit(Enum::"Item Statistics Column Option"::Undefined);
            Text002:
                exit(Enum::"Item Statistics Column Option"::Period);
            Location.TableCaption():
                exit(Enum::"Item Statistics Column Option"::Location);
            else
                exit(Enum::"Item Statistics Column Option"::Undefined);
        end;
    end;

    local procedure FindRec(DimOption: Enum "Item Statistics Column Option"; var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[250]): Boolean
    var
        ItemCharge: Record "Item Charge";
        Location: Record Location;
        Period: Record Date;
        PeriodPageMgt: Codeunit PeriodPageManagement;
        Found: Boolean;
    begin
        case DimOption of
            DimOption::"Profit Calculation",
            DimOption::"Cost Specification":
                begin
                    if Evaluate(IntegerLine.Number, DimCodeBuf.Code) then;
                    Found := IntegerLine.Find(Which);
                    if Found then
                        CopyDimValueToBuf(IntegerLine, DimCodeBuf);
                end;
            DimOption::"Purch. Item Charge Spec.",
            DimOption::"Sales Item Charge Spec.":
                begin
                    ItemCharge."No." := DimCodeBuf.Code;
                    Found := ItemCharge.Find(Which);
                    if Found then
                        CopyAddChargesToBuf(ItemCharge, DimCodeBuf);
                end;
            DimOption::Period:
                begin
                    if not PeriodInitialized then
                        DateFilter := '';
                    PeriodInitialized := true;
                    Period.Reset();
                    if DateFilter <> '' then
                        Period.SetFilter("Period Start", DateFilter)
                    else
                        if not PeriodInitialized and (InternalDateFilter <> '') then
                            Period.SetFilter("Period Start", InternalDateFilter);
                    if DimCodeBuf."Period Start" = 0D then
                        Period.FindFirst()
                    else
                        Period."Period Start" := DimCodeBuf."Period Start";
                    Found := PeriodPageMgt.FindDate(Which, Period, PeriodType);
                    if Found then
                        CopyPeriodToBuf(Period, DimCodeBuf);
                end;
            DimOption::Location:
                begin
                    Location.Code := DimCodeBuf.Code;
                    if LocationFilter <> '' then
                        Location.SetFilter(Code, LocationFilter);
                    Found := Location.Find(Which);
                    if Found then
                        CopyLocationToBuf(Location, DimCodeBuf);
                end;
        end;
        exit(Found);
    end;

    local procedure NextRec(DimOption: Enum "Item Statistics Column Option"; var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer): Integer
    var
        ItemCharge: Record "Item Charge";
        Location: Record Location;
        Period: Record Date;
        PeriodPageMgt: Codeunit PeriodPageManagement;
        ResultSteps: Integer;
    begin
        case DimOption of
            DimOption::"Profit Calculation",
            DimOption::"Cost Specification":
                begin
                    if Evaluate(IntegerLine.Number, DimCodeBuf.Code) then;
                    ResultSteps := IntegerLine.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyDimValueToBuf(IntegerLine, DimCodeBuf);
                end;
            DimOption::"Purch. Item Charge Spec.",
            DimOption::"Sales Item Charge Spec.":
                begin
                    ItemCharge."No." := DimCodeBuf.Code;
                    if ItemChargesFilter <> '' then
                        ItemCharge.SetFilter("No.", ItemChargesFilter);
                    ResultSteps := ItemCharge.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyAddChargesToBuf(ItemCharge, DimCodeBuf);
                end;
            DimOption::Period:
                begin
                    if DateFilter <> '' then
                        Period.SetFilter("Period Start", DateFilter);
                    Period."Period Start" := DimCodeBuf."Period Start";
                    ResultSteps := PeriodPageMgt.NextDate(Steps, Period, PeriodType);
                    if ResultSteps <> 0 then
                        CopyPeriodToBuf(Period, DimCodeBuf);
                end;
            DimOption::Location:
                begin
                    Location.Code := DimCodeBuf.Code;
                    if LocationFilter <> '' then
                        Location.SetFilter(Code, LocationFilter);
                    ResultSteps := Location.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyLocationToBuf(Location, DimCodeBuf);
                end;
        end;
        exit(ResultSteps);
    end;

    local procedure CopyDimValueToBuf(var TheDimValue: Record "Integer"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        case ItemBuffer."Line Option" of
            ItemBuffer."Line Option"::"Profit Calculation":
                case TheDimValue.Number of
                    1:
                        InsertRow('1', ItemBuffer.FieldCaption("Sales (LCY)"), 0, false, TheDimCodeBuf);
                    2:
                        InsertRow('2', ItemBuffer.FieldCaption("COGS (LCY)"), 0, false, TheDimCodeBuf);
                    3:
                        InsertRow('3', ItemBuffer.FieldCaption("Non-Invtbl. Costs (LCY)"), 0, false, TheDimCodeBuf);
                    4:
                        InsertRow('4', ItemBuffer.FieldCaption("Profit (LCY)"), 0, false, TheDimCodeBuf);
                    5:
                        InsertRow('5', ItemBuffer.FieldCaption("Profit %"), 0, false, TheDimCodeBuf);
                end;
            ItemBuffer."Line Option"::"Cost Specification":
                case TheDimValue.Number of
                    1:
                        InsertRow('1', ItemBuffer.FieldCaption("Inventoriable Costs"), 0, true, TheDimCodeBuf);
                    2:
                        InsertRow('2', ItemBuffer.FieldCaption("Direct Cost (LCY)"), 1, false, TheDimCodeBuf);
                    3:
                        InsertRow('3', ItemBuffer.FieldCaption("Revaluation (LCY)"), 1, false, TheDimCodeBuf);
                    4:
                        InsertRow('4', ItemBuffer.FieldCaption("Rounding (LCY)"), 1, false, TheDimCodeBuf);
                    5:
                        InsertRow('5', ItemBuffer.FieldCaption("Indirect Cost (LCY)"), 1, false, TheDimCodeBuf);
                    6:
                        InsertRow('6', ItemBuffer.FieldCaption("Variance (LCY)"), 1, false, TheDimCodeBuf);
                    7:
                        InsertRow('7', ItemBuffer.FieldCaption("Inventoriable Costs, Total"), 0, true, TheDimCodeBuf);
                    8:
                        InsertRow('8', ItemBuffer.FieldCaption("COGS (LCY)"), 0, true, TheDimCodeBuf);
                    9:
                        InsertRow('9', ItemBuffer.FieldCaption("Inventory (LCY)"), 0, true, TheDimCodeBuf);
                end;
        end;
        OnAfterCopyDimValueToBuf(ItemBuffer, TheDimValue, TheDimCodeBuf);
    end;

    local procedure CopyAddChargesToBuf(var TheItemCharge: Record "Item Charge"; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheItemCharge."No.";
        TheDimCodeBuf.Name := CopyStr(
            StrSubstNo('%1 %2', TheItemCharge."No.", TheItemCharge.Description), 1, 50);
    end;

    local procedure CopyLocationToBuf(var TheLocation: Record Location; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := TheLocation.Code;
        TheDimCodeBuf.Name := TheLocation.Name;
    end;

    local procedure CopyPeriodToBuf(var ThePeriod: Record Date; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := Format(ThePeriod."Period Start");
        TheDimCodeBuf."Period Start" := ThePeriod."Period Start";
        TheDimCodeBuf."Period End" := ThePeriod."Period End";
        TheDimCodeBuf.Name := ThePeriod."Period Name";
    end;

    protected procedure InsertRow(Code1: Code[10]; Name1: Text[80]; Indentation1: Integer; Bold1: Boolean; var TheDimCodeBuf: Record "Dimension Code Buffer")
    begin
        TheDimCodeBuf.Init();
        TheDimCodeBuf.Code := Code1;
        TheDimCodeBuf.Name := CopyStr(Name1, 1, MaxStrLen(TheDimCodeBuf.Name));
        TheDimCodeBuf.Indentation := Indentation1;
        TheDimCodeBuf."Show in Bold" := Bold1;
    end;

    local procedure FindPeriod(SearchText: Code[10])
    var
        Calendar: Record Date;
        PeriodPageMgt: Codeunit PeriodPageManagement;
    begin
        if DateFilter <> '' then begin
            Calendar.SetFilter("Period Start", DateFilter);
            if not PeriodPageMgt.FindDate('+', Calendar, PeriodType) then
                PeriodPageMgt.FindDate('+', Calendar, PeriodType::Day);
            Calendar.SetRange("Period Start");
        end;
        PeriodPageMgt.FindDate(SearchText, Calendar, PeriodType);
        if AmountType = AmountType::"Net Change" then begin
            ItemBuffer.SetRange("Date Filter", Calendar."Period Start", Calendar."Period End");
            if ItemBuffer.GetRangeMin("Date Filter") = ItemBuffer.GetRangeMax("Date Filter") then
                ItemBuffer.SetRange("Date Filter", ItemBuffer.GetRangeMin("Date Filter"));
        end else
            ItemBuffer.SetRange("Date Filter", 0D, Calendar."Period End");
        InternalDateFilter := ItemBuffer.GetFilter("Date Filter");
    end;

    local procedure DrillDown()
    var
        ValueEntry: Record "Value Entry";
    begin
        ValueEntry.SetCurrentKey(
            "Item No.", "Posting Date", "Item Ledger Entry Type", "Entry Type", "Variance Type",
            "Item Charge No.", "Location Code", "Variant Code");
        if ItemBuffer.GetFilter("Item Filter") <> '' then
            ItemBuffer.CopyFilter("Item Filter", ValueEntry."Item No.");
        if ItemBuffer.GetFilter("Date Filter") <> '' then
            ItemBuffer.CopyFilter("Date Filter", ValueEntry."Posting Date")
        else
            ValueEntry.SetRange("Posting Date", 0D, DMY2Date(31, 12, 9999));
        if ItemBuffer.GetFilter("Entry Type Filter") <> '' then
            ItemBuffer.CopyFilter("Entry Type Filter", ValueEntry."Entry Type");
        if ItemBuffer.GetFilter("Item Ledger Entry Type Filter") <> '' then
            ItemBuffer.CopyFilter("Item Ledger Entry Type Filter", ValueEntry."Item Ledger Entry Type");
        if ItemBuffer.GetFilter("Variance Type Filter") <> '' then
            ItemBuffer.CopyFilter("Variance Type Filter", ValueEntry."Variance Type");
        if ItemBuffer.GetFilter("Item Charge No. Filter") <> '' then
            ItemBuffer.CopyFilter("Item Charge No. Filter", ValueEntry."Item Charge No.");
        if ItemBuffer.GetFilter("Location Filter") <> '' then
            ItemBuffer.CopyFilter("Location Filter", ValueEntry."Location Code");
        if ItemBuffer.GetFilter("Variant Filter") <> '' then
            ItemBuffer.CopyFilter("Variant Filter", ValueEntry."Variant Code");
        case true of
            ((ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Profit Calculation") and (Rec.Name = ItemBuffer.FieldCaption("Sales (LCY)"))) or
          (ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Sales Item Charge Spec."):
                PAGE.Run(0, ValueEntry, ValueEntry."Sales Amount (Actual)");
            Rec.Name = ItemBuffer.FieldCaption("Non-Invtbl. Costs (LCY)"):
                PAGE.Run(0, ValueEntry, ValueEntry."Cost Amount (Non-Invtbl.)");
            else
                PAGE.Run(0, ValueEntry, ValueEntry."Cost Amount (Actual)");
        end;
    end;

    protected procedure SetCommonFilters(var TheItemBuffer: Record "Item Statistics Buffer")
    begin
        TheItemBuffer.Reset();
        if ItemFilter <> '' then
            TheItemBuffer.SetFilter("Item Filter", ItemFilter);
        if DateFilter <> '' then
            TheItemBuffer.SetFilter("Date Filter", DateFilter);
        if LocationFilter <> '' then
            TheItemBuffer.SetFilter("Location Filter", LocationFilter);
        if VariantFilter <> '' then
            TheItemBuffer.SetFilter("Variant Filter", VariantFilter);
    end;

    protected procedure SetFilters(var ItemBuffer: Record "Item Statistics Buffer"; LineOrColumn: Option Line,Column)
    var
        DimCodeBuf: Record "Dimension Code Buffer";
        DimOption: Enum "Item Statistics Column Option";
    begin
        if LineOrColumn = LineOrColumn::Line then begin
            DimCodeBuf := Rec;
            DimOption := ItemBuffer."Line Option";
        end else begin
            DimCodeBuf := MatrixRecords[MATRIX_ColumnOrdinal];
            DimOption := ItemBuffer."Column Option";
        end;
        case DimOption of
            DimOption::Location:
                ItemBuffer.SetRange("Location Filter", DimCodeBuf.Code);
            DimOption::Period:
                if AmountType = AmountType::"Net Change" then
                    ItemBuffer.SetRange("Date Filter", DimCodeBuf."Period Start", DimCodeBuf."Period End")
                else
                    ItemBuffer.SetRange("Date Filter", 0D, DimCodeBuf."Period End");
            DimOption::"Profit Calculation",
            DimOption::"Cost Specification":
                case Rec.Name of
                    ItemBuffer.FieldCaption("Sales (LCY)"),
                    ItemBuffer.FieldCaption("COGS (LCY)"),
                    ItemBuffer.FieldCaption("Profit (LCY)"),
                    ItemBuffer.FieldCaption("Profit %"):
                        begin
                            ItemBuffer.SetRange("Item Ledger Entry Type Filter", ItemBuffer."Item Ledger Entry Type Filter"::Sale);
                            if DimOption = DimOption::"Profit Calculation" then
                                ItemBuffer.SetFilter("Entry Type Filter", '<>%1', ItemBuffer."Entry Type Filter"::Revaluation);
                            ItemBuffer.SetRange("Variance Type Filter", ItemBuffer."Variance Type Filter"::" ");
                        end;
                    ItemBuffer.FieldCaption("Direct Cost (LCY)"),
                    ItemBuffer.FieldCaption("Revaluation (LCY)"),
                    ItemBuffer.FieldCaption("Rounding (LCY)"),
                    ItemBuffer.FieldCaption("Indirect Cost (LCY)"),
                    ItemBuffer.FieldCaption("Variance (LCY)"),
                    ItemBuffer.FieldCaption("Inventoriable Costs, Total"):
                        begin
                            ItemBuffer.SetFilter(
                              ItemBuffer."Item Ledger Entry Type Filter", '<>%1&<>%2',
                              ItemBuffer."Item Ledger Entry Type Filter"::Sale,
                              ItemBuffer."Item Ledger Entry Type Filter"::" ");
                            ItemBuffer.SetRange("Variance Type Filter", ItemBuffer."Variance Type Filter"::" ");
                            case Rec.Name of
                                ItemBuffer.FieldCaption("Direct Cost (LCY)"):
                                    ItemBuffer.SetRange("Entry Type Filter", ItemBuffer."Entry Type Filter"::"Direct Cost");
                                ItemBuffer.FieldCaption("Revaluation (LCY)"):
                                    ItemBuffer.SetRange("Entry Type Filter", ItemBuffer."Entry Type Filter"::Revaluation);
                                ItemBuffer.FieldCaption("Rounding (LCY)"):
                                    ItemBuffer.SetRange("Entry Type Filter", ItemBuffer."Entry Type Filter"::Rounding);
                                ItemBuffer.FieldCaption("Indirect Cost (LCY)"):
                                    ItemBuffer.SetRange("Entry Type Filter", ItemBuffer."Entry Type Filter"::"Indirect Cost");
                                ItemBuffer.FieldCaption("Variance (LCY)"):
                                    begin
                                        ItemBuffer.SetRange("Entry Type Filter", ItemBuffer."Entry Type Filter"::Variance);
                                        ItemBuffer.SetFilter("Variance Type Filter", '<>%1', ItemBuffer."Variance Type Filter"::" ");
                                    end;
                                ItemBuffer.FieldCaption("Inventoriable Costs, Total"):
                                    ItemBuffer.SetRange("Variance Type Filter");
                            end;
                        end;
                    else
                        ItemBuffer.SetRange("Item Ledger Entry Type Filter");
                        ItemBuffer.SetRange("Variance Type Filter");
                end;
            DimOption::"Purch. Item Charge Spec.":
                begin
                    ItemBuffer.SetRange("Variance Type Filter", ItemBuffer."Variance Type Filter"::" ");
                    ItemBuffer.SetRange("Item Ledger Entry Type Filter", ItemBuffer."Item Ledger Entry Type Filter"::Purchase);
                    ItemBuffer.SetRange("Item Charge No. Filter", DimCodeBuf.Code);
                end;
            DimOption::"Sales Item Charge Spec.":
                begin
                    ItemBuffer.SetRange("Variance Type Filter", ItemBuffer."Variance Type Filter"::" ");
                    ItemBuffer.SetRange("Item Ledger Entry Type Filter", ItemBuffer."Item Ledger Entry Type Filter"::Sale);
                    ItemBuffer.SetRange("Item Charge No. Filter", DimCodeBuf.Code);
                end;
            else
                OnSetFiltersElseCase(ItemBuffer, DimCodeBuf);
        end;
        if ItemBuffer.GetFilter(ItemBuffer."Item Ledger Entry Type Filter") = '' then
            ItemBuffer.SetFilter(
              ItemBuffer."Item Ledger Entry Type Filter", '<>%1',
              ItemBuffer."Item Ledger Entry Type Filter"::" ")
    end;

    local procedure Calculate(SetColumnFilter: Boolean) Amount: Decimal
    begin
        OnBeforeCalculate(ItemBuffer, Amount, Qty, Rec.Name, SetColumnFilter);

        case ItemBuffer."Line Option" of
            ItemBuffer."Line Option"::"Profit Calculation",
            ItemBuffer."Line Option"::"Cost Specification":
                case Rec.Name of
                    ItemBuffer.FieldCaption("Sales (LCY)"):
                        Amount := CalcSalesAmount(SetColumnFilter);
                    ItemBuffer.FieldCaption("COGS (LCY)"):
                        Amount := CalcCostAmount(SetColumnFilter);
                    ItemBuffer.FieldCaption("Non-Invtbl. Costs (LCY)"):
                        Amount := CalcCostAmountNonInvnt(SetColumnFilter);
                    ItemBuffer.FieldCaption("Profit (LCY)"):
                        Amount := CalcSalesAmount(SetColumnFilter) +
                          CalcCostAmount(SetColumnFilter) +
                          CalcCostAmountNonInvnt(SetColumnFilter);
                    ItemBuffer.FieldCaption("Profit %"):
                        if CalcSalesAmount(SetColumnFilter) <> 0 then
                            Amount := Round(100 * (CalcSalesAmount(SetColumnFilter) +
                                                   CalcCostAmount(SetColumnFilter) +
                                                   CalcCostAmountNonInvnt(SetColumnFilter)) /
                                CalcSalesAmount(SetColumnFilter))
                        else
                            Amount := 0;
                    ItemBuffer.FieldCaption("Direct Cost (LCY)"), ItemBuffer.FieldCaption("Revaluation (LCY)"),
                  ItemBuffer.FieldCaption("Rounding (LCY)"), ItemBuffer.FieldCaption("Indirect Cost (LCY)"),
                  ItemBuffer.FieldCaption("Variance (LCY)"), ItemBuffer.FieldCaption("Inventory (LCY)"),
                  ItemBuffer.FieldCaption("Inventoriable Costs, Total"):
                        Amount := CalcCostAmount(SetColumnFilter);
                    else
                        Amount := 0;
                end;
            ItemBuffer."Line Option"::"Sales Item Charge Spec.":
                Amount := CalcSalesAmount(SetColumnFilter);
            ItemBuffer."Line Option"::"Purch. Item Charge Spec.":
                Amount := CalcCostAmount(SetColumnFilter);
        end;
        if PerUnit then begin
            if (ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Profit Calculation") and
               (Rec.Name = ItemBuffer.FieldCaption("Profit %"))
            then
                Qty := 1
            else
                Qty := CalcQty(SetColumnFilter);
            if Qty <> 0 then
                Amount := Amount / Abs(Qty)
            else
                Amount := 0;
        end;
        if Rec.Name <> ItemBuffer.FieldCaption("Profit %") then
            Amount := MatrixMgt.RoundAmount(Amount, RoundingFactor);

        OnAfterCalculate(ItemBuffer, SetColumnFilter, Amount, Rec.Name, CalcSalesAmount(SetColumnFilter));
    end;

    local procedure CalcSalesAmount(SetColumnFilter: Boolean): Decimal
    begin
        SetCommonFilters(ItemBuffer);
        SetFilters(ItemBuffer, 0);
        if SetColumnFilter then
            SetFilters(ItemBuffer, 1);
        if IncludeExpected then begin
            ItemBuffer.CalcFields("Sales Amount (Actual)", "Sales Amount (Expected)");
            exit(ItemBuffer."Sales Amount (Actual)" + ItemBuffer."Sales Amount (Expected)");
        end;
        ItemBuffer.CalcFields("Sales Amount (Actual)");
        exit(ItemBuffer."Sales Amount (Actual)");
    end;

    local procedure CalcCostAmount(SetColumnFilter: Boolean): Decimal
    begin
        SetCommonFilters(ItemBuffer);
        SetFilters(ItemBuffer, 0);
        if SetColumnFilter then
            SetFilters(ItemBuffer, 1);
        if IncludeExpected then begin
            ItemBuffer.CalcFields("Cost Amount (Actual)", "Cost Amount (Expected)");
            exit(ItemBuffer."Cost Amount (Actual)" + ItemBuffer."Cost Amount (Expected)");
        end;
        ItemBuffer.CalcFields("Cost Amount (Actual)");
        exit(ItemBuffer."Cost Amount (Actual)");
    end;

    local procedure CalcCostAmountNonInvnt(SetColumnFilter: Boolean): Decimal
    var
        ValueEntry: Record "Value Entry";
        TotalCostAmountNonInvnt: Decimal;
    begin
        SetCommonFilters(ItemBuffer);
        SetFilters(ItemBuffer, 0);
        if SetColumnFilter then
            SetFilters(ItemBuffer, 1);
        ItemBuffer.SetRange("Item Ledger Entry Type Filter");

        CopyValueEntryFilters(ValueEntry);
        if ValueEntry.FindSet() then
            repeat
                case ValueEntry."Document Type" of
                    ValueEntry."Document Type"::"Purchase Credit Memo":
                        TotalCostAmountNonInvnt -= ValueEntry."Cost Amount (Non-Invtbl.)";
                    ValueEntry."Document Type"::"Purchase Invoice":
                        TotalCostAmountNonInvnt += GetSign(ValueEntry) * ValueEntry."Cost Amount (Non-Invtbl.)"
                    else
                        TotalCostAmountNonInvnt += ValueEntry."Cost Amount (Non-Invtbl.)";
                end;
            until ValueEntry.Next() = 0;

        exit(TotalCostAmountNonInvnt);
    end;

    local procedure CalcQty(SetColumnFilter: Boolean): Decimal
    begin
        SetCommonFilters(ItemBuffer);
        SetFilters(ItemBuffer, 0);
        if SetColumnFilter then
            SetFilters(ItemBuffer, 1);
        ItemBuffer.SetRange("Entry Type Filter");
        ItemBuffer.SetRange("Item Charge No. Filter");
        if IncludeExpected then begin
            ItemBuffer.CalcFields(Quantity);
            exit(ItemBuffer.Quantity);
        end;
        ItemBuffer.CalcFields("Invoiced Quantity");
        exit(ItemBuffer."Invoiced Quantity");
    end;

    procedure SetItem(var NewItem: Record Item)
    begin
        Item.Get(NewItem."No.");
        Item.CopyFilters(NewItem);
    end;

    procedure LoadMatrix(NewMatrixColumns: array[32] of Text[1024]; var NewMatrixRecords: array[32] of Record "Dimension Code Buffer"; CurrentNoOfMatrixColumns: Integer; NewRoundingFactor: Enum "Analysis Rounding Factor"; NewPerUnit: Boolean; NewIncludeExpected: Boolean; NewItemBuffer: Record "Item Statistics Buffer"; NewItem: Record Item; NewPeriodType: Enum "Analysis Period Type"; NewAmountType: Enum "Analysis Amount Type"; NewColumnDimCode: Text[30]; NewDateFilter: Text; NewItemFilter: Text; NewLocationFilter: Text; NewVariantFilter: Text)
    begin
        CopyArray(MATRIX_CaptionSet, NewMatrixColumns, 1);
        CopyArray(MatrixRecords, NewMatrixRecords, 1);
        MATRIX_CurrentNoOfMatrixColumn := CurrentNoOfMatrixColumns;
        RoundingFactor := NewRoundingFactor;
        PerUnit := NewPerUnit;
        IncludeExpected := NewIncludeExpected;
        ItemBuffer := NewItemBuffer;
        Item := NewItem;
        PeriodType := NewPeriodType;
        AmountType := NewAmountType;
        ColumnDimCode := NewColumnDimCode;
        DateFilter := NewDateFilter;
        ItemFilter := NewItemFilter;
        LocationFilter := NewLocationFilter;
        VariantFilter := NewVariantFilter;
        RoundingFactorFormatString := MatrixMgt.FormatRoundingFactor(RoundingFactor, false);
    end;

    local procedure MATRIX_OnDrillDown(_MATRIX_ColumnOrdinal: Integer)
    begin
        if not ((ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Profit Calculation") and
                    ((Rec.Name = ItemBuffer.FieldCaption(ItemBuffer."Profit (LCY)")) or (Rec.Name = ItemBuffer.FieldCaption(ItemBuffer."Profit %"))) or
                    ((ItemBuffer."Line Option" = ItemBuffer."Line Option"::"Cost Specification") and (Rec.Name = ItemBuffer.FieldCaption(ItemBuffer."Inventoriable Costs"))))
            then begin
            SetCommonFilters(ItemBuffer);
            SetFilters(ItemBuffer, 0);
            MATRIX_ColumnOrdinal := _MATRIX_ColumnOrdinal;
            SetFilters(ItemBuffer, 1);
            DrillDown();
        end;
    end;

    local procedure MATRIX_OnAfterGetRecord(MATRIX_ColumnOrdinal: Integer)
    begin
        CellAmount := Calculate(true);
        MATRIX_CellData[MATRIX_ColumnOrdinal] := CellAmount;
    end;

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

    local procedure MATRIX_OnNextRecord(Steps: Integer): Integer
    begin
        exit(NextRec(ItemBuffer."Column Option", MatrixRecord, Steps));
    end;

    local procedure NameOnFormat()
    begin
        NameIndent := Rec.Indentation;
    end;

    local procedure CopyValueEntryFilters(var ValueEntry: Record "Value Entry")
    begin
        ValueEntry.SetFilter("Item No.", ItemFilter);
        ValueEntry.SetFilter("Variant Code", VariantFilter);

        ValueEntry.SetFilter("Item Ledger Entry Type", ItemBuffer.GetFilter("Item Ledger Entry Type Filter"));
        ValueEntry.SetFilter("Variance Type", ItemBuffer.GetFilter("Variance Type Filter"));
        ValueEntry.SetFilter("Entry Type", ItemBuffer.GetFilter("Entry Type Filter"));
        ValueEntry.SetFilter("Global Dimension 1 Code", ItemBuffer.GetFilter("Global Dimension 1 Filter"));
        ValueEntry.SetFilter("Global Dimension 2 Code", ItemBuffer.GetFilter("Global Dimension 2 Filter"));
        ValueEntry.SetFilter("Item Charge No.", ItemBuffer.GetFilter("Item Charge No. Filter"));
        ValueEntry.SetFilter("Source Type", ItemBuffer.GetFilter("Source Type Filter"));
        ValueEntry.SetFilter("Source Code", ItemBuffer.GetFilter("Source No. Filter"));
        ValueEntry.SetFilter("Posting Date", ItemBuffer.GetFilter("Date Filter"));
        ValueEntry.SetFilter("Location Code", ItemBuffer.GetFilter("Location Filter"));
    end;

    local procedure GetSign(ValueEntry: Record "Value Entry"): Decimal
    var
        ItemLedgerEntry: Record "Item Ledger Entry";
    begin
        ItemLedgerEntry.Get(ValueEntry."Item Ledger Entry No.");
        if (ValueEntry."Item Ledger Entry Type" = ValueEntry."Item Ledger Entry Type"::Purchase) and
           (ItemLedgerEntry."Entry Type" = ItemLedgerEntry."Entry Type"::Sale)
        then
            exit(1);
        exit(-1);
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnSetFiltersElseCase(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var DimensionCodeBuffer: Record "Dimension Code Buffer")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterIntegerLineSetFilter(var ItemBuffer: Record "Item Statistics Buffer"; var IntegerLine: Record "Integer");
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterCopyDimValueToBuf(var ItemBuffer: Record "Item Statistics Buffer"; var TheDimValue: Record "Integer"; var TheDimCodeBuf: Record "Dimension Code Buffer");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalculate(var ItemBuffer: Record "Item Statistics Buffer"; SetColumnFilter: Boolean; var Amount: Decimal; Name: Text[100]; SalesAmount: Decimal);
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeCalculate(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var Amount: Decimal; var Qty: Decimal; Name: Text; SetColumnFilter: Boolean)
    begin
    end;
}