Report 790 Calculate Inventory, source in 29
Source29
src/Layers/W1/BaseApp/Inventory/Counting/Journal/CalculateInventory.Report.al1263 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.Counting.Journal;
using Microsoft.Finance.Dimension;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.NoSeries;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Journal;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Warehouse.Ledger;
using Microsoft.Warehouse.Structure;
using System.Utilities;
report 790 "Calculate Inventory"
{
Caption = 'Calculate Inventory';
ProcessingOnly = true;
dataset
{
dataitem(Item; Item)
{
DataItemTableView = sorting("No.") where(Type = const(Inventory), Blocked = const(false));
RequestFilterFields = "No.", "Location Filter", "Bin Filter", "Variant Filter";
dataitem("Item Ledger Entry"; "Item Ledger Entry")
{
DataItemLink = "Item No." = field("No."), "Variant Code" = field("Variant Filter"), "Location Code" = field("Location Filter"), "Global Dimension 1 Code" = field("Global Dimension 1 Filter"), "Global Dimension 2 Code" = field("Global Dimension 2 Filter");
DataItemTableView = sorting("Item No.", "Entry Type", "Variant Code", "Drop Shipment", "Location Code", "Posting Date", "Entry No.");
trigger OnAfterGetRecord()
var
ByBin: Boolean;
ExecuteLoop: Boolean;
InsertTempSKU: Boolean;
IsHandled: Boolean;
begin
if not this.GetLocation("Location Code") then
CurrReport.Skip();
if ("Location Code" <> '') and Location."Use As In-Transit" then
CurrReport.Skip();
if "Item Ledger Entry"."Variant Code" <> '' then
if IsItemVariantBlocked("Item Ledger Entry"."Item No.", "Item Ledger Entry"."Variant Code") then
CurrReport.Skip();
if ColumnDim <> '' then
TransferDim("Dimension Set ID");
if not "Drop Shipment" then
ByBin := Location."Bin Mandatory" and not Location."Directed Put-away and Pick";
IsHandled := false;
OnAfterGetRecordItemLedgEntryOnBeforeUpdateBuffer(Item, "Item Ledger Entry", ByBin, IsHandled);
if IsHandled then
CurrReport.Skip();
if not SkipCycleSKU("Location Code", "Item No.", "Variant Code") then
if ByBin then begin
if not TempSKU.Get("Location Code", "Item No.", "Variant Code") then begin
InsertTempSKU := "Variant Code" = '';
if not InsertTempSKU then
InsertTempSKU := ItemVariantExists("Item No.", "Variant Code");
if InsertTempSKU then begin
TempSKU."Item No." := "Item No.";
TempSKU."Variant Code" := "Variant Code";
TempSKU."Location Code" := "Location Code";
TempSKU.Insert();
ExecuteLoop := true;
end;
end;
if ExecuteLoop then begin
WhseEntry.SetRange("Item No.", "Item No.");
WhseEntry.SetRange("Location Code", "Location Code");
WhseEntry.SetRange("Variant Code", "Variant Code");
OnAfterGetRecordItemLedgEntryOnBeforeWhseEntryFind(WhseEntry, "Item Ledger Entry");
if WhseEntry.Find('-') then
if WhseEntry."Entry No." <> OldWhseEntry."Entry No." then begin
OldWhseEntry := WhseEntry;
repeat
WhseEntry.SetRange("Bin Code", WhseEntry."Bin Code");
if not ItemBinLocationIsCalculated(WhseEntry."Bin Code") then begin
WhseEntry.CalcSums("Qty. (Base)");
OnItemLedgerEntryOnAfterGetRecordOnBeforeUpdateBuffer(WhseEntry);
UpdateBuffer(WhseEntry."Bin Code", WhseEntry."Qty. (Base)", false);
end;
IsHandled := false;
OnWhseEntryLoopOnBeforeFindlast(WhseEntry, IsHandled);
if not IsHandled then
WhseEntry.Find('+');
Item.CopyFilter("Bin Filter", WhseEntry."Bin Code");
until WhseEntry.Next() = 0;
end;
end;
end else
UpdateBuffer('', Quantity, true);
end;
trigger OnPreDataItem()
begin
WhseEntry.SetCurrentKey("Item No.", "Bin Code", "Location Code", "Variant Code");
Item.CopyFilter("Bin Filter", WhseEntry."Bin Code");
if ColumnDim = '' then
TempDimBufIn.SetFilter("Table ID", '%1|%2', DATABASE::Item, Database::Location)
else
TempDimBufIn.SetRange("Table ID", DATABASE::"Item Ledger Entry");
TempDimBufIn.SetRange("Entry No.");
TempDimBufIn.DeleteAll();
OnItemLedgerEntryOnPreDataItemOnBeforeClearQuantityOnHandBuffer("Item Ledger Entry", Item);
if IncludeItemWithNoTransaction then
if not "Item Ledger Entry".Find('-') then begin
WhseEntry.SetRange("Item No.", Item."No.");
if (Item.GetFilter("Variant Filter") = '') and
(Item.GetFilter("Location Filter") = '') and
WhseEntry.IsEmpty
then begin
Clear(TempQuantityOnHandBuffer);
TempQuantityOnHandBuffer."Item No." := Item."No.";
OnItemLedgerEntryOnPreDataItemOnBeforeInsertQuantityOnHandBuffer(TempQuantityOnHandBuffer, Item);
TempQuantityOnHandBuffer.Insert();
end;
end;
OnItemLedgerEntryOnAfterPreDataItem("Item Ledger Entry", Item);
end;
}
dataitem("Warehouse Entry"; "Warehouse Entry")
{
DataItemLink = "Item No." = field("No."), "Variant Code" = field("Variant Filter"), "Location Code" = field("Location Filter");
DataItemTableView = sorting("Item No.", "Bin Code", "Location Code", "Variant Code", "Unit of Measure Code", "Lot No.", "Serial No.", "Entry Type", Dedicated, "Package No.", "Bin Type Code", "SIFT Bucket No.");
trigger OnPreDataItem()
begin
if WarehouseEntryTableIsCompletelyEmpty then
CurrReport.Break(); // Skip if Warehouse Entry table has no records at all (checked once in Item.OnPreDataItem).
if not "Item Ledger Entry".IsEmpty() then
CurrReport.Break(); // Skip if item has any record in Item Ledger Entry.
end;
trigger OnAfterGetRecord()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnWarehouseEntryOnAfterGetRecordOnBeforeItemLedgerEntryIsEmptyCheck("Item Ledger Entry", IsHandled);
if not IsHandled then
if not "Item Ledger Entry".IsEmpty() then
CurrReport.Break(); // Skip if item has any record in Item Ledger Entry.
if "Warehouse Entry"."Variant Code" <> '' then
if IsItemVariantBlocked("Item No.", "Variant Code") then
CurrReport.Skip();
Clear(TempQuantityOnHandBuffer);
TempQuantityOnHandBuffer."Item No." := "Item No.";
TempQuantityOnHandBuffer."Location Code" := "Location Code";
TempQuantityOnHandBuffer."Variant Code" := "Variant Code";
this.GetLocation("Location Code");
if Location."Bin Mandatory" and not Location."Directed Put-away and Pick" then
TempQuantityOnHandBuffer."Bin Code" := "Bin Code";
OnBeforeQuantityOnHandBufferFindAndInsert(TempQuantityOnHandBuffer, "Warehouse Entry");
if not TempQuantityOnHandBuffer.Find() then
TempQuantityOnHandBuffer.Insert(); // Insert a zero quantity line.
end;
}
dataitem(ItemWithNoTransaction; "Integer")
{
DataItemTableView = sorting(Number) where(Number = const(1));
trigger OnAfterGetRecord()
begin
if IncludeItemWithNoTransaction then
UpdateQuantityOnHandBuffer(Item."No.");
end;
}
trigger OnAfterGetRecord()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeItemOnAfterGetRecord(Item, IsHandled);
if IsHandled then
CurrReport.Skip();
if not HideValidationDialog then
Window.Update();
TempSKU.DeleteAll();
ClearItemVariantCache();
end;
trigger OnPostDataItem()
begin
CalcPhysInvQtyAndInsertItemJnlLine();
end;
trigger OnPreDataItem()
var
ItemJnlTemplate: Record "Item Journal Template";
ItemJnlBatch: Record "Item Journal Batch";
WarehouseEntryToCheck: Record "Warehouse Entry";
begin
if PostingDate = 0D then
Error(Text000);
ItemJnlTemplate.Get(ItemJnlLine."Journal Template Name");
ItemJnlBatch.Get(ItemJnlLine."Journal Template Name", ItemJnlLine."Journal Batch Name");
OnPreDataItemOnAfterGetItemJnlTemplateAndBatch(ItemJnlTemplate, ItemJnlBatch);
if NextDocNo = '' then begin
if ItemJnlBatch."No. Series" <> '' then begin
ItemJnlLine.SetRange("Journal Template Name", ItemJnlLine."Journal Template Name");
ItemJnlLine.SetRange("Journal Batch Name", ItemJnlLine."Journal Batch Name");
if not ItemJnlLine.FindFirst() then
NextDocNo := NoSeriesBatch.GetNextNo(ItemJnlBatch."No. Series", PostingDate);
ItemJnlLine.Init();
end;
if NextDocNo = '' then
Error(Text001);
end;
NextLineNo := 0;
if not HideValidationDialog then
Window.Open(Text002, "No.");
if not SkipDim then
SelectedDim.GetSelectedDim(UserId, 3, REPORT::"Calculate Inventory", '', TempSelectedDim);
WarehouseEntryTableIsCompletelyEmpty := WarehouseEntryToCheck.IsEmpty();
TempQuantityOnHandBuffer.Reset();
TempQuantityOnHandBuffer.DeleteAll();
OnAfterItemOnPreDataItem(Item, ZeroQty, IncludeItemWithNoTransaction);
end;
}
}
requestpage
{
SaveValues = true;
layout
{
area(content)
{
group(Options)
{
Caption = 'Options';
field(PostingDate; PostingDate)
{
ApplicationArea = Basic, Suite;
Caption = 'Posting Date';
ShowMandatory = true;
ToolTip = 'Specifies the date for the posting of this batch job. By default, the working date is entered, but you can change it.';
trigger OnValidate()
begin
ValidatePostingDate();
end;
}
field(DocumentNo; NextDocNo)
{
ApplicationArea = Basic, Suite;
Caption = 'Document No.';
ShowMandatory = DocumentNoInputMandatory;
ToolTip = 'Specifies the number of the document that is processed by the report or batch job.';
}
field(ItemsNotOnInventory; ZeroQty)
{
ApplicationArea = Basic, Suite;
Caption = 'Items Not on Inventory.';
ToolTip = 'Specifies if journal lines should be created for items that are not on inventory, that is, items where the value in the Qty. (Calculated) field is 0.';
trigger OnValidate()
begin
if not ZeroQty then
IncludeItemWithNoTransaction := false;
end;
}
field(IncludeItemWithNoTransaction; IncludeItemWithNoTransaction)
{
ApplicationArea = Basic, Suite;
Caption = 'Include Item without Transactions';
ToolTip = 'Specifies if journal lines should be created for items that are not on inventory and are not used in any transactions.';
trigger OnValidate()
begin
if not IncludeItemWithNoTransaction then
exit;
if not ZeroQty then
Error(ItemNotOnInventoryErr);
end;
}
field(ByDimensions; ColumnDim)
{
ApplicationArea = Dimensions;
Caption = 'By Dimensions';
Editable = false;
ToolTip = 'Specifies the dimensions that you want the batch job to consider.';
trigger OnAssistEdit()
begin
DimSelectionBuf.SetDimSelectionMultiple(3, REPORT::"Calculate Inventory", ColumnDim);
end;
}
}
}
}
actions
{
}
trigger OnOpenPage()
begin
if PostingDate = 0D then
PostingDate := WorkDate();
ValidatePostingDate();
ColumnDim := DimSelectionBuf.GetDimSelectionText(3, REPORT::"Calculate Inventory", '');
end;
}
labels
{
}
trigger OnPreReport()
begin
OnBeforeOnPreReport(ItemJnlLine, PostingDate);
if SkipDim then
ColumnDim := ''
else
DimSelectionBuf.CompareDimText(3, REPORT::"Calculate Inventory", '', ColumnDim, Text003);
ZeroQtySave := ZeroQty;
end;
var
SourceCodeSetup: Record "Source Code Setup";
DimSetEntry: Record "Dimension Set Entry";
OldWhseEntry: Record "Warehouse Entry";
TempDimSetEntry: Record "Dimension Set Entry" temporary;
SelectedDim: Record "Selected Dimension";
TempSelectedDim: Record "Selected Dimension" temporary;
TempDimBufIn: Record "Dimension Buffer" temporary;
TempDimBufOut: Record "Dimension Buffer" temporary;
DimSelectionBuf: Record "Dimension Selection Buffer";
NoSeriesBatch: Codeunit "No. Series - Batch";
DimBufMgt: Codeunit "Dimension Buffer Management";
Window: Dialog;
ItemVariantBlockedCache: Dictionary of [Code[10], Integer];
CachedVariantItemNo: Code[20];
NextLineNo: Integer;
ZeroQtySave: Boolean;
AdjustPosQty: Boolean;
DocumentNoInputMandatory: Boolean;
WarehouseEntryTableIsCompletelyEmpty: Boolean;
PosQty: Decimal;
NegQty: Decimal;
ItemNotOnInventoryErr: Label 'Items Not on Inventory.';
#pragma warning disable AA0074
Text000: Label 'Enter the posting date.';
Text001: Label 'Enter the document no.';
#pragma warning disable AA0470
Text002: Label 'Processing items #1##########';
#pragma warning restore AA0470
Text003: Label 'Retain Dimensions';
#pragma warning restore AA0074
protected var
WhseEntry: Record "Warehouse Entry";
ItemJnlBatch: Record "Item Journal Batch";
ItemJnlLine: Record "Item Journal Line";
Location: Record Location;
TempQuantityOnHandBuffer: Record "Inventory Buffer" temporary;
TempSKU: Record "Stockkeeping Unit" temporary;
CycleSourceType: Option " ",Item,SKU;
ItemTrackingSplit: Boolean;
HideValidationDialog: Boolean;
PhysInvtCountCode: Code[10];
PostingDate: Date;
NextDocNo: Code[20];
ZeroQty: Boolean;
IncludeItemWithNoTransaction: Boolean;
ColumnDim: Text[250];
SkipDim: Boolean;
procedure SetItemJnlLine(var NewItemJnlLine: Record "Item Journal Line")
begin
ItemJnlLine := NewItemJnlLine;
end;
procedure ValidatePostingDate()
var
NoSeries: Codeunit "No. Series";
begin
if not ItemJnlBatch.Get(ItemJnlLine."Journal Template Name", ItemJnlLine."Journal Batch Name") then
exit;
if ItemJnlBatch."No. Series" = '' then begin
DocumentNoInputMandatory := true;
NextDocNo := ''
end else begin
DocumentNoInputMandatory := false;
NextDocNo := NoSeries.PeekNextNo(ItemJnlBatch."No. Series", PostingDate);
end;
end;
procedure InsertItemJnlLine(ItemNo: Code[20]; VariantCode2: Code[10]; DimEntryNo2: Integer; BinCode2: Code[20]; Quantity2: Decimal; PhysInvQuantity: Decimal)
var
ItemLedgEntry: Record "Item Ledger Entry";
Bin: Record Bin;
DimValue: Record "Dimension Value";
DimMgt: Codeunit DimensionManagement;
NoBinExist: Boolean;
ShouldInsertItemJnlLine: Boolean;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeFunctionInsertItemJnlLine(ItemNo, VariantCode2, DimEntryNo2, BinCode2, Quantity2, PhysInvQuantity, ItemJnlLine, IsHandled, Location);
if not IsHandled then begin
if NextLineNo = 0 then begin
ItemJnlLine.LockTable();
ItemJnlLine.SetRange("Journal Template Name", ItemJnlLine."Journal Template Name");
ItemJnlLine.SetRange("Journal Batch Name", ItemJnlLine."Journal Batch Name");
if ItemJnlLine.FindLast() then
NextLineNo := ItemJnlLine."Line No.";
SourceCodeSetup.Get();
end;
NextLineNo := NextLineNo + 10000;
ShouldInsertItemJnlLine := (Quantity2 <> 0) or ZeroQty;
OnInsertItemJnlLineOnAfterCalcShouldInsertItemJnlLine(ItemNo, VariantCode2, DimEntryNo2, BinCode2, Quantity2, PhysInvQuantity, ZeroQty, ShouldInsertItemJnlLine, Location, NextLineNo);
if ShouldInsertItemJnlLine then begin
if (Quantity2 = 0) and Location."Bin Mandatory" and not Location."Directed Put-away and Pick"
then
if not Bin.Get(Location.Code, BinCode2) then
NoBinExist := true;
OnInsertItemJnlLineOnBeforeInit(ItemJnlLine);
ItemJnlLine.Init();
ItemJnlLine."Line No." := NextLineNo;
ItemJnlLine.Validate("Posting Date", PostingDate);
if PhysInvQuantity >= Quantity2 then
ItemJnlLine.Validate("Entry Type", ItemJnlLine."Entry Type"::"Positive Adjmt.")
else
ItemJnlLine.Validate("Entry Type", ItemJnlLine."Entry Type"::"Negative Adjmt.");
ItemJnlLine.Validate("Document No.", NextDocNo);
OnInsertItemJnlLineOnBeforeValidateItemNo(ItemJnlLine);
ItemJnlLine.Validate("Item No.", ItemNo);
ItemJnlLine.Validate("Variant Code", VariantCode2);
ItemJnlLine.Validate("Location Code", Location.Code);
OnInsertItemJnlLineOnAfterValidateLocationCode(ItemNo, VariantCode2, DimEntryNo2, BinCode2, Quantity2, PhysInvQuantity, ItemJnlLine);
if not NoBinExist then
ItemJnlLine.Validate("Bin Code", BinCode2)
else
ItemJnlLine.Validate("Bin Code", '');
ItemJnlLine.Validate("Source Code", SourceCodeSetup."Phys. Inventory Journal");
ItemJnlLine."Qty. (Phys. Inventory)" := PhysInvQuantity;
ItemJnlLine."Phys. Inventory" := true;
ItemJnlLine.Validate("Qty. (Calculated)", Quantity2);
ItemJnlLine."Posting No. Series" := ItemJnlBatch."Posting No. Series";
ItemJnlLine."Reason Code" := ItemJnlBatch."Reason Code";
ItemJnlLine."Phys Invt Counting Period Code" := PhysInvtCountCode;
ItemJnlLine."Phys Invt Counting Period Type" := CycleSourceType;
if Location."Bin Mandatory" then
ItemJnlLine."Dimension Set ID" := 0;
ItemJnlLine."Shortcut Dimension 1 Code" := '';
ItemJnlLine."Shortcut Dimension 2 Code" := '';
ItemLedgEntry.Reset();
ItemLedgEntry.SetCurrentKey("Item No.", "Entry No.");
ItemLedgEntry.SetLoadFields("Entry No.");
ItemLedgEntry.SetRange("Item No.", ItemNo);
if ItemLedgEntry.FindLast() then
ItemJnlLine."Last Item Ledger Entry No." := ItemLedgEntry."Entry No."
else
ItemJnlLine."Last Item Ledger Entry No." := 0;
OnBeforeInsertItemJnlLine(ItemJnlLine, TempQuantityOnHandBuffer);
ItemJnlLine.Insert(true);
OnAfterInsertItemJnlLine(ItemJnlLine);
if Location.Code <> '' then
if Location."Directed Put-away and Pick" then
ReserveWarehouse(ItemJnlLine);
if ColumnDim = '' then
DimEntryNo2 := CreateDimFromDefault();
if DimBufMgt.GetDimensions(DimEntryNo2, TempDimBufOut) then begin
TempDimSetEntry.Reset();
TempDimSetEntry.DeleteAll();
if TempDimBufOut.Find('-') then
repeat
DimValue.Get(TempDimBufOut."Dimension Code", TempDimBufOut."Dimension Value Code");
TempDimSetEntry."Dimension Code" := TempDimBufOut."Dimension Code";
TempDimSetEntry."Dimension Value Code" := TempDimBufOut."Dimension Value Code";
TempDimSetEntry."Dimension Value ID" := DimValue."Dimension Value ID";
if TempDimSetEntry.Insert() then;
ItemJnlLine."Dimension Set ID" := DimMgt.GetDimensionSetID(TempDimSetEntry);
DimMgt.UpdateGlobalDimFromDimSetID(ItemJnlLine."Dimension Set ID",
ItemJnlLine."Shortcut Dimension 1 Code", ItemJnlLine."Shortcut Dimension 2 Code");
OnInsertItemJnlLineOnAfterUpdateDimensionSetID(ItemJnlLine);
ItemJnlLine.Modify();
until TempDimBufOut.Next() = 0;
TempDimBufOut.DeleteAll();
end;
end;
end;
OnAfterFunctionInsertItemJnlLine(ItemNo, VariantCode2, DimEntryNo2, BinCode2, Quantity2, PhysInvQuantity, ItemJnlLine);
end;
local procedure InsertQuantityOnHandBuffer(ItemNo: Code[20]; LocationCode: Code[10]; VariantCode: Code[10])
begin
TempQuantityOnHandBuffer.Reset();
TempQuantityOnHandBuffer.SetRange("Item No.", ItemNo);
TempQuantityOnHandBuffer.SetRange("Location Code", LocationCode);
TempQuantityOnHandBuffer.SetRange("Variant Code", VariantCode);
if not TempQuantityOnHandBuffer.FindFirst() then begin
TempQuantityOnHandBuffer.Reset();
TempQuantityOnHandBuffer.Init();
TempQuantityOnHandBuffer."Item No." := ItemNo;
TempQuantityOnHandBuffer."Location Code" := LocationCode;
TempQuantityOnHandBuffer."Variant Code" := VariantCode;
TempQuantityOnHandBuffer."Bin Code" := '';
TempQuantityOnHandBuffer."Dimension Entry No." := 0;
OnInsertQuantityOnHandBufferOnBeforeInsert(TempQuantityOnHandBuffer);
TempQuantityOnHandBuffer.Insert(true);
end;
end;
local procedure ReserveWarehouse(ItemJnlLine: Record "Item Journal Line")
var
ReservEntry: Record "Reservation Entry";
WhseEntry: Record "Warehouse Entry";
WhseEntry2: Record "Warehouse Entry";
CreateReservEntry: Codeunit "Create Reserv. Entry";
EntryType: Option "Negative Adjmt.","Positive Adjmt.";
OrderLineNo: Integer;
begin
WhseEntry.SetCurrentKey(
"Item No.", "Bin Code", "Location Code", "Variant Code", "Unit of Measure Code",
"Lot No.", "Serial No.", "Entry Type");
WhseEntry.SetRange("Item No.", ItemJnlLine."Item No.");
WhseEntry.SetRange("Bin Code", Location."Adjustment Bin Code");
WhseEntry.SetRange("Location Code", ItemJnlLine."Location Code");
WhseEntry.SetRange("Variant Code", ItemJnlLine."Variant Code");
if ItemJnlLine."Entry Type" = ItemJnlLine."Entry Type"::"Positive Adjmt." then
EntryType := EntryType::"Negative Adjmt.";
if ItemJnlLine."Entry Type" = ItemJnlLine."Entry Type"::"Negative Adjmt." then
EntryType := EntryType::"Positive Adjmt.";
OnAfterWhseEntrySetFilters(WhseEntry, ItemJnlLine);
WhseEntry.SetRange("Entry Type", EntryType);
if WhseEntry.Find('-') then
repeat
WhseEntry.SetTrackingFilterFromWhseEntry(WhseEntry);
WhseEntry.CalcSums("Qty. (Base)");
WhseEntry2.SetCurrentKey(
"Item No.", "Bin Code", "Location Code", "Variant Code", "Unit of Measure Code",
"Lot No.", "Serial No.", "Entry Type");
WhseEntry2.CopyFilters(WhseEntry);
case EntryType of
EntryType::"Positive Adjmt.":
WhseEntry2.SetRange("Entry Type", WhseEntry2."Entry Type"::"Negative Adjmt.");
EntryType::"Negative Adjmt.":
WhseEntry2.SetRange("Entry Type", WhseEntry2."Entry Type"::"Positive Adjmt.");
end;
OnReserveWarehouseOnAfterWhseEntry2SetFilters(ItemJnlLine, WhseEntry, WhseEntry2, EntryType);
WhseEntry2.CalcSums("Qty. (Base)");
if Abs(WhseEntry2."Qty. (Base)") > Abs(WhseEntry."Qty. (Base)") then
WhseEntry."Qty. (Base)" := 0
else
WhseEntry."Qty. (Base)" := WhseEntry."Qty. (Base)" + WhseEntry2."Qty. (Base)";
if WhseEntry."Qty. (Base)" <> 0 then begin
if ItemJnlLine."Order Type" = ItemJnlLine."Order Type"::Production then
OrderLineNo := ItemJnlLine."Order Line No.";
ReservEntry.CopyTrackingFromWhseEntry(WhseEntry);
CreateReservEntry.CreateReservEntryFor(
DATABASE::"Item Journal Line", ItemJnlLine."Entry Type".AsInteger(), ItemJnlLine."Journal Template Name", ItemJnlLine."Journal Batch Name", OrderLineNo,
ItemJnlLine."Line No.", ItemJnlLine."Qty. per Unit of Measure",
Abs(WhseEntry.Quantity), Abs(WhseEntry."Qty. (Base)"), ReservEntry);
if WhseEntry."Qty. (Base)" < 0 then
// only Date on positive adjustments
CreateReservEntry.SetDates(WhseEntry."Warranty Date", WhseEntry."Expiration Date");
CreateReservEntry.CreateEntry(
ItemJnlLine."Item No.", ItemJnlLine."Variant Code", ItemJnlLine."Location Code", ItemJnlLine.Description, 0D, 0D, 0, "Reservation Status"::Prospect);
end;
WhseEntry.Find('+');
WhseEntry.ClearTrackingFilter();
until WhseEntry.Next() = 0;
end;
procedure InitializeRequest(NewPostingDate: Date; DocNo: Code[20]; ItemsNotOnInvt: Boolean; InclItemWithNoTrans: Boolean)
begin
PostingDate := NewPostingDate;
NextDocNo := DocNo;
ZeroQty := ItemsNotOnInvt;
IncludeItemWithNoTransaction := InclItemWithNoTrans and ZeroQty;
if not SkipDim then
ColumnDim := DimSelectionBuf.GetDimSelectionText(3, REPORT::"Calculate Inventory", '');
end;
local procedure TransferDim(DimSetID: Integer)
begin
DimSetEntry.SetRange("Dimension Set ID", DimSetID);
if DimSetEntry.Find('-') then
repeat
if TempSelectedDim.Get(
UserId, 3, REPORT::"Calculate Inventory", '', DimSetEntry."Dimension Code")
then
InsertDim(DATABASE::"Item Ledger Entry", DimSetID, DimSetEntry."Dimension Code", DimSetEntry."Dimension Value Code");
until DimSetEntry.Next() = 0;
end;
local procedure CalcWhseQty(AdjmtBin: Code[20]; var PosQuantity: Decimal; var NegQuantity: Decimal)
var
WhseEntry: Record "Warehouse Entry";
WhseEntry2: Record "Warehouse Entry";
WhseItemTrackingSetup: Record "Item Tracking Setup";
ItemTrackingMgt: Codeunit "Item Tracking Management";
WhseQuantity: Decimal;
NoWhseEntry: Boolean;
NoWhseEntry2: Boolean;
begin
AdjustPosQty := false;
ItemTrackingMgt.GetWhseItemTrkgSetup(TempQuantityOnHandBuffer."Item No.", WhseItemTrackingSetup);
OnCalcWhseQtyOnAfterGetWhseItemTrkgSetup(TempQuantityOnHandBuffer."Location Code", WhseItemTrackingSetup);
ItemTrackingSplit := WhseItemTrackingSetup.TrackingRequired();
WhseEntry.SetCurrentKey(
"Item No.", "Bin Code", "Location Code", "Variant Code", "Unit of Measure Code",
"Lot No.", "Serial No.", "Entry Type");
WhseEntry.SetRange("Item No.", TempQuantityOnHandBuffer."Item No.");
WhseEntry.SetRange("Location Code", TempQuantityOnHandBuffer."Location Code");
WhseEntry.SetRange("Variant Code", TempQuantityOnHandBuffer."Variant Code");
OnCalcWhseQtyOnAfterWhseEntrySetFilters(WhseEntry);
WhseEntry.CalcSums("Qty. (Base)");
WhseQuantity := WhseEntry."Qty. (Base)";
WhseEntry.SetRange("Bin Code", AdjmtBin);
if WhseItemTrackingSetup."Serial No. Required" then begin
WhseEntry.SetRange("Entry Type", WhseEntry."Entry Type"::"Positive Adjmt.");
WhseEntry.CalcSums("Qty. (Base)");
PosQuantity := WhseQuantity - WhseEntry."Qty. (Base)";
WhseEntry.SetRange("Entry Type", WhseEntry."Entry Type"::"Negative Adjmt.");
WhseEntry.CalcSums("Qty. (Base)");
NegQuantity := WhseQuantity - WhseEntry."Qty. (Base)";
WhseEntry.SetRange("Entry Type", WhseEntry."Entry Type"::Movement);
WhseEntry.CalcSums("Qty. (Base)");
if WhseEntry."Qty. (Base)" <> 0 then
if WhseEntry."Qty. (Base)" > 0 then
PosQuantity := PosQuantity + WhseQuantity - WhseEntry."Qty. (Base)"
else
NegQuantity := NegQuantity - WhseQuantity - WhseEntry."Qty. (Base)";
WhseEntry.SetRange("Entry Type", WhseEntry."Entry Type"::"Positive Adjmt.");
if WhseEntry.Find('-') then
repeat
WhseEntry.SetRange("Serial No.", WhseEntry."Serial No.");
WhseEntry2.Reset();
WhseEntry2.SetCurrentKey(
"Item No.", "Bin Code", "Location Code", "Variant Code",
"Unit of Measure Code", "Lot No.", "Serial No.", "Entry Type");
WhseEntry2.CopyFilters(WhseEntry);
WhseEntry2.SetRange("Entry Type", WhseEntry2."Entry Type"::"Negative Adjmt.");
WhseEntry2.SetRange("Serial No.", WhseEntry."Serial No.");
if WhseEntry2.Find('-') then
repeat
PosQuantity := PosQuantity + 1;
NegQuantity := NegQuantity - 1;
NoWhseEntry := WhseEntry.Next() = 0;
NoWhseEntry2 := WhseEntry2.Next() = 0;
until NoWhseEntry2 or NoWhseEntry
else
AdjustPosQty := true;
if not NoWhseEntry and NoWhseEntry2 then
AdjustPosQty := true;
WhseEntry.Find('+');
WhseEntry.SetRange("Serial No.");
until WhseEntry.Next() = 0;
end else begin
if WhseEntry.Find('-') then
repeat
WhseEntry.SetRange("Lot No.", WhseEntry."Lot No.");
WhseEntry.SetRange("Package No.", WhseEntry."Package No.");
OnCalcWhseQtyOnAfterLotRequiredWhseEntrySetFilters(WhseEntry);
WhseEntry.CalcSums("Qty. (Base)");
if WhseEntry."Qty. (Base)" <> 0 then
if WhseEntry."Qty. (Base)" > 0 then
NegQuantity := NegQuantity - WhseEntry."Qty. (Base)"
else
PosQuantity := PosQuantity + WhseEntry."Qty. (Base)";
WhseEntry.Find('+');
WhseEntry.SetRange("Lot No.");
WhseEntry.SetRange("Package No.");
OnCalcWhseQtyOnAfterLotRequiredWhseEntryClearFilters(WhseEntry);
until WhseEntry.Next() = 0;
if PosQuantity <> WhseQuantity then
PosQuantity := WhseQuantity - PosQuantity;
if NegQuantity <> -WhseQuantity then
NegQuantity := WhseQuantity + NegQuantity;
end;
end;
procedure SetHideValidationDialog(NewHideValidationDialog: Boolean)
begin
HideValidationDialog := NewHideValidationDialog;
end;
procedure InitializePhysInvtCount(PhysInvtCountCode2: Code[10]; CountSourceType2: Option " ",Item,SKU)
begin
PhysInvtCountCode := PhysInvtCountCode2;
CycleSourceType := CountSourceType2;
end;
local procedure SkipCycleSKU(LocationCode: Code[10]; ItemNo: Code[20]; VariantCode: Code[10]): Boolean
var
SKU: Record "Stockkeeping Unit";
begin
if CycleSourceType = CycleSourceType::Item then
if SKU.ReadPermission then
if SKU.Get(LocationCode, ItemNo, VariantCode) then
exit(true);
exit(false);
end;
local procedure IsItemVariantBlocked(ItemNo: Code[20]; VariantCode: Code[10]): Boolean
var
Blocked: Boolean;
begin
// Returns true only when the variant exists for this item AND is blocked.
if not LookupItemVariantAndBlockedState(ItemNo, VariantCode, Blocked) then
exit(false);
exit(Blocked);
end;
local procedure ItemVariantExists(ItemNo: Code[20]; VariantCode: Code[10]): Boolean
var
DummyBlocked: Boolean;
begin
exit(LookupItemVariantAndBlockedState(ItemNo, VariantCode, DummyBlocked));
end;
local procedure ClearItemVariantCache()
begin
Clear(ItemVariantBlockedCache);
CachedVariantItemNo := '';
end;
local procedure LookupItemVariantAndBlockedState(ItemNo: Code[20]; VariantCode: Code[10]; var Blocked: Boolean): Boolean
var
ItemVariantState: Integer;
begin
// Cache Item Variant Blocked state per Item to avoid repeated SQL roundtrips.
// Each (Item, Variant) pair is fetched at most once; the cache is invalidated when the outer Item changes.
Blocked := false;
if (ItemNo = '') or (VariantCode = '') then
exit(false);
if CachedVariantItemNo <> ItemNo then begin
Clear(ItemVariantBlockedCache);
CachedVariantItemNo := ItemNo;
end;
ItemVariantState := GetItemVariantState(ItemNo, VariantCode);
Blocked := ItemVariantState = 2;
exit(ItemVariantState <> 0);
end;
local procedure GetItemVariantState(ItemNo: Code[20]; VariantCode: Code[10]): Integer
var
ItemVariant: Record "Item Variant";
ItemVariantState: Integer;
begin
// Returns the cached state for (ItemNo, VariantCode); fetches from the database on miss.
// 0 = variant does not exist, 1 = exists and not blocked, 2 = exists and blocked.
if ItemVariantBlockedCache.Get(VariantCode, ItemVariantState) then
exit(ItemVariantState);
ItemVariant.SetLoadFields(Blocked);
case true of
not ItemVariant.Get(ItemNo, VariantCode):
ItemVariantState := 0;
ItemVariant.Blocked:
ItemVariantState := 2;
else
ItemVariantState := 1;
end;
ItemVariantBlockedCache.Add(VariantCode, ItemVariantState);
exit(ItemVariantState);
end;
procedure GetLocation(LocationCode: Code[10]): Boolean
begin
if LocationCode = '' then begin
Clear(Location);
exit(true);
end;
if Location.Code <> LocationCode then
if not Location.Get(LocationCode) then
exit(false);
exit(true);
end;
local procedure UpdateBuffer(BinCode: Code[20]; NewQuantity: Decimal; CalledFromItemLedgerEntry: Boolean)
var
DimEntryNo: Integer;
begin
if not HasNewQuantity(NewQuantity) then
exit;
if BinCode = '' then begin
if ColumnDim <> '' then
TempDimBufIn.SetRange("Entry No.", "Item Ledger Entry"."Dimension Set ID");
DimEntryNo := DimBufMgt.FindDimensions(TempDimBufIn);
if DimEntryNo = 0 then
DimEntryNo := DimBufMgt.InsertDimensions(TempDimBufIn);
end;
if RetrieveBuffer(BinCode, DimEntryNo) then begin
TempQuantityOnHandBuffer.Quantity := TempQuantityOnHandBuffer.Quantity + NewQuantity;
OnUpdateBufferOnBeforeModify(TempQuantityOnHandBuffer, CalledFromItemLedgerEntry);
TempQuantityOnHandBuffer.Modify();
end else begin
TempQuantityOnHandBuffer.Quantity := NewQuantity;
OnUpdateBufferOnBeforeInsert(TempQuantityOnHandBuffer, CalledFromItemLedgerEntry);
TempQuantityOnHandBuffer.Insert();
end;
end;
local procedure RetrieveBuffer(BinCode: Code[20]; DimEntryNo: Integer) Result: Boolean
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeRetrieveBuffer(TempQuantityOnHandBuffer, "Item Ledger Entry", BinCode, DimEntryNo, Result, IsHandled);
if IsHandled then
exit(Result);
TempQuantityOnHandBuffer.Reset();
TempQuantityOnHandBuffer."Item No." := "Item Ledger Entry"."Item No.";
TempQuantityOnHandBuffer."Variant Code" := "Item Ledger Entry"."Variant Code";
TempQuantityOnHandBuffer."Location Code" := "Item Ledger Entry"."Location Code";
TempQuantityOnHandBuffer."Dimension Entry No." := DimEntryNo;
TempQuantityOnHandBuffer."Bin Code" := BinCode;
OnRetrieveBufferOnBeforeFind(TempQuantityOnHandBuffer, "Item Ledger Entry");
exit(TempQuantityOnHandBuffer.Find());
end;
local procedure HasNewQuantity(NewQuantity: Decimal): Boolean
begin
exit((NewQuantity <> 0) or ZeroQty);
end;
local procedure ItemBinLocationIsCalculated(BinCode: Code[20]): Boolean
var
IsHandled: Boolean;
IsCalculated: Boolean;
begin
IsHandled := false;
OnBeforeItemBinLocationIsCalculated("Item Ledger Entry", IsHandled, IsCalculated, WhseEntry);
if IsHandled then
exit(IsCalculated);
TempQuantityOnHandBuffer.Reset();
TempQuantityOnHandBuffer.SetRange("Item No.", "Item Ledger Entry"."Item No.");
TempQuantityOnHandBuffer.SetRange("Variant Code", "Item Ledger Entry"."Variant Code");
TempQuantityOnHandBuffer.SetRange("Location Code", "Item Ledger Entry"."Location Code");
TempQuantityOnHandBuffer.SetRange("Bin Code", BinCode);
OnItemBinLocationIsCalculatedOnBeforeFind(TempQuantityOnHandBuffer, "Item Ledger Entry");
exit(TempQuantityOnHandBuffer.Find('-'));
end;
procedure SetSkipDim(NewSkipDim: Boolean)
begin
SkipDim := NewSkipDim;
end;
procedure AddZeroQtySKU()
var
SKU: Record "Stockkeeping Unit";
ShouldAddZeroQty: Boolean;
IsHandled: Boolean;
begin
ShouldAddZeroQty := ZeroQty;
OnAddZeroQtyOnAfterCalcShouldAddZeroQty(Item, ZeroQty, ShouldAddZeroQty);
if not ShouldAddZeroQty then
exit;
SKU.SetCurrentKey("Item No.");
SKU.SetRange("Item No.", Item."No.");
Item.CopyFilter("Variant Filter", SKU."Variant Code");
Item.CopyFilter("Location Filter", SKU."Location Code");
OnAddZeroQtyOnAfterFilterSKU(Item, SKU);
if SKU.Find('-') then begin
TempQuantityOnHandBuffer.Reset();
TempQuantityOnHandBuffer.SetRange("Item No.", Item."No.");
IsHandled := false;
OnAddZeroQtySKUOnBeforeInsertZeroQtySKU(Item, SKU, TempQuantityOnHandBuffer, IsHandled);
if not IsHandled then
repeat
TempQuantityOnHandBuffer.SetRange("Variant Code", SKU."Variant Code");
TempQuantityOnHandBuffer.SetRange("Location Code", SKU."Location Code");
if not TempQuantityOnHandBuffer.Find('-') then begin
Clear(TempQuantityOnHandBuffer);
TempQuantityOnHandBuffer."Item No." := SKU."Item No.";
TempQuantityOnHandBuffer."Variant Code" := SKU."Variant Code";
TempQuantityOnHandBuffer."Location Code" := SKU."Location Code";
OnAddZeroQtySKUOnBeforeInsertQuantityOnHandBuffer(TempQuantityOnHandBuffer, SKU, Item);
TempQuantityOnHandBuffer.Insert();
end;
until SKU.Next() = 0;
end;
end;
local procedure UpdateQuantityOnHandBuffer(ItemNo: Code[20])
var
Location: Record Location;
ItemVariant: Record "Item Variant";
begin
ItemVariant.SetRange("Item No.", Item."No.");
Item.CopyFilter("Variant Filter", ItemVariant.Code);
Item.CopyFilter("Location Filter", Location.Code);
Location.SetRange("Use As In-Transit", false);
if (Item.GetFilter("Location Filter") <> '') and Location.FindSet() then
repeat
if (Item.GetFilter("Variant Filter") <> '') and ItemVariant.FindSet() then
repeat
InsertQuantityOnHandBuffer(ItemNo, Location.Code, ItemVariant.Code);
until ItemVariant.Next() = 0
else
InsertQuantityOnHandBuffer(ItemNo, Location.Code, '');
until Location.Next() = 0
else
if (Item.GetFilter("Variant Filter") <> '') and ItemVariant.FindSet() then
repeat
InsertQuantityOnHandBuffer(ItemNo, '', ItemVariant.Code);
until ItemVariant.Next() = 0
else
InsertQuantityOnHandBuffer(ItemNo, '', '');
end;
local procedure CalcPhysInvQtyAndInsertItemJnlLine()
begin
AddZeroQtySKU();
TempQuantityOnHandBuffer.Reset();
OnCalcPhysInvQtyAndInsertItemJnlLineOnBeforeFindset(TempQuantityOnHandBuffer);
if TempQuantityOnHandBuffer.FindSet() then begin
repeat
PosQty := 0;
NegQty := 0;
GetLocation(TempQuantityOnHandBuffer."Location Code");
if Location."Directed Put-away and Pick" then
CalcWhseQty(Location."Adjustment Bin Code", PosQty, NegQty);
if (NegQty - TempQuantityOnHandBuffer.Quantity <> TempQuantityOnHandBuffer.Quantity - PosQty) or ItemTrackingSplit then begin
if PosQty = TempQuantityOnHandBuffer.Quantity then
PosQty := 0;
if (PosQty <> 0) or AdjustPosQty then
InsertItemJnlLine(
TempQuantityOnHandBuffer."Item No.", TempQuantityOnHandBuffer."Variant Code", TempQuantityOnHandBuffer."Dimension Entry No.",
TempQuantityOnHandBuffer."Bin Code", TempQuantityOnHandBuffer.Quantity, PosQty);
if NegQty = TempQuantityOnHandBuffer.Quantity then
NegQty := 0;
if NegQty <> 0 then begin
if ((PosQty <> 0) or AdjustPosQty) and not ItemTrackingSplit then begin
NegQty := NegQty - TempQuantityOnHandBuffer.Quantity;
TempQuantityOnHandBuffer.Quantity := 0;
ZeroQty := true;
end;
if NegQty = -TempQuantityOnHandBuffer.Quantity then begin
NegQty := 0;
AdjustPosQty := true;
end;
InsertItemJnlLine(
TempQuantityOnHandBuffer."Item No.", TempQuantityOnHandBuffer."Variant Code", TempQuantityOnHandBuffer."Dimension Entry No.",
TempQuantityOnHandBuffer."Bin Code", TempQuantityOnHandBuffer.Quantity, NegQty);
ZeroQty := ZeroQtySave;
end;
end else begin
PosQty := 0;
NegQty := 0;
end;
OnCalcPhysInvQtyAndInsertItemJnlLineOnBeforeCheckIfInsertNeeded(TempQuantityOnHandBuffer);
if (PosQty = 0) and (NegQty = 0) and not AdjustPosQty then
InsertItemJnlLine(
TempQuantityOnHandBuffer."Item No.", TempQuantityOnHandBuffer."Variant Code", TempQuantityOnHandBuffer."Dimension Entry No.",
TempQuantityOnHandBuffer."Bin Code", TempQuantityOnHandBuffer.Quantity, TempQuantityOnHandBuffer.Quantity);
until TempQuantityOnHandBuffer.Next() = 0;
TempQuantityOnHandBuffer.DeleteAll();
end;
end;
local procedure CreateDimFromDefault() DimEntryNo: Integer
var
DefaultDimension: Record "Default Dimension";
begin
DefaultDimension.SetFilter("No.", '%1|%2', TempQuantityOnHandBuffer."Item No.", TempQuantityOnHandBuffer."Location Code");
DefaultDimension.SetFilter("Table ID", '%1|%2', DATABASE::Item, DATABASE::Location);
DefaultDimension.SetFilter("Dimension Value Code", '<>%1', '');
if DefaultDimension.FindSet() then
repeat
InsertDim(DefaultDimension."Table ID", 0, DefaultDimension."Dimension Code", DefaultDimension."Dimension Value Code");
until DefaultDimension.Next() = 0;
DimEntryNo := DimBufMgt.InsertDimensions(TempDimBufIn);
TempDimBufIn.SetFilter("Table ID", '%1|%2', DATABASE::Item, Database::Location);
TempDimBufIn.DeleteAll();
end;
local procedure InsertDim(TableID: Integer; EntryNo: Integer; DimCode: Code[20]; DimValueCode: Code[20])
begin
TempDimBufIn.Init();
TempDimBufIn."Table ID" := TableID;
TempDimBufIn."Entry No." := EntryNo;
TempDimBufIn."Dimension Code" := DimCode;
TempDimBufIn."Dimension Value Code" := DimValueCode;
if TempDimBufIn.Insert() then;
end;
[IntegrationEvent(false, false)]
local procedure OnAfterGetRecordItemLedgEntryOnBeforeUpdateBuffer(var Item: Record Item; ItemLedgEntry: Record "Item Ledger Entry"; var ByBin: Boolean; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterInsertItemJnlLine(var ItemJournalLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterItemOnPreDataItem(var Item: Record Item; ZeroQty: Boolean; IncludeItemWithNoTransaction: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterWhseEntrySetFilters(var WarehouseEntry: Record "Warehouse Entry"; var ItemJournalLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnItemLedgerEntryOnAfterPreDataItem(var ItemLedgerEntry: Record "Item Ledger Entry"; var Item: Record Item)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnItemLedgerEntryOnAfterGetRecordOnBeforeUpdateBuffer(var WarehouseEntry: Record "Warehouse Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnWarehouseEntryOnAfterGetRecordOnBeforeItemLedgerEntryIsEmptyCheck(var ItemLedgerEntry: Record "Item Ledger Entry"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertItemJnlLineOnBeforeInit(var ItemJournalLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnInsertItemJnlLineOnAfterCalcShouldInsertItemJnlLine(ItemNo: Code[20]; VariantCode2: Code[10]; DimEntryNo2: Integer; BinCode2: Code[20]; Quantity2: Decimal; PhysInvQuantity: Decimal; ZeroQty: Boolean; var ShouldInsertItemJnlLine: Boolean; Location: Record Location; var NextLineNo: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertItemJnlLineOnAfterValidateLocationCode(ItemNo: Code[20]; VariantCode2: Code[10]; DimEntryNo2: Integer; BinCode2: Code[20]; Quantity2: Decimal; PhysInvQuantity: Decimal; var ItemJournalLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAddZeroQtySKUOnBeforeInsertQuantityOnHandBuffer(var TempInventoryBuffer: Record "Inventory Buffer" temporary; StockkeepingUnit: Record "Stockkeeping Unit"; Item: Record Item)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeItemOnAfterGetRecord(var Item: Record Item; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeFunctionInsertItemJnlLine(ItemNo: Code[20]; VariantCode2: Code[10]; DimEntryNo2: Integer; BinCode2: Code[20]; Quantity2: Decimal; PhysInvQuantity: Decimal; var ItemJournalLine: Record "Item Journal Line"; var IsHandled: Boolean; Location: Record Location)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertItemJnlLine(var ItemJournalLine: Record "Item Journal Line"; var InventoryBuffer: Record "Inventory Buffer");
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeRetrieveBuffer(var TempInventoryBuffer: Record "Inventory Buffer" temporary; ItemLedgerEntry: Record "Item Ledger Entry"; BinCode: Code[20]; DimEntryNo: Integer; var Result: Boolean; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeQuantityOnHandBufferFindAndInsert(var InventoryBuffer: Record "Inventory Buffer"; WarehouseEntry: Record "Warehouse Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFunctionInsertItemJnlLine(ItemNo: Code[20]; VariantCode2: Code[10]; DimEntryNo2: Integer; BinCode2: Code[20]; Quantity2: Decimal; PhysInvQuantity: Decimal; var ItemJournalLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnItemLedgerEntryOnPreDataItemOnBeforeInsertQuantityOnHandBuffer(var TempInventoryBuffer: Record "Inventory Buffer" temporary; Item: Record Item)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnItemLedgerEntryOnPreDataItemOnBeforeClearQuantityOnHandBuffer(var ItemLedgerEntry: Record "Item Ledger Entry"; Item: Record Item)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcPhysInvQtyAndInsertItemJnlLineOnBeforeCheckIfInsertNeeded(InventoryBuffer: Record "Inventory Buffer")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcPhysInvQtyAndInsertItemJnlLineOnBeforeFindset(var InventoryBuffer: Record "Inventory Buffer")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcWhseQtyOnAfterLotRequiredWhseEntryClearFilters(var WarehouseEntry: Record "Warehouse Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcWhseQtyOnAfterLotRequiredWhseEntrySetFilters(var WarehouseEntry: Record "Warehouse Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcWhseQtyOnAfterWhseEntrySetFilters(var WarehouseEntry: Record "Warehouse Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertItemJnlLineOnAfterUpdateDimensionSetID(var ItemJnlLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnPreDataItemOnAfterGetItemJnlTemplateAndBatch(var ItemJnlTemplate: Record "Item Journal Template"; var ItemJnlBatch: Record "Item Journal Batch")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnRetrieveBufferOnBeforeFind(var InventoryBuffer: Record "Inventory Buffer"; ItemLedgerEntry: Record "Item Ledger Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnReserveWarehouseOnAfterWhseEntry2SetFilters(var ItemJnlLine: Record "Item Journal Line"; var WhseEntry: Record "Warehouse Entry"; var WhseEntry2: Record "Warehouse Entry"; EntryType: Option)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnUpdateBufferOnBeforeInsert(var InventoryBuffer: Record "Inventory Buffer"; CalledFromItemLedgerEntry: Boolean)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnUpdateBufferOnBeforeModify(var InventoryBuffer: Record "Inventory Buffer"; CalledFromItemLedgerEntry: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeOnPreReport(var ItemJournalLine: Record "Item Journal Line"; var PostingDate: Date)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAddZeroQtyOnAfterFilterSKU(var Item: Record Item; var SKU: Record "Stockkeeping Unit")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAddZeroQtyOnAfterCalcShouldAddZeroQty(var Item: Record Item; ZeroQty: Boolean; var ShouldAddZeroQty: Boolean)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAddZeroQtySKUOnBeforeInsertZeroQtySKU(var Item: Record Item; var SKU: Record "Stockkeeping Unit"; var TempInventoryBuffer: Record "Inventory Buffer" temporary; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertItemJnlLineOnBeforeValidateItemNo(var ItemJournalLine: Record "Item Journal Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcWhseQtyOnAfterGetWhseItemTrkgSetup(LocationCode: Code[10]; var ItemTrackingSetup: Record "Item Tracking Setup")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeItemBinLocationIsCalculated(ItemLedgerEntry: Record "Item Ledger Entry"; var IsHandled: Boolean; var IsCalculated: Boolean; var WarehouseEntry: Record "Warehouse Entry")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnInsertQuantityOnHandBufferOnBeforeInsert(var InventoryBuffer: Record "Inventory Buffer")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnWhseEntryLoopOnBeforeFindlast(var WarehouseEntry: Record "Warehouse Entry"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterGetRecordItemLedgEntryOnBeforeWhseEntryFind(var WarehouseEntry: Record "Warehouse Entry"; ItemLedgerEntry: Record "Item Ledger Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnItemBinLocationIsCalculatedOnBeforeFind(var InventoryBuffer: Record "Inventory Buffer"; ItemLedgerEntry: Record "Item Ledger Entry")
begin
end;
}