Report 6562 Calc. Invt. Doc. Whse. Adjmt.

App
Base Application
Namespace
Microsoft.Inventory.Document
Versions
18-28

Procedures, 4

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Document/CalcInvtDocWhseAdjmt.Report.al299 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.Document;

using Microsoft.Foundation.AuditCodes;
using Microsoft.Inventory.Counting.Journal;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Journal;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Warehouse.Ledger;
using System.Utilities;

report 6562 "Calc. Invt. Doc. Whse. Adjmt."
{
    Caption = 'Calc. Invt. Doc. Whse. Adjmt.';
    ProcessingOnly = true;

    dataset
    {
        dataitem(Item; Item)
        {
            DataItemTableView = sorting("No.");
            RequestFilterFields = "No.", "Location Filter", "Variant Filter";
            dataitem("Integer"; "Integer")
            {
                DataItemTableView = sorting(Number) where(Number = const(1));

                trigger OnAfterGetRecord()
                begin
                    WhseEntry.SetRange("Location Code", InvtDocHeader."Location Code");
                    WhseEntry.SetRange("Bin Code", InvtDocHeader."Whse. Adj. Bin Code");
                    if WhseEntry.FindSet() then
                        repeat
                            if WhseEntry."Qty. (Base)" <> 0 then begin
                                TempInventoryBuffer.Reset();
                                TempInventoryBuffer.SetRange("Item No.", WhseEntry."Item No.");
                                TempInventoryBuffer.SetRange("Variant Code", WhseEntry."Variant Code");
                                TempInventoryBuffer.SetRange("Location Code", WhseEntry."Location Code");
                                TempInventoryBuffer.SetRange("Bin Code", WhseEntry."Bin Code");
                                if WhseEntry."Lot No." <> '' then
                                    TempInventoryBuffer.SetRange("Lot No.", WhseEntry."Lot No.");
                                if WhseEntry."Serial No." <> '' then
                                    TempInventoryBuffer.SetRange("Serial No.", WhseEntry."Serial No.");
                                if TempInventoryBuffer.FindFirst() then begin
                                    TempInventoryBuffer.Quantity := TempInventoryBuffer.Quantity + WhseEntry."Qty. (Base)";
                                    TempInventoryBuffer.Modify();
                                end else begin
                                    TempInventoryBuffer."Item No." := WhseEntry."Item No.";
                                    TempInventoryBuffer."Variant Code" := WhseEntry."Variant Code";
                                    TempInventoryBuffer."Location Code" := WhseEntry."Location Code";
                                    TempInventoryBuffer."Bin Code" := WhseEntry."Bin Code";
                                    TempInventoryBuffer."Lot No." := WhseEntry."Lot No.";
                                    TempInventoryBuffer."Serial No." := WhseEntry."Serial No.";
                                    TempInventoryBuffer.Quantity := WhseEntry."Qty. (Base)";
                                    TempInventoryBuffer.Insert();
                                end;
                            end;
                        until WhseEntry.Next() = 0;
                end;

                trigger OnPostDataItem()
                begin
                    TempInventoryBuffer.Reset();
                    TempInventoryBuffer.SetCurrentKey("Location Code", "Variant Code", Quantity);
                    if TempInventoryBuffer.FindSet() then
                        repeat
                            if TempInventoryBuffer."Location Code" <> '' then
                                TempInventoryBuffer.SetRange("Location Code", TempInventoryBuffer."Location Code");
                            TempInventoryBuffer.SetRange("Variant Code", TempInventoryBuffer."Variant Code");

                            case InvtDocHeader."Document Type" of
                                InvtDocHeader."Document Type"::Receipt:
                                    begin
                                        TempInventoryBuffer.SetFilter(Quantity, '>0');
                                        TempInventoryBuffer.CalcSums(Quantity);
                                        WhseQty := -TempInventoryBuffer.Quantity;
                                        if WhseQty <> 0 then begin
                                            TempInventoryBuffer.FindFirst();
                                            InsertInvtDocLine(
                                              TempInventoryBuffer."Item No.", TempInventoryBuffer."Variant Code", TempInventoryBuffer."Location Code",
                                              WhseQty, Item."Base Unit of Measure",
                                              InvtDocLine."Document Type"::Shipment);
                                        end;
                                    end;
                                InvtDocHeader."Document Type"::Shipment:
                                    begin
                                        TempInventoryBuffer.SetFilter(Quantity, '<0');
                                        TempInventoryBuffer.CalcSums(Quantity);
                                        WhseQty := -TempInventoryBuffer.Quantity;
                                        if WhseQty <> 0 then begin
                                            TempInventoryBuffer.FindFirst();
                                            InsertInvtDocLine(
                                              TempInventoryBuffer."Item No.", TempInventoryBuffer."Variant Code", TempInventoryBuffer."Location Code",
                                              WhseQty, Item."Base Unit of Measure",
                                              InvtDocLine."Document Type"::Shipment);
                                        end;
                                    end;
                            end;

                            TempInventoryBuffer.SetRange(Quantity);
                            TempInventoryBuffer.FindLast();
                            TempInventoryBuffer.SetRange("Location Code");
                            TempInventoryBuffer.SetRange("Variant Code");
                        until TempInventoryBuffer.Next() = 0;
                    TempInventoryBuffer.Reset();
                    TempInventoryBuffer.DeleteAll();
                end;

                trigger OnPreDataItem()
                begin
                    Clear(Location);
                    WhseEntry.Reset();
                    WhseEntry.SetCurrentKey("Item No.", "Bin Code", "Location Code", "Variant Code");
                    WhseEntry.Ascending(false);
                    WhseEntry.SetRange("Item No.", Item."No.");
                    Item.CopyFilter("Variant Filter", WhseEntry."Variant Code");

                    if WhseEntry.IsEmpty() then
                        CurrReport.Break();

                    TempInventoryBuffer.Reset();
                    TempInventoryBuffer.DeleteAll();

                    WhseQty := 0;
                end;
            }

            trigger OnAfterGetRecord()
            begin
                if not HideValidationDialog then
                    Window.Update();
            end;

            trigger OnPreDataItem()
            begin
                NextLineNo := 0;

                if not HideValidationDialog then
                    Window.Open(ProcessingItemsTxt, Item."No.");

                if GetFilter("Location Filter") <> '' then
                    ByLocation := true;
            end;
        }
    }

    requestpage
    {
        Caption = 'Calculate Inventory';
        SaveValues = true;

        layout
        {
        }

        actions
        {
        }
    }

    labels
    {
    }

    trigger OnInitReport()
    begin
        ByLocation := true;
        ByBin := false;
    end;

    var
        InvtDocHeader: Record "Invt. Document Header";
        InvtDocLine: Record "Invt. Document Line";
        WhseEntry: Record "Warehouse Entry";
        Location: Record Location;
        SourceCodeSetup: Record "Source Code Setup";
        TempInventoryBuffer: Record "Inventory Buffer" temporary;
        Window: Dialog;
        WhseQty: Decimal;
        NextLineNo: Integer;
        ByLocation: Boolean;
        ByBin: Boolean;
        ZeroQty: Boolean;
        HideValidationDialog: Boolean;
        ProcessingItemsTxt: Label 'Processing items    #1##########', Comment = '#1 - item counter';

    procedure SetInvtDocHeader(var NewInvtDocHeader: Record "Invt. Document Header")
    begin
        InvtDocHeader := NewInvtDocHeader;
        InvtDocHeader.TestField("Location Code");
        Location.Get(InvtDocHeader."Location Code");
        Location.TestField("Directed Put-away and Pick", true);
        Item.SetRange("Location Filter", InvtDocHeader."Location Code");
        InvtDocHeader.TestField("Whse. Adj. Bin Code");
    end;

    procedure InsertInvtDocLine(ItemNo: Code[20]; VariantCode2: Code[10]; LocationCode2: Code[10]; Quantity2: Decimal; UOM2: Code[10]; EntryType2: Enum "Invt. Doc. Document Type")
    var
        Location2: Record Location;
        WhseEntry2: Record "Warehouse Entry";
        WhseEntry3: Record "Warehouse Entry";
        ReservEntry: Record "Reservation Entry";
        CreateReservEntry: Codeunit "Create Reserv. Entry";
    begin
        if NextLineNo = 0 then begin
            InvtDocLine.LockTable();
            InvtDocLine.SetRange("Document Type", InvtDocLine."Document Type");
            InvtDocLine.SetRange("Document No.", InvtDocLine."Document No.");
            if InvtDocLine.FindLast() then
                NextLineNo := InvtDocLine."Line No.";

            SourceCodeSetup.Get();
        end;
        NextLineNo := NextLineNo + 10000;

        if Quantity2 <> 0 then begin
            InvtDocLine.Init();
            InvtDocLine."Line No." := NextLineNo;
            InvtDocLine.Validate("Posting Date", InvtDocHeader."Posting Date");
            InvtDocLine.Validate("Document Type", InvtDocHeader."Document Type");
            InvtDocLine.Validate("Document No.", InvtDocHeader."No.");
            InvtDocLine.Validate("Item No.", ItemNo);
            InvtDocLine.Validate("Variant Code", VariantCode2);
            InvtDocLine.Validate("Location Code", LocationCode2);
            if InvtDocHeader."Document Type" = InvtDocHeader."Document Type"::Receipt then
                InvtDocLine.Validate("Source Code", SourceCodeSetup."Invt. Receipt")
            else
                InvtDocLine.Validate("Source Code", SourceCodeSetup."Invt. Shipment");
            InvtDocLine.Validate("Unit of Measure Code", UOM2);
            if LocationCode2 <> '' then
                Location2.Get(LocationCode2);
            InvtDocLine.Validate(Quantity, Abs(Quantity2));
            InvtDocLine.Insert(true);

            if Location2.Code <> '' then
                if Location2."Directed Put-away and Pick" then begin
                    WhseEntry2.SetCurrentKey(
                      "Item No.", "Bin Code", "Location Code", "Variant Code", "Unit of Measure Code",
                      "Lot No.", "Serial No.", "Entry Type");
                    WhseEntry2.SetRange("Item No.", InvtDocLine."Item No.");
                    WhseEntry2.SetRange("Bin Code", Location2."Adjustment Bin Code");
                    WhseEntry2.SetRange("Location Code", InvtDocLine."Location Code");
                    WhseEntry2.SetRange("Variant Code", InvtDocLine."Variant Code");
                    WhseEntry2.SetRange("Unit of Measure Code", InvtDocLine."Unit of Measure Code");
                    WhseEntry2.SetRange("Entry Type", EntryType2);
                    if WhseEntry2.FindSet() then
                        repeat
                            WhseEntry2.SetRange("Lot No.", WhseEntry2."Lot No.");
                            WhseEntry2.SetRange("Serial No.", WhseEntry2."Serial No.");
                            WhseEntry2.CalcSums("Qty. (Base)");

                            WhseEntry3.SetCurrentKey(
                              "Item No.", "Bin Code", "Location Code", "Variant Code", "Unit of Measure Code",
                              "Lot No.", "Serial No.", "Entry Type");
                            WhseEntry3.CopyFilters(WhseEntry2);
                            case EntryType2 of
                                EntryType2::Receipt:
                                    WhseEntry3.SetRange("Entry Type", WhseEntry3."Entry Type"::"Negative Adjmt.");
                                EntryType2::Shipment:
                                    WhseEntry3.SetRange("Entry Type", WhseEntry3."Entry Type"::"Positive Adjmt.");
                            end;
                            WhseEntry3.CalcSums("Qty. (Base)");
                            if Abs(WhseEntry3."Qty. (Base)") > Abs(WhseEntry2."Qty. (Base)") then
                                WhseEntry2."Qty. (Base)" := 0
                            else
                                WhseEntry2."Qty. (Base)" := WhseEntry2."Qty. (Base)" + WhseEntry3."Qty. (Base)";

                            if WhseEntry2."Qty. (Base)" <> 0 then begin
                                ReservEntry.CopyTrackingFromWhseEntry(WhseEntry2);
                                CreateReservEntry.CreateReservEntryFor(
                                  Database::"Item Journal Line", InvtDocLine."Document Type".AsInteger(), InvtDocLine."Document No.", '', 0, InvtDocLine."Line No.",
                                  InvtDocLine."Qty. per Unit of Measure", Abs(WhseEntry2.Quantity), Abs(WhseEntry2."Qty. (Base)"), ReservEntry);
                                CreateReservEntry.CreateEntry(
                                  InvtDocLine."Item No.", InvtDocLine."Variant Code", InvtDocLine."Location Code", InvtDocLine.Description, 0D, 0D, 0, "Reservation Status"::Prospect);
                            end;
                            WhseEntry2.FindLast();
                            WhseEntry2.ClearTrackingFilter();
                        until WhseEntry2.Next() = 0;
                end;
        end;
    end;

    procedure InitializeRequest(NewZeroQty: Boolean; NewByLocation: Boolean; NewByBin: Boolean)
    begin
        ZeroQty := NewZeroQty;
        ByLocation := NewByLocation;
        ByBin := NewByBin;
    end;

    procedure SetHideValidationDialog(NewHideValidationDialog: Boolean)
    begin
        HideValidationDialog := NewHideValidationDialog;
    end;
}