Page 9288 Prod. BOM Version Comparison, source in 29

Source29

src/Layers/W1/BaseApp/Manufacturing/ProductionBOM/ProdBOMVersionComparison.Page.al692 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.Manufacturing.ProductionBOM;

using Microsoft.Finance.Analysis;
using Microsoft.Foundation.Enums;
using Microsoft.Inventory.Item;
using System.Telemetry;

page 9288 "Prod. BOM Version Comparison"
{
    Caption = 'Production BOM Version Comparison';
    DataCaptionExpression = SetCaption();
    DeleteAllowed = false;
    InsertAllowed = false;
    LinksAllowed = false;
    ModifyAllowed = false;
    PageType = Worksheet;
    SourceTable = "Production Matrix BOM Line";

    layout
    {
        area(content)
        {
            group(Options)
            {
                Caption = 'Options';

                field(ShowLevel; ShowLevel)
                {
                    ApplicationArea = Manufacturing;
                    Caption = 'Levels';
                    OptionCaption = 'Single,Multi';
                    ToolTip = 'Specifies a filter for this matrix. You can choose Single or Multi to show the lines in this filter.';

                    trigger OnValidate()
                    begin
                        ShowLevelOnAfterValidate();
                    end;
                }
            }
            group("Matrix Options")
            {
                Caption = 'Matrix Options';
                field(Matrix_CaptionRange; Matrix_CaptionRange)
                {
                    ApplicationArea = Manufacturing;
                    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.';
                }
            }
            repeater(ProductionMatrixBOMLines)
            {
                Editable = false;
                ShowCaption = false;
                field("Item No."; Rec."Item No.")
                {
                    ApplicationArea = Manufacturing;
                }
                field("Variant Code"; Rec."Variant Code")
                {
                    ApplicationArea = Manufacturing;
                    Visible = false;
                }
                field(Description; Rec.Description)
                {
                    ApplicationArea = Manufacturing;
                }
                field("Description 2"; Rec."Description 2")
                {
                    ApplicationArea = Manufacturing;
                    Visible = false;
                }
                field(BOMField1; BOMMatrix_CellData)
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + BOMMatrix_CaptionSet;
                    DecimalPlaces = 0 : 5;
                }
                field(Field1; Matrix_CellData[1])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[1];
                    DecimalPlaces = 0 : 5;
                    Visible = Field1Visible;
                }
                field(Field2; Matrix_CellData[2])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[2];
                    DecimalPlaces = 0 : 5;
                    Visible = Field2Visible;
                }
                field(Field3; Matrix_CellData[3])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[3];
                    DecimalPlaces = 0 : 5;
                    Visible = Field3Visible;
                }
                field(Field4; Matrix_CellData[4])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[4];
                    DecimalPlaces = 0 : 5;
                    Visible = Field4Visible;
                }
                field(Field5; Matrix_CellData[5])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[5];
                    DecimalPlaces = 0 : 5;
                    Visible = Field5Visible;
                }
                field(Field6; Matrix_CellData[6])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[6];
                    DecimalPlaces = 0 : 5;
                    Visible = Field6Visible;
                }
                field(Field7; Matrix_CellData[7])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[7];
                    DecimalPlaces = 0 : 5;
                    Visible = Field7Visible;
                }
                field(Field8; Matrix_CellData[8])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[8];
                    DecimalPlaces = 0 : 5;
                    Visible = Field8Visible;
                }
                field(Field9; Matrix_CellData[9])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[9];
                    DecimalPlaces = 0 : 5;
                    Visible = Field9Visible;
                }
                field(Field10; Matrix_CellData[10])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[10];
                    DecimalPlaces = 0 : 5;
                    Visible = Field10Visible;
                }
                field(Field11; Matrix_CellData[11])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[11];
                    DecimalPlaces = 0 : 5;
                    Visible = Field11Visible;
                }
                field(Field12; Matrix_CellData[12])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[12];
                    DecimalPlaces = 0 : 5;
                    Visible = Field12Visible;
                }
                field(Field13; Matrix_CellData[13])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[13];
                    DecimalPlaces = 0 : 5;
                    Visible = Field13Visible;
                }
                field(Field14; Matrix_CellData[14])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[14];
                    DecimalPlaces = 0 : 5;
                    Visible = Field14Visible;
                }
                field(Field15; Matrix_CellData[15])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[15];
                    DecimalPlaces = 0 : 5;
                    Visible = Field15Visible;
                }
                field(Field16; Matrix_CellData[16])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[16];
                    DecimalPlaces = 0 : 5;
                    Visible = Field16Visible;
                }
                field(Field17; Matrix_CellData[17])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[17];
                    DecimalPlaces = 0 : 5;
                    Visible = Field17Visible;
                }
                field(Field18; Matrix_CellData[18])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[18];
                    DecimalPlaces = 0 : 5;
                    Visible = Field18Visible;
                }
                field(Field19; Matrix_CellData[19])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[19];
                    DecimalPlaces = 0 : 5;
                    Visible = Field19Visible;
                }
                field(Field20; Matrix_CellData[20])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[20];
                    DecimalPlaces = 0 : 5;
                    Visible = Field20Visible;
                }
                field(Field21; Matrix_CellData[21])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[21];
                    DecimalPlaces = 0 : 5;
                    Visible = Field21Visible;
                }
                field(Field22; Matrix_CellData[22])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[22];
                    DecimalPlaces = 0 : 5;
                    Visible = Field22Visible;
                }
                field(Field23; Matrix_CellData[23])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[23];
                    DecimalPlaces = 0 : 5;
                    Visible = Field23Visible;
                }
                field(Field24; Matrix_CellData[24])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[24];
                    DecimalPlaces = 0 : 5;
                    Visible = Field24Visible;
                }
                field(Field25; Matrix_CellData[25])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[25];
                    DecimalPlaces = 0 : 5;
                    Visible = Field25Visible;
                }
                field(Field26; Matrix_CellData[26])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[26];
                    DecimalPlaces = 0 : 5;
                    Visible = Field26Visible;
                }
                field(Field27; Matrix_CellData[27])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[27];
                    DecimalPlaces = 0 : 5;
                    Visible = Field27Visible;
                }
                field(Field28; Matrix_CellData[28])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[28];
                    DecimalPlaces = 0 : 5;
                    Visible = Field28Visible;
                }
                field(Field29; Matrix_CellData[29])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[29];
                    DecimalPlaces = 0 : 5;
                    Visible = Field29Visible;
                }
                field(Field30; Matrix_CellData[30])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[30];
                    DecimalPlaces = 0 : 5;
                    Visible = Field30Visible;
                }
                field(Field31; Matrix_CellData[31])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[31];
                    DecimalPlaces = 0 : 5;
                    Visible = Field31Visible;
                }
                field(Field32; Matrix_CellData[32])
                {
                    ApplicationArea = Manufacturing;
                    AutoFormatType = 0;
                    BlankZero = true;
                    CaptionClass = '3,' + Matrix_CaptionSet[32];
                    DecimalPlaces = 0 : 5;
                    Visible = Field32Visible;
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
            action("Previous Set")
            {
                ApplicationArea = Manufacturing;
                Caption = 'Previous Set';
                Image = PreviousSet;
                ToolTip = 'Go to the previous set of data.';

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

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

                actionref("Previous Set_Promoted"; "Previous Set")
                {
                }
                actionref("Next Set_Promoted"; "Next Set")
                {
                }
            }
        }
        area(Navigation)
        {
            group("Item")
            {
                Caption = 'Item';
                Image = Item;
                action("Card")
                {
                    ApplicationArea = Manufacturing;
                    Caption = 'Card';
                    Image = EditLines;
                    RunObject = Page "Item Card";
                    RunPageLink = "No." = field("Item No.");
                    RunPageView = sorting("No.");
                    ShortCutKey = 'Shift+F7';
                    ToolTip = 'View or edit detailed information for the item.';
                }
                action("Matrix per Version")
                {
                    ApplicationArea = Manufacturing;
                    Caption = 'Production BOM Version Comparison';
                    Image = ProdBOMMatrixPerVersion;
                    ToolTip = 'For a production BOM set for the item, view a list of all versions and items and the used quantity per item. You can use the matrix to compare different production BOM versions concerning the used items per version.';

                    trigger OnAction()
                    var
                        Item: Record Item;
                        ProductionBOMHeader: Record "Production BOM Header";
                        ProdBOMVersionComparison: Page "Prod. BOM Version Comparison";
                    begin
                        Item.Get(Rec."Item No.");
                        Item.TestField("Production BOM No.");

                        ProductionBOMHeader.Get(Item."Production BOM No.");
                        ProdBOMVersionComparison.Set(ProductionBOMHeader);
                        ProdBOMVersionComparison.RunModal();
                    end;
                }
                action("Where-Used")
                {
                    ApplicationArea = Manufacturing;
                    Caption = 'Where-Used';
                    Image = "Where-Used";
                    ToolTip = 'View a list of BOMs in which the item is used.';

                    trigger OnAction()
                    var
                        Item: Record Item;
                        ProdBOMWhereUsed: Page "Prod. BOM Where-Used";
                    begin
                        Item.Get(Rec."Item No.");
                        ProdBOMWhereUsed.SetItem(Item, WorkDate());
                        ProdBOMWhereUsed.Run();
                    end;
                }
            }
        }
    }

    trigger OnAfterGetRecord()
    var
        Matrix_CurrentColumnOrdinal: Integer;
    begin
        BOMMatrix_CellData := BOMMatrixManagement.GetComponentNeed(Rec."Item No.", Rec."Variant Code", '');
        Matrix_CurrentColumnOrdinal := 0;
        while Matrix_CurrentColumnOrdinal < Matrix_CurrSetLength do begin
            Matrix_CurrentColumnOrdinal := Matrix_CurrentColumnOrdinal + 1;
            Matrix_OnAfterGetRecord(Matrix_CurrentColumnOrdinal);
        end;
        SetColumnVisibility();
    end;

    trigger OnFindRecord(Which: Text): Boolean
    begin
        exit(BOMMatrixManagement.FindRecord(Which, Rec));
    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(BOMMatrixManagement.NextRecord(Steps, Rec));
    end;

    trigger OnOpenPage()
    var
        FeatureTelemetry: Codeunit "Feature Telemetry";
    begin
        FeatureTelemetry.LogUptake('0000OC3', 'Production BOM Version Comparison', Enum::"Feature Uptake Status"::Discovered);
        FeatureTelemetry.LogUptake('0000OC4', 'Production BOM Version Comparison', Enum::"Feature Uptake Status"::Used);
        BuildMatrix();
        SetColumnVisibility();
    end;

    var
        CurrentProductionBOMHeader: Record "Production BOM Header";
        MatrixRecords: array[32] of Record "Production BOM Version";
        Matrix_MatrixRecord: Record "Production BOM Version";
        BOMMatrixManagement: Codeunit "BOM Matrix Management";
        ShowLevel: Option Single,Multi;
        ComponentNeed: Decimal;
        Matrix_CellData: array[32] of Decimal;
        BOMMatrix_CellData: Decimal;
        Matrix_CaptionSet: array[32] of Text[80];
        BOMMatrix_CaptionSet: Text;
        Matrix_CaptionRange: Text;
        PKFirstMatrixRecInSet: Text;
        Matrix_CurrSetLength: Integer;
        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;

    local procedure Matrix_OnAfterGetRecord(Matrix_ColumnOrdinal: Integer)
    begin
        ComponentNeed := BOMMatrixManagement.GetComponentNeed(Rec."Item No.", Rec."Variant Code", MatrixRecords[Matrix_ColumnOrdinal]."Version Code");
        Matrix_CellData[Matrix_ColumnOrdinal] := ComponentNeed;
    end;

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

    procedure SetCaption(): Text
    begin
        exit(CurrentProductionBOMHeader."No." + ' ' + CurrentProductionBOMHeader.Description);
    end;

    local procedure ShowLevelOnAfterValidate()
    begin
        BuildMatrix();
        CurrPage.Update(false);
    end;

    local procedure BuildMatrix()
    begin
        Clear(BOMMatrixManagement);
        BOMMatrixManagement.BOMMatrixFromBOM(CurrentProductionBOMHeader, ShowLevel = ShowLevel::Multi);
        Matrix_MatrixRecord.SetRange("Production BOM No.", CurrentProductionBOMHeader."No.");
        GenerateMatrixColumns(Enum::"Matrix Page Step Type"::Initial);
    end;

    local procedure GenerateMatrixColumns(StepType: Enum "Matrix Page Step Type")
    var
        MatrixManagement: Codeunit "Matrix Management";
        RecRef: RecordRef;
        CurrentMatrixRecordOrdinal: Integer;
    begin
        Clear(Matrix_CaptionSet);
        Clear(MatrixRecords);
        CurrentMatrixRecordOrdinal := 0;

        BOMMatrix_CaptionSet := Format(CurrentProductionBOMHeader."No.");

        Clear(RecRef);
        RecRef.GetTable(Matrix_MatrixRecord);
        RecRef.SetTable(Matrix_MatrixRecord);
        MatrixManagement.GenerateMatrixData(
            RecRef, StepType.AsInteger(), ArrayLen(MatrixRecords), 2, PKFirstMatrixRecInSet, Matrix_CaptionSet,
            Matrix_CaptionRange, Matrix_CurrSetLength);

        if Matrix_CurrSetLength > 0 then begin
            Matrix_MatrixRecord.SetPosition(PKFirstMatrixRecInSet);
            Matrix_MatrixRecord.Find();

            repeat
                CurrentMatrixRecordOrdinal := CurrentMatrixRecordOrdinal + 1;
                MatrixRecords[CurrentMatrixRecordOrdinal].Copy(Matrix_MatrixRecord);
            until (CurrentMatrixRecordOrdinal = Matrix_CurrSetLength) or (Matrix_MatrixRecord.Next() <> 1);
        end;
    end;

    procedure Set(var NewProductionBOMHeader: Record "Production BOM Header")
    begin
        CurrentProductionBOMHeader.Copy(NewProductionBOMHeader);
    end;
}