Page 9251 Dimension Combinations Matrix, source in 29

Source29

src/Layers/W1/BaseApp/Finance/Dimension/DimensionCombinationsMatrix.Page.al698 lines, Copyright (c) Microsoft Corporation. MIT

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

/// <summary>
/// Matrix page displaying dimension combination restrictions in grid format for visual analysis.
/// Provides interactive matrix view of dimension combination rules and blocked combinations across dimensions.
/// </summary>
/// <remarks>
/// Supports visual identification of dimension restrictions through matrix cell formatting and display text.
/// Enables quick overview of dimension combination validation rules for dimension management workflows.
/// </remarks>
page 9251 "Dimension Combinations Matrix"
{
    Caption = 'Dimension Combinations Matrix';
    Editable = false;
    LinksAllowed = false;
    PageType = ListPart;
    SourceTable = Dimension;

    layout
    {
        area(content)
        {
            repeater(Control1)
            {
                ShowCaption = false;
                field("Code"; Rec.Code)
                {
                    ApplicationArea = Dimensions;
                }
                field(Name; Rec.Name)
                {
                    ApplicationArea = Dimensions;
                }
                field(Field1; MATRIX_CellData[1])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[1];
                    Visible = Field1Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(1);
                    end;
                }
                field(Field2; MATRIX_CellData[2])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[2];
                    Visible = Field2Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(2);
                    end;
                }
                field(Field3; MATRIX_CellData[3])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[3];
                    Visible = Field3Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(3);
                    end;
                }
                field(Field4; MATRIX_CellData[4])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[4];
                    Visible = Field4Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(4);
                    end;
                }
                field(Field5; MATRIX_CellData[5])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[5];
                    Visible = Field5Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(5);
                    end;
                }
                field(Field6; MATRIX_CellData[6])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[6];
                    Visible = Field6Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(6);
                    end;
                }
                field(Field7; MATRIX_CellData[7])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[7];
                    Visible = Field7Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(7);
                    end;
                }
                field(Field8; MATRIX_CellData[8])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[8];
                    Visible = Field8Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(8);
                    end;
                }
                field(Field9; MATRIX_CellData[9])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[9];
                    Visible = Field9Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(9);
                    end;
                }
                field(Field10; MATRIX_CellData[10])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[10];
                    Visible = Field10Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(10);
                    end;
                }
                field(Field11; MATRIX_CellData[11])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[11];
                    Visible = Field11Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(11);
                    end;
                }
                field(Field12; MATRIX_CellData[12])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[12];
                    Visible = Field12Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(12);
                    end;
                }
                field(Field13; MATRIX_CellData[13])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[13];
                    Visible = Field13Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(13);
                    end;
                }
                field(Field14; MATRIX_CellData[14])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[14];
                    Visible = Field14Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(14);
                    end;
                }
                field(Field15; MATRIX_CellData[15])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[15];
                    Visible = Field15Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(15);
                    end;
                }
                field(Field16; MATRIX_CellData[16])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[16];
                    Visible = Field16Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(16);
                    end;
                }
                field(Field17; MATRIX_CellData[17])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[17];
                    Visible = Field17Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(17);
                    end;
                }
                field(Field18; MATRIX_CellData[18])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[18];
                    Visible = Field18Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(18);
                    end;
                }
                field(Field19; MATRIX_CellData[19])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[19];
                    Visible = Field19Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(19);
                    end;
                }
                field(Field20; MATRIX_CellData[20])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[20];
                    Visible = Field20Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(20);
                    end;
                }
                field(Field21; MATRIX_CellData[21])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[21];
                    Visible = Field21Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(21);
                    end;
                }
                field(Field22; MATRIX_CellData[22])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[22];
                    Visible = Field22Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(22);
                    end;
                }
                field(Field23; MATRIX_CellData[23])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[23];
                    Visible = Field23Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(23);
                    end;
                }
                field(Field24; MATRIX_CellData[24])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[24];
                    Visible = Field24Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(24);
                    end;
                }
                field(Field25; MATRIX_CellData[25])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[25];
                    Visible = Field25Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(25);
                    end;
                }
                field(Field26; MATRIX_CellData[26])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[26];
                    Visible = Field26Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(26);
                    end;
                }
                field(Field27; MATRIX_CellData[27])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[27];
                    Visible = Field27Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(27);
                    end;
                }
                field(Field28; MATRIX_CellData[28])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[28];
                    Visible = Field28Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(28);
                    end;
                }
                field(Field29; MATRIX_CellData[29])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[29];
                    Visible = Field29Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(29);
                    end;
                }
                field(Field30; MATRIX_CellData[30])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[30];
                    Visible = Field30Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(30);
                    end;
                }
                field(Field31; MATRIX_CellData[31])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[31];
                    Visible = Field31Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(31);
                    end;
                }
                field(Field32; MATRIX_CellData[32])
                {
                    ApplicationArea = All;
                    CaptionClass = '3,' + MATRIX_ColumnCaption[32];
                    Visible = Field32Visible;

                    trigger OnAssistEdit()
                    begin
                        SetLimitations(32);
                    end;
                }
            }
        }
    }

    actions
    {
    }

    trigger OnAfterGetRecord()
    var
        MATRIX_CurrentColumnOrdinal: Integer;
        MATRIX_Steps: Integer;
    begin
        Rec.Name := Rec.GetMLName(GlobalLanguage);
        MATRIX_CurrentColumnOrdinal := 0;
        if MATRIX_OnFindRecord('=><') then begin
            MATRIX_CurrentColumnOrdinal := 1;
            repeat
                MATRIX_ColumnOrdinal := MATRIX_CurrentColumnOrdinal;
                MATRIX_OnAfterGetRecord();
                MATRIX_Steps := MATRIX_OnNextRecord(1);
                MATRIX_CurrentColumnOrdinal := MATRIX_CurrentColumnOrdinal + MATRIX_Steps;
            until (MATRIX_CurrentColumnOrdinal - MATRIX_Steps = MATRIX_NoOfMatrixColumns) or (MATRIX_Steps = 0);
            if MATRIX_CurrentColumnOrdinal <> 1 then
                MATRIX_OnNextRecord(1 - MATRIX_CurrentColumnOrdinal);
        end
    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 OnOpenPage()
    begin
        MATRIX_NoOfMatrixColumns := ArrayLen(MATRIX_CellData);
        if SelectedDimCode <> '' then
            Rec.SetRange(Code, SelectedDimCode);
    end;

    var
        DimComb: Record "Dimension Combination";
        MatrixRecord: Record Dimension;
        MatrixRecords: array[32] of Record Dimension;
        DimensionValueCombinations: Page "MyDim Value Combinations";
        CombRestriction: Option " ",Limited,Blocked;
        ShowColumnName: Boolean;
        MATRIX_ColumnOrdinal: Integer;
        MATRIX_NoOfMatrixColumns: Integer;
        MATRIX_CellData: array[32] of Text[1024];
        MATRIX_ColumnCaption: array[32] of Text[1024];
        SeeCombinationsQst: Label 'Do you want to see the list of values?';
#pragma warning disable AA0074
        Text001: Label 'No limitations,Limited,Blocked';
#pragma warning restore AA0074
        SelectedDimCode: Code[20];
        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;

    /// <summary>
    /// Loads matrix data with dimension columns and records for the dimension combinations matrix display.
    /// </summary>
    /// <param name="MatrixColumns1">Array of column captions for the matrix display</param>
    /// <param name="MatrixRecords1">Array of dimension records corresponding to matrix columns</param>
    /// <param name="_ShowColumnName">Flag indicating whether to show column names in the display</param>
    procedure Load(MatrixColumns1: array[32] of Text[1024]; var MatrixRecords1: array[32] of Record Dimension; _ShowColumnName: Boolean)
    begin
        CopyArray(MATRIX_ColumnCaption, MatrixColumns1, 1);
        CopyArray(MatrixRecords, MatrixRecords1, 1);
        ShowColumnName := _ShowColumnName;
    end;

    /// <summary>
    /// Sets the selected dimension code for matrix calculations and filtering.
    /// </summary>
    /// <param name="DimCode">Dimension code to set as selected for matrix operations</param>
    procedure SetSelectedDimCode(DimCode: Code[20])
    begin
        SelectedDimCode := DimCode;
    end;

    local procedure SetLimitations(ColumnID: Integer)
    begin
        if MatrixRecords[ColumnID].Code <> Rec.Code then begin
            if CombinationIsLimited(ColumnID) then
                if Confirm(SeeCombinationsQst) then begin
                    DimensionValueCombinations.Load(Rec.Code, MatrixRecords[ColumnID].Code, ShowColumnName);
                    DimensionValueCombinations.RunModal();
                    Clear(DimensionValueCombinations);
                    exit;
                end;

            DisplayListOfDimensionValues(ColumnID);
        end;
    end;

    local procedure CombinationExists(ColumnID: Integer): Boolean
    begin
        Clear(DimComb); // The global record variable holds what GET returns or nothing.
        exit(DimComb.Get(Rec.Code, MatrixRecords[ColumnID].Code) or DimComb.Get(MatrixRecords[ColumnID].Code, Rec.Code));
    end;

    local procedure CombinationIsLimited(ColumnID: Integer): Boolean
    begin
        exit(CombinationExists(ColumnID) and (DimComb."Combination Restriction" = DimComb."Combination Restriction"::Limited));
    end;

    local procedure DisplayListOfDimensionValues(ColumnID: Integer)
    var
        DimLimVal: Integer;
        NewDimLimVal: Integer;
        OptionValueOutOfRange: Integer;
    begin
        OptionValueOutOfRange := -1;
        if MatrixRecords[ColumnID].Code <> Rec.Code then begin
            if not DimComb.Get(Rec.Code, MatrixRecords[ColumnID].Code) then
                if not DimComb.Get(MatrixRecords[ColumnID].Code, Rec.Code) then
                    DimComb."Combination Restriction" := OptionValueOutOfRange;

            DimLimVal := DimComb."Combination Restriction" + 2;
            NewDimLimVal := StrMenu(Text001, DimLimVal);
            if (DimLimVal <> NewDimLimVal) and (NewDimLimVal <> 0) then begin
                CombRestriction := NewDimLimVal - 1;
                ChangeCombRestriction(ColumnID);
                CurrPage.Update(false);
            end;
        end;
    end;

    local procedure MATRIX_OnAfterGetRecord()
    begin
        ShowCombRestriction();
        if CombRestriction = CombRestriction::" " then
            MATRIX_CellData[MATRIX_ColumnOrdinal] := ''
        else
            MATRIX_CellData[MATRIX_ColumnOrdinal] := SelectStr(CombRestriction + 1, Text001);
        SetVisible();
    end;

    local procedure MATRIX_OnFindRecord(Which: Text[1024]): Boolean
    begin
        exit(MatrixRecord.Find(Which));
    end;

    local procedure MATRIX_OnNextRecord(Steps: Integer): Integer
    begin
        exit(MatrixRecord.Next(Steps));
    end;

    local procedure ShowCombRestriction()
    var
        Dim1Code: Code[20];
        Dim2Code: Code[20];
    begin
        if Rec.Code > MatrixRecords[MATRIX_ColumnOrdinal].Code then begin
            Dim1Code := MatrixRecords[MATRIX_ColumnOrdinal].Code;
            Dim2Code := Rec.Code;
        end else begin
            Dim1Code := Rec.Code;
            Dim2Code := MatrixRecords[MATRIX_ColumnOrdinal].Code;
        end;

        if not DimComb.Get(Dim1Code, Dim2Code) then
            if not DimComb.Get(Dim2Code, Dim1Code) then begin
                DimComb.Init();
                DimComb."Dimension 1 Code" := Dim1Code;
                DimComb."Dimension 2 Code" := Dim2Code;
                CombRestriction := CombRestriction::" ";
                exit
            end;
        CombRestriction := DimComb."Combination Restriction" + 1;
    end;

    local procedure ChangeCombRestriction(ColumnID: Integer)
    var
        Dim1Code: Code[20];
        Dim2Code: Code[20];
    begin
        if MatrixRecords[ColumnID].Code <> Rec.Code then begin
            if Rec.Code > MatrixRecords[ColumnID].Code then begin
                Dim1Code := MatrixRecords[ColumnID].Code;
                Dim2Code := Rec.Code;
            end else begin
                Dim1Code := Rec.Code;
                Dim2Code := MatrixRecords[ColumnID].Code;
            end;

            if not DimComb.Get(Dim1Code, Dim2Code) then
                if not DimComb.Get(Dim2Code, Dim1Code) then
                    if CombRestriction <> CombRestriction::" " then begin
                        DimComb.Validate("Dimension 1 Code", Dim1Code);
                        DimComb.Validate("Dimension 2 Code", Dim2Code);
                        DimComb.Validate("Combination Restriction", CombRestriction - 1);
                        DimComb.Insert(true);
                        exit;
                    end;

            if CombRestriction = CombRestriction::" " then
                DimComb.Delete(true)
            else begin
                DimComb.Validate("Combination Restriction", CombRestriction - 1);
                DimComb.Modify(true);
            end;
        end;
    end;

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