Table 99000771 Production BOM Header

App
Base Application
Namespace
Microsoft.Manufacturing.ProductionBOM
Versions
17-28

Fields, 12Keys, 4Procedures, 2Events, 4

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Manufacturing/ProductionBOM/ProductionBOMHeader.Table.al308 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.Foundation.NoSeries;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Planning;
using Microsoft.Manufacturing.Comment;
using Microsoft.Manufacturing.Setup;

table 99000771 "Production BOM Header"
{
    Caption = 'Production BOM Header';
    DataCaptionFields = "No.", Description;
    DrillDownPageID = "Production BOM List";
    LookupPageID = "Production BOM List";
    DataClassification = CustomerContent;

    fields
    {
        field(1; "No."; Code[20])
        {
            Caption = 'No.';
            ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';
        }
        field(10; Description; Text[100])
        {
            Caption = 'Description';
            ToolTip = 'Specifies a description for the production BOM.';

            trigger OnValidate()
            begin
                "Search Name" := Description;
            end;
        }
        field(11; "Description 2"; Text[50])
        {
            Caption = 'Description 2';
            ToolTip = 'Specifies an extended description for the BOM if there is not enough space in the Description field.';
        }
        field(12; "Search Name"; Code[100])
        {
            Caption = 'Search Name';
            ToolTip = 'Specifies an alternate name that you can use to search for the record in question when you cannot remember the value in the Name field.';
        }
        field(21; "Unit of Measure Code"; Code[10])
        {
            Caption = 'Unit of Measure Code';
            ToolTip = 'Specifies the manufacturing batch unit of measure.';
            TableRelation = "Unit of Measure";

            trigger OnValidate()
            var
                Item: Record Item;
                ItemUnitOfMeasure: Record "Item Unit of Measure";
            begin
                if Status = Status::Certified then
                    FieldError(Status);
                Item.SetCurrentKey("Production BOM No.");
                Item.SetRange("Production BOM No.", "No.");
                if Item.FindSet() then
                    repeat
                        ItemUnitOfMeasure.Get(Item."No.", "Unit of Measure Code");
                    until Item.Next() = 0;
            end;
        }
        field(22; "Low-Level Code"; Integer)
        {
            Caption = 'Low-Level Code';
            Editable = false;
            ToolTip = 'Specifies how many levels of components are below this production BOM in the BOM hierarchy. The lowest level has the highest code.';
        }
        field(25; Comment; Boolean)
        {
            CalcFormula = exist("Manufacturing Comment Line" where("Table Name" = const("Production BOM Header"),
                                                                    "No." = field("No.")));
            Caption = 'Comment';
            Editable = false;
            FieldClass = FlowField;
            ToolTip = 'Specifies that a comment has been entered for this production BOM.';
        }
        field(40; "Creation Date"; Date)
        {
            Caption = 'Creation Date';
            Editable = false;
            ToolTip = 'Specifies the date when the production BOM was created.';
        }
        field(43; "Last Date Modified"; Date)
        {
            Caption = 'Last Date Modified';
            ToolTip = 'Specifies the last date that was modified.';
            Editable = false;
        }
        field(45; Status; Enum "BOM Status")
        {
            Caption = 'Status';
            ToolTip = 'Specifies the status of the production BOM.';

            trigger OnValidate()
            var
                ProdBOMLineRec: Record "Production BOM Line";
                PlanningAssignment: Record "Planning Assignment";
                MfgSetup: Record "Manufacturing Setup";
                ProdBOMCheck: Codeunit "Production BOM-Check";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeOnValidateStatus(Rec, xRec, IsHandled);
                if IsHandled then
                    exit;

                if (Status <> xRec.Status) and (Status = Status::Certified) then begin
                    ProdBOMLineRec.SetLoadFields(Type, "No.", "Variant Code");
                    ProdBOMLineRec.SetRange("Production BOM No.", "No.");
                    while ProdBOMLineRec.Next() <> 0 do
                        CheckVariantIfMandatory(ProdBOMLineRec);
                    MfgSetup.LockTable();
                    MfgSetup.Get();
                    ProdBOMCheck.ProdBOMLineCheck("No.", '');
                    "Low-Level Code" := 0;
                    ProdBOMCheck.Run(Rec);
                    PlanningAssignment.NewBOM("No.");
                end;
                if Status = Status::Closed then begin
                    IsHandled := false;
                    OnValidateStatusOnBeforeConfirm(Rec, xRec, IsHandled);
                    if not IsHandled then
                        if Confirm(Text001, false) then begin
                            ProdBOMVersion.SetRange("Production BOM No.", "No.");
                            if ProdBOMVersion.Find('-') then
                                repeat
                                    ProdBOMVersion.Status := ProdBOMVersion.Status::Closed;
                                    ProdBOMVersion.Modify();
                                until ProdBOMVersion.Next() = 0;
                        end else
                            Status := xRec.Status;
                end;
            end;
        }
        field(50; "Version Nos."; Code[20])
        {
            Caption = 'Version Nos.';
            ToolTip = 'Specifies the version number series that the production BOM versions refer to.';
            TableRelation = "No. Series";
        }
        field(51; "No. Series"; Code[20])
        {
            Caption = 'No. Series';
            Editable = false;
            TableRelation = "No. Series";
        }
    }

    keys
    {
        key(Key1; "No.")
        {
            Clustered = true;
        }
        key(Key2; "Search Name")
        {
        }
        key(Key3; Description)
        {
        }
        key(Key4; Status)
        {
        }
    }

    fieldgroups
    {
        fieldgroup(DropDown; "No.", Description, Status)
        {
        }
    }

    trigger OnDelete()
    var
        Item: Record Item;
    begin
        Item.SetRange("Production BOM No.", "No.");
        if not Item.IsEmpty() then
            Error(Text000);

        ProdBOMLine.SetRange("Production BOM No.", "No.");
        ProdBOMLine.DeleteAll(true);

        ProdBOMVersion.SetRange("Production BOM No.", "No.");
        ProdBOMVersion.DeleteAll();

        MfgComment.SetRange("Table Name", MfgComment."Table Name"::"Production BOM Header");
        MfgComment.SetRange("No.", "No.");
        MfgComment.DeleteAll();
    end;

    trigger OnInsert()
    var
        NoSeries: Codeunit "No. Series";

    begin
        MfgSetup.Get();
        if "No." = '' then begin
            MfgSetup.TestField("Production BOM Nos.");
            if NoSeries.AreRelated(MfgSetup."Production BOM Nos.", xRec."No. Series") then
                "No. Series" := xRec."No. Series"
            else
                "No. Series" := MfgSetup."Production BOM Nos.";
            "No." := NoSeries.GetNextNo("No. Series");
        end;

        "Creation Date" := Today;
    end;

    trigger OnModify()
    begin
        "Last Date Modified" := Today;
    end;

    trigger OnRename()
    begin
        if Status = Status::Certified then
            Error(Text002, TableCaption(), FieldCaption(Status), Format(Status));
    end;

    var
#pragma warning disable AA0074
        Text000: Label 'This Production BOM is being used on Items.';
        Text001: Label 'All versions attached to the BOM will be closed. Close BOM?';
#pragma warning restore AA0074
        MfgSetup: Record "Manufacturing Setup";
        ProdBOMHeader: Record "Production BOM Header";
        ProdBOMVersion: Record "Production BOM Version";
        ProdBOMLine: Record "Production BOM Line";
        MfgComment: Record "Manufacturing Comment Line";
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text002: Label 'You cannot rename the %1 when %2 is %3.';
#pragma warning restore AA0470
#pragma warning restore AA0074

    procedure AssistEdit(OldProdBOMHeader: Record "Production BOM Header"): Boolean
    var
        NoSeries: Codeunit "No. Series";
        SeriesSelected: Boolean;
        IsHandled: Boolean;
    begin
        OnBeforeAsistEdit(Rec, OldProdBOMHeader, SeriesSelected, IsHandled);
        if IsHandled then
            exit(SeriesSelected);

        ProdBOMHeader := Rec;
        MfgSetup.Get();
        MfgSetup.TestField("Production BOM Nos.");
        if NoSeries.LookupRelatedNoSeries(MfgSetup."Production BOM Nos.", OldProdBOMHeader."No. Series", ProdBOMHeader."No. Series") then begin
            ProdBOMHeader."No." := NoSeries.GetNextNo(ProdBOMHeader."No. Series");
            Rec := ProdBOMHeader;
            exit(true);
        end;
    end;

    local procedure CheckVariantIfMandatory(var ProductionBOMLine: Record "Production BOM Line")
    var
        Item: Record Item;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckVariantIfMandatory(Rec, xRec, ProductionBOMLine, IsHandled);
        if IsHandled then
            exit;

        if Item.IsVariantMandatory(ProductionBOMLine.Type = ProductionBOMLine.Type::Item, ProductionBOMLine."No.") then
            ProductionBOMLine.TestField("Variant Code");
    end;

    procedure ProductionBOMLinesExist(): Boolean
    var
        ProductionBOMLine: Record "Production BOM Line";
    begin
        ProductionBOMLine.SetRange("Production BOM No.", Rec."No.");
        ProductionBOMLine.SetRange("Version Code", '');
        exit(not ProductionBOMLine.IsEmpty());
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAsistEdit(var ProductionBOMHeader: Record "Production BOM Header"; OldProductionBOMHeader: Record "Production BOM Header"; var SeriesSelected: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckVariantIfMandatory(var ProductionBOMHeader: Record "Production BOM Header"; xProductionBOMHeader: Record "Production BOM Header"; var ProductionBOMLine: Record "Production BOM Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateStatusOnBeforeConfirm(var ProductionBOMHeader: Record "Production BOM Header"; xProductionBOMHeader: Record "Production BOM Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeOnValidateStatus(var ProductionBOMHeader: Record "Production BOM Header"; var xProductionBOMHeader: Record "Production BOM Header"; var IsHandled: Boolean)
    begin
    end;
}