Page 6520 Item Tracing

App
Base Application
Namespace
Microsoft.Inventory.Tracking
Versions
17-28
Source table
6520

Procedures, 5Events, 6

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Tracking/ItemTracing.Page.al805 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.Tracking;

using Microsoft.Foundation.Navigate;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Reports;
using System.Security.User;

page 6520 "Item Tracing"
{
    AdditionalSearchTerms = 'serial number,lot number,expiration,fefo,item tracking,fda,defect';
    ApplicationArea = ItemTracking;
    Caption = 'Item Tracing';
    DeleteAllowed = false;
    InsertAllowed = false;
    ModifyAllowed = false;
    PageType = Worksheet;
    AboutTitle = 'About Item Tracing';
    AboutText = 'Trace the complete history and movement of item-tracked inventory by serial, lot, or package number, viewing all related posted transactions from origin to usage or vice versa to support quality control, compliance, and recall management.';
    SourceTable = "Item Tracing Buffer";
    SourceTableTemporary = true;
    UsageCategory = Tasks;

    layout
    {
        area(content)
        {
            group(General)
            {
                Caption = 'General';
                field(SerialNoFilter; SerialNoFilter)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Serial No. Filter';
                    ToolTip = 'Specifies the serial number or a filter on the serial numbers that you would like to trace.';
                    ExtendedDatatype = Barcode;

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        SerialNoInfo: Record "Serial No. Information";
                        SerialNoList: Page "Serial No. Information List";
                    begin
                        SerialNoInfo.Reset();

                        Clear(SerialNoList);
                        SerialNoList.SetTableView(SerialNoInfo);
                        if SerialNoList.RunModal() = ACTION::LookupOK then
                            SerialNoFilter := SerialNoList.GetSelectionFilter();
                    end;
                }
                field(LotNoFilter; LotNoFilter)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Lot No. Filter';
                    ToolTip = 'Specifies the lot number or a filter on the lot numbers that you would like to trace.';
                    ExtendedDatatype = Barcode;

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        LotNoInfo: Record "Lot No. Information";
                        LotNoList: Page "Lot No. Information List";
                    begin
                        LotNoInfo.Reset();

                        Clear(LotNoList);
                        LotNoList.SetTableView(LotNoInfo);
                        if LotNoList.RunModal() = ACTION::LookupOK then
                            LotNoFilter := LotNoList.GetSelectionFilter();
                    end;
                }
                field(PackageNoFilter; PackageNoFilter)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Package No. Filter';
                    CaptionClass = '6,3';
                    ToolTip = 'Specifies the package number or a filter on the package numbers that you would like to trace.';
                    ExtendedDatatype = Barcode;

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        PackageNoInfo: Record "Package No. Information";
                        PackageNoInfoList: Page "Package No. Information List";
                    begin
                        PackageNoInfo.Reset();

                        Clear(PackageNoInfoList);
                        PackageNoInfoList.SetTableView(PackageNoInfo);
                        if PackageNoInfoList.RunModal() = ACTION::LookupOK then
                            PackageNoFilter := PackageNoInfoList.GetSelectionFilter();
                    end;
                }
                field(ItemNoFilter; ItemNoFilter)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Item Filter';
                    ToolTip = 'Specifies the item number or a filter on the item numbers that you would like to trace.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        Item: Record Item;
                        ItemList: Page "Item List";
                    begin
                        Item.Reset();

                        Clear(ItemList);
                        ItemList.SetTableView(Item);
                        ItemList.LookupMode(true);
                        if ItemList.RunModal() = ACTION::LookupOK then
                            ItemNoFilter := ItemList.GetSelectionFilter();
                    end;

                    trigger OnValidate()
                    begin
                        if ItemNoFilter = '' then
                            VariantFilter := '';
                    end;
                }
                field(VariantFilter; VariantFilter)
                {
                    ApplicationArea = Planning;
                    Caption = 'Variant Filter';
                    ToolTip = 'Specifies the variant code or a filter on the variant codes that you would like to trace.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        ItemVariant: Record "Item Variant";
                        ItemVariants: Page "Item Variants";
                    begin
                        if ItemNoFilter = '' then
                            Error(Text001);

                        ItemVariant.Reset();

                        Clear(ItemVariants);
                        ItemVariant.SetFilter("Item No.", ItemNoFilter);
                        ItemVariants.SetTableView(ItemVariant);
                        ItemVariants.LookupMode(true);
                        if ItemVariants.RunModal() = ACTION::LookupOK then begin
                            ItemVariants.GetRecord(ItemVariant);
                            VariantFilter := ItemVariant.Code;
                        end;
                    end;

                    trigger OnValidate()
                    begin
                        if ItemNoFilter = '' then
                            Error(Text001);
                    end;
                }
                field(ShowComponents; ShowComponents)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Show Components';
                    OptionCaption = 'No,Item-tracked Only,All';
                    ToolTip = 'Specifies if you would like to see the components of the item that you are tracing.';
                }
                field(TraceMethod; TraceMethod)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Trace Method';
                    OptionCaption = 'Origin -> Usage,Usage -> Origin';
                    ToolTip = 'Specifies posted serial, lot or package numbers that can be traced either forward or backward in a supply chain.';
                }
            }
            label(Control35)
            {
                ApplicationArea = ItemTracking;
                CaptionClass = Format(TraceText);
                Editable = false;
                ShowCaption = false;
                ToolTip = 'Specifies the text that is used to trace the item.';
            }
            repeater(Control1)
            {
                IndentationColumn = DescriptionIndent;
                IndentationControls = Description;
                ShowAsTree = true;
                ShowCaption = false;
                field(Description; Rec.Description)
                {
                    ApplicationArea = ItemTracking;
                }
                field("Entry Type"; Rec."Entry Type")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
                field("Serial No."; Rec."Serial No.")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                    Style = Strong;
                }
                field("Lot No."; Rec."Lot No.")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                    Style = Strong;
                }
                field("Package No."; Rec."Package No.")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                    Style = Strong;
                }
                field("Item No."; Rec."Item No.")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                    Style = Strong;
                }
                field("Item Description"; Rec."Item Description")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                }
                field("Variant Code"; Rec."Variant Code")
                {
                    ApplicationArea = Planning;
                    Visible = false;
                }
                field("Document No."; Rec."Document No.")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
                field("Posting Date"; Rec."Posting Date")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
                field("Source Type"; Rec."Source Type")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
                field("Source No."; Rec."Source No.")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                    Visible = false;
                }
                field("Source Name"; Rec."Source Name")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                    Visible = false;
                }
                field("Location Code"; Rec."Location Code")
                {
                    ApplicationArea = ItemTracking;
                    Editable = false;
                }
                field(Quantity; Rec.Quantity)
                {
                    ApplicationArea = ItemTracking;

                    trigger OnDrillDown()
                    var
                        ItemLedgerEntry: Record "Item Ledger Entry";
                    begin
                        ItemLedgerEntry.Reset();
                        ItemLedgerEntry.SetRange("Entry No.", Rec."Item Ledger Entry No.");
                        PAGE.RunModal(0, ItemLedgerEntry);
                    end;
                }
                field("Remaining Quantity"; Rec."Remaining Quantity")
                {
                    ApplicationArea = ItemTracking;
                }
                field("Created by"; Rec."Created by")
                {
                    ApplicationArea = ItemTracking;
                    Lookup = true;
                    Visible = false;

                    trigger OnDrillDown()
                    var
                        UserMgt: Codeunit "User Management";
                    begin
                        UserMgt.DisplayUserInformation(Rec."Created by");
                    end;
                }
                field("Created on"; Rec."Created on")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
                field("Already Traced"; Rec."Already Traced")
                {
                    ApplicationArea = ItemTracking;
                }
                field("Item Ledger Entry No."; Rec."Item Ledger Entry No.")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
                field("Parent Item Ledger Entry No."; Rec."Parent Item Ledger Entry No.")
                {
                    ApplicationArea = ItemTracking;
                    Visible = false;
                }
            }
        }
    }

    actions
    {
        area(navigation)
        {
            group(Line)
            {
                Caption = '&Line';
                Image = Line;
                action(ShowDocument)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Show Document';
                    Image = View;
                    ShortCutKey = 'Shift+F7';
                    ToolTip = 'Open the document that the selected line exists on.';

                    trigger OnAction()
                    begin
                        ItemTracingMgt.ShowDocument(Rec."Record Identifier");
                    end;
                }
            }
            group(Item)
            {
                Caption = '&Item';
                Image = Item;
                action(Card)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Card';
                    Image = EditLines;
                    RunObject = Page "Item Card";
                    RunPageLink = "No." = field("Item No.");
                    ShortCutKey = 'Shift+F7';
                    ToolTip = 'View or change detailed information about the record on the document or journal line.';
                }
                action(LedgerEntries)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Ledger E&ntries';
                    Image = CustomerLedger;
                    RunObject = Page "Item Ledger Entries";
                    RunPageLink = "Item No." = field("Item No.");
                    RunPageView = sorting("Item No.");
                    ShortCutKey = 'Ctrl+F7';
                    ToolTip = 'View the history of transactions that have been posted for the selected record.';
                }
            }
            group("Item Tracking")
            {
                Caption = 'Item Tracking';
                Image = ItemTrackingLines;
                action("Serial No. Information Card")
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Serial No. Information Card';
                    Image = SNInfo;
                    ToolTip = 'View or edit detailed information about the serial number.';

                    trigger OnAction()
                    var
                        SerialNoInformation: Record "Serial No. Information";
                        TrackingSpecification: Record "Tracking Specification";
                    begin
                        Rec.TestField("Serial No.");
                        GetTrackingSpecification(TrackingSpecification);
                        SerialNoInformation.ShowCard(Rec."Serial No.", TrackingSpecification);
                    end;
                }
                action("Lot No. Information Card")
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Lot No. Information Card';
                    Image = LotInfo;
                    ToolTip = 'View or edit detailed information about the lot number.';

                    trigger OnAction()
                    var
                        LotNoInformation: Record "Lot No. Information";
                        TrackingSpecification: Record "Tracking Specification";
                    begin
                        Rec.TestField("Lot No.");
                        GetTrackingSpecification(TrackingSpecification);
                        LotNoInformation.ShowCard(Rec."Lot No.", TrackingSpecification);
                    end;
                }
                action("Package No. Information Card")
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Package No. Information Card';
                    Image = LotInfo;
                    ToolTip = 'View or edit detailed information about the package number.';

                    trigger OnAction()
                    var
                        PackageNoInformation: Record "Package No. Information";
                        TrackingSpecification: Record "Tracking Specification";
                    begin
                        Rec.TestField("Package No.");
                        GetTrackingSpecification(TrackingSpecification);
                        PackageNoInformation.ShowCard(Rec."Package No.", TrackingSpecification);
                    end;
                }
            }
        }
        area(processing)
        {
            group(Functions)
            {
                Caption = 'F&unctions';
                Image = "Action";
                action(TraceOppositeFromLine)
                {
                    ApplicationArea = ItemTracking;
                    Caption = '&Trace Opposite - from Line';
                    Enabled = FunctionsEnable;
                    Image = TraceOppositeLine;
                    ToolTip = 'Repeat the previous trace, but going the opposite direction.';

                    trigger OnAction()
                    begin
                        if TraceMethod = TraceMethod::"Origin->Usage" then
                            TraceMethod := TraceMethod::"Usage->Origin"
                        else
                            TraceMethod := TraceMethod::"Origin->Usage";
                        OppositeTraceFromLine();
                    end;
                }
                action(SetFiltersWithLineValues)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Set &Filters with Line Values';
                    Enabled = FunctionsEnable;
                    Image = FilterLines;
                    ToolTip = 'Insert the values of the selected line in the respective filter fields on the header and executes a new trace. This function is useful, for example, when the origin of the defective item is found and that particular trace line must form the basis of additional tracking with the same trace method.';

                    trigger OnAction()
                    begin
                        ItemTracingMgt.InitSearchParm(Rec, SerialNoFilter, LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter);
                    end;
                }
                action("Go to Already-Traced History")
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Go to Already-Traced History';
                    Enabled = FunctionsEnable;
                    Image = MoveUp;
                    ToolTip = 'View the item tracing history.';

                    trigger OnAction()
                    begin
                        SetFocus(Rec."Item Ledger Entry No.");
                    end;
                }
                action(NextTraceResult)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Next Trace Result';
                    Image = NextRecord;
                    ToolTip = 'View the next item transaction in the tracing direction. ';

                    trigger OnAction()
                    begin
                        RecallHistory(1);
                    end;
                }
                action(PreviousTraceResult)
                {
                    ApplicationArea = ItemTracking;
                    Caption = 'Previous Trace Result';
                    Image = PreviousRecord;
                    ToolTip = 'View the previous item transaction in the tracing direction.';

                    trigger OnAction()
                    begin
                        RecallHistory(-1);
                    end;
                }
            }
            action(Print)
            {
                ApplicationArea = ItemTracking;
                Caption = '&Print';
                Ellipsis = true;
                Enabled = PrintEnable;
                Image = Print;
                ToolTip = 'Prepare to print the document. A report request window for the document opens where you can specify what to include on the print-out.';

                trigger OnAction()
                var
                    xItemTracingBuffer: Record "Item Tracing Buffer";
                    PrintTracking: Report "Item Tracing Specification";
                begin
                    Clear(PrintTracking);
                    xItemTracingBuffer.Copy(Rec);
                    PrintTracking.TransferEntries(Rec);
                    Rec.Copy(xItemTracingBuffer);
                    PrintTracking.Run();
                end;
            }
            action(Navigate)
            {
                ApplicationArea = ItemTracking;
                Caption = 'Find entries...';
                Enabled = NavigateEnable;
                Image = Navigate;
                ShortCutKey = 'Ctrl+Alt+Q';
                ToolTip = 'Find entries and documents that exist for the document number and posting date on the selected document. (Formerly this action was named Navigate.)';

                trigger OnAction()
                var
                    ItemTrackingSetup: Record "Item Tracking Setup";
                    Navigate: Page Navigate;
                begin
                    ItemTrackingSetup.CopyTrackingFromItemTracingBuffer(Rec);
                    Navigate.SetTracking(ItemTrackingSetup);
                    Navigate.Run();
                end;
            }
            action(Trace)
            {
                ApplicationArea = ItemTracking;
                Caption = '&Trace';
                Image = Trace;
                ToolTip = 'Trace where a serial, lot or package number assigned to the item was used, for example, to find which lot a defective component came from or to find all the customers that have received items containing the defective component.';

                trigger OnAction()
                begin
                    FindRecords();
                end;
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process', Comment = 'Generated from the PromotedActionCategories property index 1.';

                actionref(Trace_Promoted; Trace)
                {
                }
                actionref(ShowDocument_Promoted; ShowDocument)
                {
                }
                actionref(Navigate_Promoted; Navigate)
                {
                }
                actionref(TraceOppositeFromLine_Promoted; TraceOppositeFromLine)
                {
                }
                actionref(Print_Promoted; Print)
                {
                }
            }
            group(Category_Category4)
            {
                Caption = 'Line', Comment = 'Generated from the PromotedActionCategories property index 3.';

            }
            group(Category_Category5)
            {
                Caption = 'Item', Comment = 'Generated from the PromotedActionCategories property index 4.';

            }
            group(Category_Report)
            {
                Caption = 'Report', Comment = 'Generated from the PromotedActionCategories property index 2.';
            }
        }
    }

    trigger OnAfterGetRecord()
    begin
        DescriptionIndent := 0;
        ItemTracingMgt.SetExpansionStatus(Rec, TempTrackEntry, Rec, ActualExpansionStatus);
        DescriptionOnFormat();
    end;

    trigger OnInit()
    begin
        NavigateEnable := true;
        PrintEnable := true;
        FunctionsEnable := true;
    end;

    trigger OnOpenPage()
    begin
        InitButtons();
        if not FiltersInitialized then begin
            TraceMethod := TraceMethod::"Usage->Origin";
            ShowComponents := ShowComponents::"Item-tracked Only";
        end;
    end;

    var
        TempTrackEntry: Record "Item Tracing Buffer" temporary;
        ItemTracingMgt: Codeunit "Item Tracing Mgt.";
        ActualExpansionStatus: Option "Has Children",Expanded,"No Children";
#pragma warning disable AA0074
        Text001: Label 'Item No. Filter is required.';
#pragma warning restore AA0074
        TraceText: Text;
#pragma warning disable AA0470
        TraceTextTxt: Label 'Serial No.: %1, Lot No.: %2, Package No. %3, Item: %4, Variant: %5, Trace Method: %6, Show Components: %7', Comment = '%1 - Serial No.';
#pragma warning restore AA0470
        PreviousExists: Boolean;
        NextExists: Boolean;
#pragma warning disable AA0074
        Text003: Label 'Filters are too large to show.';
        Text004: Label 'Origin->Usage,Usage->Origin';
        Text005: Label 'No,Item-tracked Only,All';
#pragma warning restore AA0074
        DescriptionIndent: Integer;
        FunctionsEnable: Boolean;
        PrintEnable: Boolean;
        NavigateEnable: Boolean;

    protected var
        SerialNoFilter: Text;
        LotNoFilter: Text;
        PackageNoFilter: Text;
        ItemNoFilter: Text;
        VariantFilter: Text;
        TraceMethod: Option "Origin->Usage","Usage->Origin";
        ShowComponents: Option No,"Item-tracked Only",All;
        FiltersInitialized: Boolean;

    procedure FindRecords()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnFindRecordsOnBeforeItemTracingMgtFindRecords(TempTrackEntry, Rec, SerialNoFilter, LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter, TraceMethod, ShowComponents, IsHandled);
        if not IsHandled then
            ItemTracingMgt.FindRecords(TempTrackEntry, Rec,
              SerialNoFilter, LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter,
              TraceMethod, ShowComponents);
        InitButtons();

        ItemTracingMgt.GetHistoryStatus(PreviousExists, NextExists);

        UpdateTraceText();

        ItemTracingMgt.ExpandAll(TempTrackEntry, Rec);
        OnFindRecordsOnBeforeCurrPageUpdate(Rec);
        CurrPage.Update(false)
    end;

    local procedure OppositeTraceFromLine()
    begin
        ItemTracingMgt.InitSearchParm(Rec, SerialNoFilter, LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter);
        FindRecords();
    end;

    procedure InitButtons()
    begin
        if not TempTrackEntry.FindFirst() then begin
            FunctionsEnable := false;
            PrintEnable := false;
            NavigateEnable := false;
        end else begin
            FunctionsEnable := true;
            PrintEnable := true;
            NavigateEnable := true;
        end;

        OnInitButtons(FunctionsEnable, PrintEnable, NavigateEnable);
    end;

    procedure InitFilters(var ItemTrackingEntry: Record "Item Tracing Buffer")
    begin
        SerialNoFilter := ItemTrackingEntry.GetFilter("Serial No.");
        LotNoFilter := ItemTrackingEntry.GetFilter("Lot No.");
        PackageNoFilter := ItemTrackingEntry.GetFilter("Package No.");
        ItemNoFilter := ItemTrackingEntry.GetFilter("Item No.");
        VariantFilter := ItemTrackingEntry.GetFilter("Variant Code");
        TraceMethod := TraceMethod::"Usage->Origin";
        ShowComponents := ShowComponents::"Item-tracked Only";
        FiltersInitialized := true;

        OnAfterInitFilters(ItemTrackingEntry, TraceMethod, ShowComponents);
    end;

    procedure GetItemFilters(var TraceMethod2: Option "Origin->Usage","Usage->Origin"; var ShowComponents2: Option No,"Item-tracked Only",All; var SerialNoFilter2: Text; var LotNoFilter2: Text; var ItemNoFilter2: Text; var VariantFilter2: Text)
    begin
        TraceMethod2 := TraceMethod;
        ShowComponents2 := ShowComponents;
        SerialNoFilter2 := SerialNoFilter;
        LotNoFilter2 := LotNoFilter;
        ItemNoFilter2 := ItemNoFilter;
        VariantFilter2 := VariantFilter;
    end;

    procedure SetItemFilters(TraceMethod2: Option "Origin->Usage","Usage->Origin"; ShowComponents2: Option No,"Item-tracked Only",All; SerialNoFilter2: Text; LotNoFilter2: Text; ItemNoFilter2: Text; VariantFilter2: Text)
    begin
        TraceMethod := TraceMethod2;
        ShowComponents := ShowComponents2;
        SerialNoFilter := SerialNoFilter2;
        LotNoFilter := LotNoFilter2;
        ItemNoFilter := ItemNoFilter2;
        VariantFilter := VariantFilter2;
    end;

    local procedure RecallHistory(Steps: Integer)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnRecallHistoryOnBeforeItemTracingMgtRecallHistory(Steps, TempTrackEntry, Rec, SerialNoFilter, LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter, TraceMethod, ShowComponents, IsHandled);
        if not IsHandled then
            ItemTracingMgt.RecallHistory(Steps, TempTrackEntry, Rec, SerialNoFilter,
              LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter, TraceMethod, ShowComponents);
        UpdateTraceText();
        InitButtons();
        ItemTracingMgt.GetHistoryStatus(PreviousExists, NextExists);

        ItemTracingMgt.ExpandAll(TempTrackEntry, Rec);
        CurrPage.Update(false);
    end;

    local procedure UpdateTraceText()
    var
        LengthOfText: Integer;
        Overflow: Boolean;
    begin
        LengthOfText := (StrLen(TraceTextTxt + SerialNoFilter + LotNoFilter + PackageNoFilter + ItemNoFilter + VariantFilter) +
                         StrLen(Format(TraceMethod)) + StrLen(Format(ShowComponents)) - 6); // 6 = number of positions in TraceTextTxt

        Overflow := LengthOfText > 512;

        if Overflow then
            TraceText := Text003
        else
            TraceText := StrSubstNo(TraceTextTxt, SerialNoFilter, LotNoFilter, PackageNoFilter, ItemNoFilter, VariantFilter,
                SelectStr(TraceMethod + 1, Text004), SelectStr(ShowComponents + 1, Text005));

        OnAfterUpdateTraceText(TraceText, SerialNoFilter, LotNoFilter, ItemNoFilter, VariantFilter, TraceMethod, ShowComponents);
    end;

    local procedure DescriptionOnFormat()
    begin
        DescriptionIndent := Rec.Level;
    end;

    local procedure SetFocus(ItemLedgerEntryNo: Integer)
    begin
        if Rec."Already Traced" then begin
            TempTrackEntry.SetCurrentKey("Item Ledger Entry No.");
            TempTrackEntry.SetRange("Item Ledger Entry No.", ItemLedgerEntryNo);
            TempTrackEntry.FindFirst();
            CurrPage.SetRecord(TempTrackEntry);
        end;
    end;

    local procedure GetTrackingSpecification(var TrackingSpecification: Record "Tracking Specification")
    var
        ItemTrackingSetup: Record "Item Tracking Setup";
    begin
        ItemTrackingSetup.CopyTrackingFromItemTracingBuffer(Rec);
        TrackingSpecification.SetItemData(Rec."Item No.", '', Rec."Location Code", Rec."Variant Code", '', 0);
        TrackingSpecification.CopyTrackingFromItemTrackingSetup(ItemTrackingSetup);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitFilters(var ItemTracingBuffer: Record "Item Tracing Buffer"; var TraceMethod: Option Forward,Backward; var ShowComponents: Option No,"Item-tracked only",All)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateTraceText(var TraceText: Text; SerialNoFilter: Text; LotNoFilter: Text; ItemNoFilter: Text; VariantFilter: Text; TraceMethod: Option Forward,Backward; ShowComponents: Option No,"Item-tracked only",All)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInitButtons(var FunctionsEnable: Boolean; var PrintEnable: Boolean; var NavigateEnable: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnFindRecordsOnBeforeItemTracingMgtFindRecords(var ItemTracingBuffer: Record "Item Tracing Buffer"; var ItemTracingBufferRec: Record "Item Tracing Buffer"; SerialNoFilter: Text; LotNoFilter: Text; PackageNoFilter: Text; ItemNoFilter: Text; VariantFilter: Text; Direction: Option; ShowComponents: Option; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindRecordsOnBeforeCurrPageUpdate(var ItemTracingBuffer: Record "Item Tracing Buffer" temporary)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnRecallHistoryOnBeforeItemTracingMgtRecallHistory(Steps: Integer; var ItemTracingBuffer: Record "Item Tracing Buffer"; var ItemTracingBufferRec: Record "Item Tracing Buffer"; var SerialNoFilter: Text; var LotNoFilter: Text; var PackageNoFilter: Text; var ItemNoFilter: Text; var VariantFilter: Text; var TraceMethod: Option; var ShowComponents: Option; var IsHandled: Boolean)
    begin
    end;
}