Report 5757 Items with Negative Inventory

App
Base Application
Namespace
Microsoft.Inventory.Reports
Versions
17-28
Obsolete
Pending 28.0, seen from 28. This report is deprecated and will be removed in a future release.

Procedures, 1Obsolete, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Reports/ItemswithNegativeInventory.Report.al349 lines, Copyright (c) Microsoft Corporation. MIT

#if not CLEAN28
// ------------------------------------------------------------------------------------------------
// 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.Reports;

using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
using Microsoft.Warehouse.Activity;
using Microsoft.Warehouse.Document;
using Microsoft.Warehouse.Worksheet;
using System.Utilities;

report 5757 "Items with Negative Inventory"
{
    Caption = 'Items with Negative Inventory (Obsolete)';
    DataAccessIntent = ReadOnly;
    ObsoleteReason = 'This report is deprecated and will be removed in a future release.';
    ObsoleteState = Pending;
    ObsoleteTag = '28.0';
    DefaultRenderingLayout = RDLCLayout;
    dataset
    {
        dataitem(Output; "Integer")
        {
            DataItemTableView = sorting(Number);
            column(TodayFormatted; Format(Today, 0, 4))
            {
            }
            column(CompanyName; CompanyProperty.DisplayName())
            {
            }
            column(LocationCode; StrSubstNo('%1: %2', TempItemLedgerEntry.FieldCaption("Location Code"), LocationToCheckCode))
            {
            }
            column(ItemLedgEntryBufferItemNo; TempItemLedgerEntry."Item No.")
            {
            }
            column(ItemLedgEntryBufferRemainQty; TempItemLedgerEntry."Remaining Quantity")
            {
                DecimalPlaces = 0 : 5;
            }
            column(ItemLedgEntryBufferPackageNo; TempItemLedgerEntry."Package No.")
            {
            }
            column(ItemLedgEntryBufferLotNo; TempItemLedgerEntry."Lot No.")
            {
            }
            column(ItemLedgEntryBufferSerialNo; TempItemLedgerEntry."Serial No.")
            {
            }
            column(ItemLedgEntryBufferUOMCode; TempItemLedgerEntry."Unit of Measure Code")
            {
            }
            column(ItemLedgEntryBufferDesc; TempItemLedgerEntry.Description)
            {
            }
            column(ItemLedgEntryBufferVariantCode; TempItemLedgerEntry."Variant Code")
            {
            }
            column(Check_on_Negative_InventoryCaption; Items_with_Negative_InventoryLbl)
            {
            }
            column(CurrReport_PAGENOCaption; CurrReport_PAGENOCaptionLbl)
            {
            }
            column(ItemLedgEntryBufferRemainQtyCaption; ItemLedgerEntryBufferRemainQtyCaption)
            {
            }
            column(ItemLedgEntryBufferPackageNoCaption; ItemLedgerEntryBufferPackageNoCaption)
            {
            }
            column(ItemLedgEntryBufferLotNoCaption; ItemLedgerEntryBufferLotNoCaption)
            {
            }
            column(ItemLedgEntryBufferSerialNoCaption; ItemLedgerEntryBufferSerialNoCaption)
            {
            }
            column(ItemLedgEntryBufferUOMCodeCaption; ItemLedgerEntryBufferUOMCodeCaption)
            {
            }
            column(ItemLedgEntryBufferDescCaption; ItemLedgerEntryBufferDescCaption)
            {
            }
            column(ItemLedgEntryBufferVariantCodeCaption; ItemLedgerEntryBufferVariantCodeCaption)
            {
            }
            column(ItemLedgEntryBufferItemNoCaption; ItemLedgerEntryBufferItemNoCaption)
            {
            }

            trigger OnAfterGetRecord()
            var
                Item: Record Item;
                ItemVariant: Record "Item Variant";
            begin
                if TempItemLedgerEntryCounter = 0 then
                    TempItemLedgerEntry.Description := NoNegativeInventoryLbl
                else begin
                    if Number = 1 then
                        TempItemLedgerEntry.Find('-')
                    else
                        TempItemLedgerEntry.Next();

                    if TempItemLedgerEntry.Description = '' then
                        if TempItemLedgerEntry."Variant Code" <> '' then begin
                            ItemVariant.SetLoadFields(Description);
                            ItemVariant.Get(TempItemLedgerEntry."Item No.", TempItemLedgerEntry."Variant Code");
                            TempItemLedgerEntry.Description := ItemVariant.Description;
                        end else begin
                            Item.SetLoadFields(Description);
                            Item.Get(TempItemLedgerEntry."Item No.");
                            TempItemLedgerEntry.Description := Item.Description;
                        end;
                end;
            end;

            trigger OnPreDataItem()
            begin
                TempItemLedgerEntry.SetCurrentKey("Item No.", "Location Code", Open, "Variant Code", "Unit of Measure Code", "Lot No.", "Package No.", "Serial No.");

                TempItemLedgerEntryCounter := TempItemLedgerEntry.Count();
                if TempItemLedgerEntryCounter = 0 then
                    SetRange(Number, 1)
                else
                    SetRange(Number, 1, TempItemLedgerEntryCounter);

                ItemLedgerEntryBufferRemainQtyCaption := TempItemLedgerEntry.FieldCaption(Quantity);
                ItemLedgerEntryBufferLotNoCaption := TempItemLedgerEntry.FieldCaption("Lot No.");
                ItemLedgerEntryBufferPackageNoCaption := TempItemLedgerEntry.FieldCaption("Package No.");
                ItemLedgerEntryBufferSerialNoCaption := TempItemLedgerEntry.FieldCaption("Serial No.");
                ItemLedgerEntryBufferUOMCodeCaption := TempItemLedgerEntry.FieldCaption("Unit of Measure Code");
                ItemLedgerEntryBufferDescCaption := TempItemLedgerEntry.FieldCaption("Description");
                ItemLedgerEntryBufferVariantCodeCaption := TempItemLedgerEntry.FieldCaption("Variant Code");
                ItemLedgerEntryBufferItemNoCaption := TempItemLedgerEntry.FieldCaption("Item No.");
            end;
        }
        dataitem(ErrorLoop; "Integer")
        {
            DataItemTableView = sorting(Number);
            column(ErrorTextNumber; ErrorText[Number])
            {
            }
            column(ErrorTextNumberCaption; ErrorTextNumberCaptionLbl)
            {
            }

            trigger OnPostDataItem()
            begin
                ErrorCounter := 0;
            end;

            trigger OnPreDataItem()
            begin
                SetRange(Number, 1, ErrorCounter);
            end;
        }
    }

    requestpage
    {
        AboutTitle = 'About Items with Negative Inventory (Obsolete)';
        AboutText = '** This report is obsolete and will be removed in a future release.** Please refer to the report documentation for alternative ways to retrieve this information.';
        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
                    field(LocationCode; LocationToCheckCode)
                    {
                        ApplicationArea = Location;
                        Caption = 'Location Code';
                        ShowMandatory = true;
                        ToolTip = 'Specifies the location for items with negative inventory.';

                        trigger OnLookup(var Text: Text): Boolean
                        var
                            Location: Record Location;
                        begin
                            if LocationToCheckCode <> '' then
                                Location.Code := LocationToCheckCode;
                            if Page.RunModal(0, Location) = Action::LookupOK then
                                LocationToCheckCode := Location.Code;
                        end;

                        trigger OnValidate()
                        var
                            Location: Record Location;
                        begin
                            Location.SetLoadFields(Code);
                            Location.Get(LocationToCheckCode);
                        end;
                    }
                }
            }
        }
    }

    rendering
    {
        layout(RDLCLayout)
        {
            Type = RDLC;
            LayoutFile = './Inventory/Reports/ItemswithNegativeInventory.rdlc';
            Summary = 'Report layout made in the legacy RDLC format. Use an RDLC editor to modify the layout.';
        }
    }

    trigger OnPreReport()
    var
        ItemLedgerEntry: Record "Item Ledger Entry";
        GroupedItemLedgerEntries: Query "Grouped Item Ledger Entries";
        LastItemNoUsed: Code[20];
    begin
        if LocationToCheckCode = '' then
            Error(NoLocationCodeErr);

        Window.Open(StrSubstNo(ProcessingTxt, ItemLedgerEntry.FieldCaption("Location Code"), LocationToCheckCode) + ItemNoInProgressTxt);
        LastItemNoUsed := '';

        GroupedItemLedgerEntries.SetRange(Location_Code, LocationToCheckCode);
        GroupedItemLedgerEntries.Open();
        while GroupedItemLedgerEntries.Read() do begin
            if LastItemNoUsed <> GroupedItemLedgerEntries.Item_No then begin
                Window.Update(100, GroupedItemLedgerEntries.Item_No);
                LastItemNoUsed := GroupedItemLedgerEntries.Item_No;
            end;

            if GroupedItemLedgerEntries.Remaining_Quantity < 0 then begin
                ItemLedgerEntry.SetCurrentKey("Item No.", "Location Code", Open, "Variant Code", "Unit of Measure Code", "Lot No.", "Package No.", "Serial No.");
                ItemLedgerEntry.SetRange("Location Code", GroupedItemLedgerEntries.Location_Code);
                ItemLedgerEntry.SetRange(Open, true);
                ItemLedgerEntry.SetFilter("Item No.", GroupedItemLedgerEntries.Item_No);
                ItemLedgerEntry.SetFilter("Variant Code", GroupedItemLedgerEntries.Variant_Code);
                ItemLedgerEntry.SetFilter("Unit of Measure Code", GroupedItemLedgerEntries.Unit_of_Measure_Code);
                ItemLedgerEntry.SetFilter("Lot No.", GroupedItemLedgerEntries.Lot_No_);
                ItemLedgerEntry.SetFilter("Package No.", GroupedItemLedgerEntries.Package_No_);
                ItemLedgerEntry.SetFilter("Serial No.", GroupedItemLedgerEntries.Serial_No_);
                if ItemLedgerEntry.FindFirst() then begin
                    TempItemLedgerEntry := ItemLedgerEntry;
                    TempItemLedgerEntry."Remaining Quantity" := GroupedItemLedgerEntries.Remaining_Quantity;
                    TempItemLedgerEntry.Insert();
                end;
            end;
        end;

        Window.Close();

        CheckForErrors();
    end;

    var
        TempItemLedgerEntry: Record "Item Ledger Entry" temporary;
        LocationToCheckCode: Code[10];
        Window: Dialog;
        TempItemLedgerEntryCounter: Integer;
        ErrorCounter: Integer;
        ErrorText: array[5] of Text[250];
        ItemLedgerEntryBufferRemainQtyCaption: Text;
        ItemLedgerEntryBufferPackageNoCaption: Text;
        ItemLedgerEntryBufferLotNoCaption: Text;
        ItemLedgerEntryBufferSerialNoCaption: Text;
        ItemLedgerEntryBufferUOMCodeCaption: Text;
        ItemLedgerEntryBufferDescCaption: Text;
        ItemLedgerEntryBufferVariantCodeCaption: Text;
        ItemLedgerEntryBufferItemNoCaption: Text;
        NoLocationCodeErr: Label 'Enter a location code.';
        ProcessingTxt: Label 'Checking %1 %2 for negative inventory...\\', Comment = '%1: Location Code caption, %2: Location Code value';
        ItemNoInProgressTxt: Label 'Processing item number #100##################.', Comment = '#100 - Item No.';
        NoNegativeInventoryLbl: Label 'No negative inventory was found.';
        Items_with_Negative_InventoryLbl: Label 'Items with Negative Inventory';
        CurrReport_PAGENOCaptionLbl: Label 'Page';
        ErrorTextNumberCaptionLbl: Label 'Error!';
        WarehouseDocumentExistsLbl: Label 'A %1 exists for %2 %3. It must be either posted or deleted before running the Create Whse. Location batch job.', Comment = '%1: Table caption, %2: Location Code caption, %3: Location Code value';
        WarehouseActivityHeaderExistsLbl: Label 'A %1 exists for %2 %3. It must be either registered or deleted before running the Create Whse. Location batch job.', Comment = '%1: Warehouse Activity Type, %2: Location Code caption, %3: Location Code value';
        WhseWorksheetLineExistsLbl: Label 'A %1 exists for %2 %3. It must be deleted before running the Create Whse. Location batch job.', Comment = '%1: Table caption, %2: Location Code caption, %3: Location Code value';

    local procedure CheckForErrors()
    var
        WarehouseReceiptHeader: Record "Warehouse Receipt Header";
        WarehouseShipmentHeader: Record "Warehouse Shipment Header";
        WarehouseActivityHeader: Record "Warehouse Activity Header";
        WhseWorksheetLine: Record "Whse. Worksheet Line";
    begin
        ErrorCounter := 0;
        WarehouseReceiptHeader.SetRange("Location Code", LocationToCheckCode);
        if not WarehouseReceiptHeader.IsEmpty() then
            AddError(
              StrSubstNo(
                WarehouseDocumentExistsLbl,
                WarehouseReceiptHeader.TableCaption(),
                WarehouseReceiptHeader.FieldCaption("Location Code"),
                LocationToCheckCode));

        WarehouseShipmentHeader.SetRange("Location Code", LocationToCheckCode);
        if not WarehouseShipmentHeader.IsEmpty() then
            AddError(
              StrSubstNo(
                WarehouseDocumentExistsLbl,
                WarehouseShipmentHeader.TableCaption(),
                WarehouseShipmentHeader.FieldCaption("Location Code"),
                LocationToCheckCode));

        WarehouseActivityHeader.SetRange("Location Code", LocationToCheckCode);
        WarehouseActivityHeader.SetRange(Type, WarehouseActivityHeader.Type::"Put-away");
        if not WarehouseActivityHeader.IsEmpty() then
            AddError(
              StrSubstNo(
                WarehouseActivityHeaderExistsLbl,
                WarehouseActivityHeader.Type,
                WarehouseActivityHeader.FieldCaption("Location Code"),
                LocationToCheckCode));

        WarehouseActivityHeader.SetRange("Location Code", LocationToCheckCode);
        WarehouseActivityHeader.SetRange(Type, WarehouseActivityHeader.Type::"Pick");
        if not WarehouseActivityHeader.IsEmpty() then
            AddError(
              StrSubstNo(
                WarehouseActivityHeaderExistsLbl,
                WarehouseActivityHeader.Type,
                WarehouseActivityHeader.FieldCaption("Location Code"),
                LocationToCheckCode));

        WhseWorksheetLine.SetRange("Location Code", LocationToCheckCode);
        if not WhseWorksheetLine.IsEmpty() then
            AddError(
              StrSubstNo(
                WhseWorksheetLineExistsLbl,
                WhseWorksheetLine.TableCaption(),
                WhseWorksheetLine.FieldCaption("Location Code"),
                LocationToCheckCode));
    end;

    local procedure AddError(Text: Text[250])
    begin
        ErrorCounter := ErrorCounter + 1;
        ErrorText[ErrorCounter] := Text;
    end;

    procedure InitializeRequest(NewLocCode: Code[10])
    begin
        LocationToCheckCode := NewLocCode;
    end;
}
#endif