Table 5766 Warehouse Activity Header
- App
- Base Application
- Namespace
- Microsoft.Warehouse.Activity
- Versions
- 17-28
Fields, 33Keys, 4Procedures, 16Events, 11
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Warehouse/Activity/WarehouseActivityHeader.Table.al1130 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.Warehouse.Activity;
using Microsoft.Assembly.Document;
using Microsoft.Finance.ReceivablesPayables;
using Microsoft.Foundation.NoSeries;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Setup;
using Microsoft.Inventory.Transfer;
using Microsoft.Projects.Project.Planning;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Warehouse.Activity.History;
using Microsoft.Warehouse.Comment;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Request;
using Microsoft.Warehouse.Setup;
table 5766 "Warehouse Activity Header"
{
Caption = 'Warehouse Activity Header';
LookupPageID = "Warehouse Activity List";
DataClassification = CustomerContent;
fields
{
field(1; Type; Enum "Warehouse Activity Type")
{
Caption = 'Type';
ToolTip = 'Specifies the type of activity, such as Put-away, that the warehouse performs on the lines that are attached to the header.';
}
field(2; "No."; Code[20])
{
Caption = 'No.';
ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';
trigger OnValidate()
begin
if "No." <> xRec."No." then begin
NoSeries.TestManual(GetNoSeriesCode());
"No. Series" := '';
end;
end;
}
field(3; "Location Code"; Code[10])
{
Caption = 'Location Code';
ToolTip = 'Specifies the code for the location where the warehouse activity takes place.';
TableRelation = Location where("Use As In-Transit" = const(false));
trigger OnValidate()
var
WMSManagement: Codeunit "WMS Management";
begin
if "Location Code" <> xRec."Location Code" then
if LineExist() then
Error(Text002, FieldCaption("Location Code"));
if "Location Code" <> '' then
if not WMSManagement.LocationIsAllowed("Location Code") then
Error(SetUpWarehouseEmployeeInLocationErr, UserId, FieldCaption("Location Code"), "Location Code");
GetLocation("Location Code");
case Type of
Type::"Invt. Put-away":
if ((Location.Code <> '') and ProdWhseHandlingIsInventoryPutaway(Location) and ("Source Document" <> "Source Document"::"Prod. Output")) or
((Location.Code = '') and Location.RequireReceive("Location Code") and ("Source Document" <> "Source Document"::"Prod. Output"))
then
Validate("Source Document", "Source Document"::"Prod. Output");
Type::"Invt. Pick":
if (Location.Code = '') and Location.RequireShipment("Location Code") then
Location.TestField("Require Shipment", false);
Type::"Invt. Movement":
Location.TestField("Directed Put-away and Pick", false);
end;
end;
}
field(4; "Assigned User ID"; Code[50])
{
Caption = 'Assigned User ID';
ToolTip = 'Specifies the ID of the user who is responsible for the document.';
DataClassification = EndUserIdentifiableInformation;
TableRelation = "Warehouse Employee" where("Location Code" = field("Location Code"));
trigger OnValidate()
begin
if "Assigned User ID" <> '' then begin
"Assignment Date" := Today;
"Assignment Time" := Time;
end else begin
"Assignment Date" := 0D;
"Assignment Time" := 0T;
end;
end;
}
field(5; "Assignment Date"; Date)
{
Caption = 'Assignment Date';
ToolTip = 'Specifies the date when the user was assigned the activity.';
Editable = false;
}
field(6; "Assignment Time"; Time)
{
Caption = 'Assignment Time';
ToolTip = 'Specifies the time when the user was assigned the activity.';
Editable = false;
}
field(7; "Sorting Method"; Enum "Whse. Activity Sorting Method")
{
Caption = 'Sorting Method';
ToolTip = 'Specifies the method by which the lines are sorted on the warehouse header, such as Item or Document.';
trigger OnValidate()
begin
if "Sorting Method" <> xRec."Sorting Method" then
SortWhseDoc();
end;
}
field(9; "No. Series"; Code[20])
{
Caption = 'No. Series';
TableRelation = "No. Series";
}
field(10; Comment; Boolean)
{
CalcFormula = exist("Warehouse Comment Line" where("Table Name" = const("Whse. Activity Header"),
Type = field(Type),
"No." = field("No.")));
Caption = 'Comment';
Editable = false;
FieldClass = FlowField;
}
field(12; "No. Printed"; Integer)
{
Caption = 'No. Printed';
Editable = false;
}
field(13; "No. of Lines"; Integer)
{
CalcFormula = count("Warehouse Activity Line" where("Activity Type" = field(Type),
"No." = field("No."),
"Source Type" = field("Source Type Filter"),
"Source Subtype" = field("Source Subtype Filter"),
"Source No." = field("Source No. Filter"),
"Location Code" = field("Location Filter")));
Caption = 'No. of Lines';
ToolTip = 'Specifies the number of lines in the warehouse activity document.';
Editable = false;
FieldClass = FlowField;
}
field(14; "Source Type Filter"; Integer)
{
Caption = 'Source Type Filter';
FieldClass = FlowFilter;
}
field(15; "Source Subtype Filter"; Option)
{
Caption = 'Source Subtype Filter';
FieldClass = FlowFilter;
OptionCaption = '0,1,2,3,4,5,6,7,8,9,10';
OptionMembers = "0","1","2","3","4","5","6","7","8","9","10";
}
field(16; "Source No. Filter"; Code[250])
{
Caption = 'Source No. Filter';
FieldClass = FlowFilter;
}
field(17; "Location Filter"; Code[250])
{
Caption = 'Location Filter';
FieldClass = FlowFilter;
TableRelation = Location;
ValidateTableRelation = false;
}
field(20; "Posting Date"; Date)
{
Caption = 'Posting Date';
ToolTip = 'Specifies the date when the warehouse activity should be recorded as being posted.';
}
field(61; "Registering No."; Code[20])
{
Caption = 'Registering No.';
}
field(62; "Last Registering No."; Code[20])
{
Caption = 'Last Registering No.';
Editable = false;
TableRelation = if (Type = const("Put-away")) "Registered Whse. Activity Hdr."."No." where(Type = const("Put-away"))
else
if (Type = const(Pick)) "Registered Whse. Activity Hdr."."No." where(Type = const(Pick))
else
if (Type = const(Movement)) "Registered Whse. Activity Hdr."."No." where(Type = const(Movement));
}
field(63; "Registering No. Series"; Code[20])
{
Caption = 'Registering No. Series';
TableRelation = "No. Series";
trigger OnLookup()
begin
WhseActivHeader := Rec;
WhseSetup.Get();
TestNoSeries();
if NoSeries.LookupRelatedNoSeries(GetRegisteringNoSeriesCode(), WhseActivHeader."Registering No. Series") then
WhseActivHeader.Validate(WhseActivHeader."Registering No. Series");
Rec := WhseActivHeader;
end;
trigger OnValidate()
begin
if "Registering No. Series" <> '' then begin
WhseSetup.Get();
TestNoSeries();
NoSeries.TestAreRelated(GetRegisteringNoSeriesCode(), "Registering No. Series");
end;
end;
}
field(7303; "Date of Last Printing"; Date)
{
Caption = 'Date of Last Printing';
Editable = false;
}
field(7304; "Time of Last Printing"; Time)
{
Caption = 'Time of Last Printing';
Editable = false;
}
field(7305; "Breakbulk Filter"; Boolean)
{
AccessByPermission = TableData "Warehouse Source Filter" = R;
Caption = 'Breakbulk Filter';
ToolTip = 'Specifies that the intermediate Take and Place lines will not show as put-away, pick, or movement lines, when the quantity in the larger unit of measure is being put-away, picked or moved completely.';
trigger OnValidate()
begin
if "Breakbulk Filter" <> xRec."Breakbulk Filter" then
SetBreakbulkFilter();
end;
}
field(7306; "Source No."; Code[20])
{
Caption = 'Source No.';
ToolTip = 'Specifies the number of the source document that the entry originates from.';
trigger OnValidate()
var
WarehouseRequest: Record "Warehouse Request";
CreateInventoryPutAway: Codeunit "Create Inventory Put-away";
CreateInventoryPickMovement: Codeunit "Create Inventory Pick/Movement";
begin
if "Source No." <> xRec."Source No." then begin
if LineExist() then
Error(Text002, FieldCaption("Source No."));
if "Source No." <> '' then begin
TestField("Location Code");
TestField("Source Document");
end;
ClearDestinationFields();
if ("Source Type" <> 0) and ("Source No." <> '') then begin
if Type = Type::"Invt. Put-away" then begin
WarehouseRequest.Get(
WarehouseRequest.Type::Inbound, "Location Code", "Source Type", "Source Subtype", "Source No.");
WarehouseRequest.TestField("Document Status", WarehouseRequest."Document Status"::Released);
CreateInventoryPutAway.SetWhseRequest(WarehouseRequest, true);
CreateInventoryPutAway.Run(Rec);
end;
if Type = Type::"Invt. Pick" then begin
WarehouseRequest.Get(
WarehouseRequest.Type::Outbound, "Location Code", "Source Type", "Source Subtype", "Source No.");
WarehouseRequest.TestField("Document Status", WarehouseRequest."Document Status"::Released);
CreateInventoryPickMovement.SetWhseRequest(WarehouseRequest, true);
CreateInventoryPickMovement.Run(Rec);
end;
if Type = Type::"Invt. Movement" then begin
WarehouseRequest.Get(
WarehouseRequest.Type::Outbound, "Location Code", "Source Type", "Source Subtype", "Source No.");
WarehouseRequest.TestField("Document Status", WarehouseRequest."Document Status"::Released);
CreateInventoryPickMovement.SetInvtMovement(true);
CreateInventoryPickMovement.SetWhseRequest(WarehouseRequest, true);
CreateInventoryPickMovement.Run(Rec);
end;
end;
end;
end;
}
field(7307; "Source Document"; Enum "Warehouse Activity Source Document")
{
BlankZero = true;
Caption = 'Source Document';
ToolTip = 'Specifies the type of document that the line relates to.';
trigger OnValidate()
var
AssemblyLine: Record "Assembly Line";
begin
if "Source Document" <> xRec."Source Document" then begin
if LineExist() then
Error(Text002, FieldCaption("Source Document"));
"Source No." := '';
ClearDestinationFields();
if Type = Type::"Invt. Put-away" then begin
GetLocation("Location Code");
if Location.RequireReceive("Location Code") then
TestField("Source Document", "Source Document"::"Prod. Output");
end;
end;
case "Source Document" of
"Source Document"::"Purchase Order":
begin
"Source Type" := Database::"Purchase Line";
"Source Subtype" := 1;
end;
"Source Document"::"Purchase Return Order":
begin
"Source Type" := Database::"Purchase Line";
"Source Subtype" := 5;
end;
"Source Document"::"Sales Order":
begin
"Source Type" := Database::"Sales Line";
"Source Subtype" := 1;
end;
"Source Document"::"Sales Return Order":
begin
"Source Type" := Database::"Sales Line";
"Source Subtype" := 5;
end;
"Source Document"::"Outbound Transfer":
begin
"Source Type" := Database::"Transfer Line";
"Source Subtype" := 0;
end;
"Source Document"::"Inbound Transfer":
begin
"Source Type" := Database::"Transfer Line";
"Source Subtype" := 1;
end;
"Source Document"::"Assembly Consumption":
begin
"Source Type" := Database::"Assembly Line";
"Source Subtype" := AssemblyLine."Document Type"::Order.AsInteger();
end;
"Source Document"::"Job Usage":
begin
"Source Type" := Database::"Job Planning Line";
"Source Subtype" := 2; // Job Planning Line Status::Order
end;
else
OnValidateSourceDocumentOnAssignSourceType(Rec);
end;
if "Source Document" = "Source Document"::" " then begin
"Source Type" := 0;
"Source Subtype" := 0;
end;
end;
}
field(7308; "Source Type"; Integer)
{
Caption = 'Source Type';
}
field(7309; "Source Subtype"; Option)
{
Caption = 'Source Subtype';
Editable = false;
OptionCaption = '0,1,2,3,4,5,6,7,8,9,10';
OptionMembers = "0","1","2","3","4","5","6","7","8","9","10";
}
field(7310; "Destination Type"; enum "Warehouse Destination Type")
{
Caption = 'Destination Type';
ToolTip = 'Specifies information about the type of destination, such as customer or vendor, associated with the warehouse activity.';
}
field(7311; "Destination No."; Code[20])
{
Caption = 'Destination No.';
ToolTip = 'Specifies the number or the code of the customer or vendor that the line is linked to.';
TableRelation = if ("Destination Type" = const(Vendor)) Vendor
else
if ("Destination Type" = const(Customer)) Customer
else
if ("Destination Type" = const(Location)) Location
else
if ("Destination Type" = const(Item)) Item
else
if ("Destination Type" = const("Sales Order")) "Sales Header"."No." where("Document Type" = const(Order));
}
field(7312; "External Document No."; Code[35])
{
Caption = 'External Document No.';
ToolTip = 'Specifies a document number that refers to the customer''s or vendor''s numbering system.';
}
field(7313; "Expected Receipt Date"; Date)
{
Caption = 'Expected Receipt Date';
ToolTip = 'Specifies the date you expect the items to be available in your warehouse. If you leave the field blank, it will be calculated as follows: Planned Receipt Date + Safety Lead Time + Inbound Warehouse Handling Time = Expected Receipt Date.';
}
field(7314; "Shipment Date"; Date)
{
Caption = 'Shipment Date';
ToolTip = 'Specifies when items on the document are shipped or were shipped. A shipment date is usually calculated from a requested delivery date plus lead time.';
}
field(7315; "External Document No.2"; Code[35])
{
Caption = 'External Document No.2';
ToolTip = 'Specifies an additional part of the document number that refers to the customer''s or vendor''s numbering system.';
}
field(7316; "Do Not Fill Qty. to Handle"; Boolean)
{
Caption = 'Do Not Fill Qty. to Handle';
}
}
keys
{
key(Key1; Type, "No.")
{
Clustered = true;
}
key(Key2; "Location Code", "Shipment Date")
{
}
key(Key3; "Source Document", "Source No.", "Location Code")
{
}
key(Key4; "Assigned User ID")
{
}
}
fieldgroups
{
fieldgroup(Brick; "Location Code", "No.", "No. of Lines", "Source Document", "Source No.", "Assigned User ID")
{ }
}
trigger OnDelete()
begin
DeleteWhseActivHeader();
end;
trigger OnInsert()
begin
if "No." = '' then begin
TestNoSeries();
"No. Series" := GetNoSeriesCode();
if NoSeries.AreRelated("No. Series", xRec."No. Series") then
"No. Series" := xRec."No. Series";
"No." := NoSeries.GetNextNo("No. Series", "Posting Date");
end;
if NoSeries.IsAutomatic(GetRegisteringNoSeriesCode()) then
"Registering No. Series" := GetRegisteringNoSeriesCode();
end;
trigger OnRename()
begin
Error(Text000, TableCaption);
end;
var
Location: Record Location;
WhseActivHeader: Record "Warehouse Activity Header";
WhseSetup: Record "Warehouse Setup";
InvtSetup: Record "Inventory Setup";
NoSeries: Codeunit "No. Series";
#pragma warning disable AA0074
#pragma warning disable AA0470
Text000: Label 'You cannot rename a %1.';
#pragma warning restore AA0470
#pragma warning restore AA0074
SetUpWarehouseEmployeeInLocationErr: Label 'You must first set up user %1 as a warehouse employee. %2 %3', Comment = '%1 - user ID, %2 - caption, %3 - location code.';
#pragma warning disable AA0074
#pragma warning disable AA0470
Text002: Label 'You cannot change %1 because one or more lines exist.';
#pragma warning restore AA0470
#pragma warning restore AA0074
procedure AssistEdit(OldWhseActivHeader: Record "Warehouse Activity Header"): Boolean
begin
WhseActivHeader := Rec;
TestNoSeries();
if NoSeries.LookupRelatedNoSeries(GetNoSeriesCode(), OldWhseActivHeader."No. Series", WhseActivHeader."No. Series")
then begin
WhseActivHeader."No." := NoSeries.GetNextNo(WhseActivHeader."No. Series");
Rec := WhseActivHeader;
exit(true);
end;
end;
local procedure GetNoSeriesCode() NoSeriesCode: Code[20]
begin
case Type of
Type::"Put-away":
begin
WhseSetup.Get();
NoSeriesCode := WhseSetup."Whse. Put-away Nos.";
end;
Type::Pick:
begin
WhseSetup.Get();
NoSeriesCode := WhseSetup."Whse. Pick Nos.";
end;
Type::Movement:
begin
WhseSetup.Get();
NoSeriesCode := WhseSetup."Whse. Movement Nos.";
end;
Type::"Invt. Put-away":
begin
InvtSetup.Get();
NoSeriesCode := InvtSetup."Inventory Put-away Nos.";
end;
Type::"Invt. Pick":
begin
InvtSetup.Get();
NoSeriesCode := InvtSetup."Inventory Pick Nos.";
end;
Type::"Invt. Movement":
begin
InvtSetup.Get();
NoSeriesCode := InvtSetup."Inventory Movement Nos.";
end;
end;
OnAfterGetNoSeriesCode(Rec, NoSeriesCode);
exit(NoSeriesCode);
end;
local procedure TestNoSeries()
begin
case Type of
Type::"Put-away":
begin
WhseSetup.Get();
WhseSetup.TestField("Whse. Put-away Nos.");
end;
Type::Pick:
begin
WhseSetup.Get();
WhseSetup.TestField("Whse. Pick Nos.");
end;
Type::Movement:
begin
WhseSetup.Get();
WhseSetup.TestField("Whse. Movement Nos.");
end;
Type::"Invt. Put-away":
begin
InvtSetup.Get();
InvtSetup.TestField("Inventory Put-away Nos.");
end;
Type::"Invt. Pick":
begin
InvtSetup.Get();
InvtSetup.TestField("Inventory Pick Nos.");
end;
Type::"Invt. Movement":
begin
InvtSetup.Get();
InvtSetup.TestField("Inventory Movement Nos.");
end;
end;
end;
local procedure GetRegisteringNoSeriesCode(): Code[20]
var
InventorySetup: Record "Inventory Setup";
IsHandled: Boolean;
Result: Code[20];
begin
WhseSetup.Get();
IsHandled := false;
OnBeforeGetRegisteringNoSeriesCode(Rec, WhseSetup, Result, IsHandled);
if IsHandled then
exit(Result);
case Type of
Type::"Put-away":
exit(WhseSetup."Registered Whse. Put-away Nos.");
Type::Pick:
exit(WhseSetup."Registered Whse. Pick Nos.");
Type::Movement:
exit(WhseSetup."Registered Whse. Movement Nos.");
Type::"Invt. Movement":
begin
InventorySetup.Get();
exit(InventorySetup."Registered Invt. Movement Nos.");
end;
end;
end;
procedure SortWhseDoc()
var
WhseActivLine2: Record "Warehouse Activity Line";
WhseActivLine3: Record "Warehouse Activity Line";
SequenceNo: Integer;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeSortWhseDoc(Rec, IsHandled);
if not IsHandled then begin
WhseActivLine2.LockTable();
WhseActivLine2.SetRange("Activity Type", Type);
WhseActivLine2.SetRange("No.", "No.");
case "Sorting Method" of
"Sorting Method"::Item:
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Item No.");
"Sorting Method"::Document:
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Location Code", "Source Document", "Source No.");
"Sorting Method"::"Shelf or Bin":
SortWhseDocByShelfOrBin(WhseActivLine2, SequenceNo);
"Sorting Method"::"Due Date":
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Due Date");
"Sorting Method"::"Ship-To":
WhseActivLine2.SetCurrentKey(
"Activity Type", "No.", "Destination Type", "Destination No.");
"Sorting Method"::"Bin Ranking":
SortWhseDocByBinRanking(WhseActivLine2, SequenceNo);
"Sorting Method"::"Action Type":
SortWhseDocByActionType(WhseActivLine2, SequenceNo);
else
OnCaseSortWhseDoc(Rec, WhseActivLine2, SequenceNo);
end;
if SequenceNo = 0 then begin
WhseActivLine2.SetRange("Breakbulk No.", 0);
if WhseActivLine2.Find('-') then begin
SequenceNo := 10000;
repeat
SetActivityFilter(WhseActivLine2, WhseActivLine3);
if WhseActivLine3.Find('-') then
repeat
WhseActivLine3."Sorting Sequence No." := SequenceNo;
WhseActivLine3.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine3.Next() = 0;
WhseActivLine2."Sorting Sequence No." := SequenceNo;
WhseActivLine2.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine2.Next() = 0;
end;
end;
end;
OnAfterSortWhseDoc(Rec);
end;
procedure SortWhseDocByShelfOrBin(var WhseActivLine2: Record "Warehouse Activity Line"; var SequenceNo: Integer)
var
WhseActivLine3: Record "Warehouse Activity Line";
TempWhseActivLine: Record "Warehouse Activity Line" temporary;
SortingOrder: Option Bin,Shelf;
begin
GetLocation("Location Code");
if Location."Bin Mandatory" then begin
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Bin Code");
if WhseActivLine2.Find('-') then
if WhseActivLine2."Activity Type" <> WhseActivLine2."Activity Type"::Pick
then begin
SequenceNo := 10000;
WhseActivLine2.SetRange("Action Type", WhseActivLine2."Action Type"::Place);
WhseActivLine2.SetRange("Breakbulk No.", 0);
if WhseActivLine2.Find('-') then
repeat
TempWhseActivLine.Init();
TempWhseActivLine.Copy(WhseActivLine2);
TempWhseActivLine.Insert();
until WhseActivLine2.Next() = 0;
TempWhseActivLine.SetRange("Breakbulk No.", 0);
if TempWhseActivLine.Find('-') then
repeat
WhseActivLine2.SetRange("Breakbulk No.", 0);
WhseActivLine2.SetRange("Action Type", WhseActivLine2."Action Type"::Take);
WhseActivLine2.SetRange("Whse. Document Type", TempWhseActivLine."Whse. Document Type");
WhseActivLine2.SetRange("Whse. Document No.", TempWhseActivLine."Whse. Document No.");
WhseActivLine2.SetRange("Whse. Document Line No.", TempWhseActivLine."Whse. Document Line No.");
OnSortWhseDocByShelfOrBinOnBeforeWhseActivLine2Find(WhseActivLine2, TempWhseActivLine);
if WhseActivLine2.Find('-') then
repeat
SortTakeLines(WhseActivLine2, SequenceNo);
WhseActivLine3.Get(
TempWhseActivLine."Activity Type",
TempWhseActivLine."No.", TempWhseActivLine."Line No.");
WhseActivLine3."Sorting Sequence No." := SequenceNo;
WhseActivLine3.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine2.Next() = 0;
until TempWhseActivLine.Next() = 0;
end else begin
SortLinesBinShelf(WhseActivLine2, SequenceNo, SortingOrder::Bin);
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Sorting Sequence No.");
end;
end else begin
SortLinesBinShelf(WhseActivLine2, SequenceNo, SortingOrder::Shelf);
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Sorting Sequence No.");
end;
end;
local procedure SortWhseDocByBinRanking(var WhseActivLine2: Record "Warehouse Activity Line"; var SequenceNo: Integer)
var
WhseActivLine3: Record "Warehouse Activity Line";
BreakBulkWhseActivLine: Record "Warehouse Activity Line";
begin
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Bin Ranking");
WhseActivLine2.SetRange("Breakbulk No.", 0);
if WhseActivLine2.Find('-') then begin
SequenceNo := 10000;
WhseActivLine2.SetRange("Action Type", WhseActivLine2."Action Type"::Take);
if WhseActivLine2.Find('-') then
repeat
SetActivityFilter(WhseActivLine2, WhseActivLine3);
if WhseActivLine3.Find('-') then
repeat
WhseActivLine3."Sorting Sequence No." := SequenceNo;
WhseActivLine3.Modify();
SequenceNo := SequenceNo + 10000;
BreakBulkWhseActivLine.Copy(WhseActivLine3);
BreakBulkWhseActivLine.SetRange("Action Type", WhseActivLine3."Action Type"::Place);
BreakBulkWhseActivLine.SetRange("Breakbulk No.", WhseActivLine3."Breakbulk No.");
if BreakBulkWhseActivLine.Find('-') then
repeat
BreakBulkWhseActivLine."Sorting Sequence No." := SequenceNo;
BreakBulkWhseActivLine.Modify();
SequenceNo := SequenceNo + 10000;
until BreakBulkWhseActivLine.Next() = 0;
until WhseActivLine3.Next() = 0;
WhseActivLine2."Sorting Sequence No." := SequenceNo;
WhseActivLine2.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine2.Next() = 0;
WhseActivLine2.SetRange("Action Type", WhseActivLine2."Action Type"::Place);
WhseActivLine2.SetRange("Breakbulk No.", 0);
if WhseActivLine2.Find('-') then
repeat
WhseActivLine2."Sorting Sequence No." := SequenceNo;
WhseActivLine2.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine2.Next() = 0;
end;
end;
local procedure SortWhseDocByActionType(var WhseActivLine2: Record "Warehouse Activity Line"; var SequenceNo: Integer)
var
WhseActivLine3: Record "Warehouse Activity Line";
begin
WhseActivLine2.SetCurrentKey("Activity Type", "No.", "Action Type", "Bin Code");
WhseActivLine2.SetRange("Action Type", WhseActivLine2."Action Type"::Take);
if WhseActivLine2.Find('-') then begin
SequenceNo := 10000;
repeat
WhseActivLine2."Sorting Sequence No." := SequenceNo;
WhseActivLine2.Modify();
SequenceNo := SequenceNo + 10000;
if WhseActivLine2."Breakbulk No." <> 0 then begin
WhseActivLine3.Copy(WhseActivLine2);
WhseActivLine3.SetRange("Action Type", WhseActivLine2."Action Type"::Place);
WhseActivLine3.SetRange("Breakbulk No.", WhseActivLine2."Breakbulk No.");
if WhseActivLine3.Find('-') then
repeat
WhseActivLine3."Sorting Sequence No." := SequenceNo;
WhseActivLine3.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine3.Next() = 0;
end;
until WhseActivLine2.Next() = 0;
end;
WhseActivLine2.SetRange("Action Type", WhseActivLine2."Action Type"::Place);
WhseActivLine2.SetRange("Breakbulk No.", 0);
if WhseActivLine2.Find('-') then
repeat
WhseActivLine2."Sorting Sequence No." := SequenceNo;
WhseActivLine2.Modify();
SequenceNo := SequenceNo + 10000;
until WhseActivLine2.Next() = 0;
end;
local procedure SortTakeLines(var NewWhseActivLine2: Record "Warehouse Activity Line"; var NewSequenceNo: Integer)
var
WhseActivLine3: Record "Warehouse Activity Line";
begin
if not NewWhseActivLine2.Mark() then begin
WhseActivLine3.Copy(NewWhseActivLine2);
WhseActivLine3.SetRange("Bin Code", NewWhseActivLine2."Bin Code");
WhseActivLine3.SetFilter("Breakbulk No.", '<>0');
WhseActivLine3.SetRange("Action Type");
if WhseActivLine3.Find('-') then
repeat
WhseActivLine3."Sorting Sequence No." := NewSequenceNo;
WhseActivLine3.Modify();
NewSequenceNo := NewSequenceNo + 10000;
until WhseActivLine3.Next() = 0;
NewWhseActivLine2.Mark(true);
NewWhseActivLine2."Sorting Sequence No." := NewSequenceNo;
NewWhseActivLine2.Modify();
NewSequenceNo := NewSequenceNo + 10000;
end;
end;
procedure SortLinesBinShelf(var WarehouseActivityLineParam: Record "Warehouse Activity Line"; var SeqNo: Integer; SortOrder: Option Bin,Shelf)
var
WarehouseActivityLineLocal: Record "Warehouse Activity Line";
TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary;
NewSequenceNo: Integer;
begin
TempWarehouseActivityLine.DeleteAll();
SeqNo := 0;
WarehouseActivityLineLocal.Copy(WarehouseActivityLineParam);
WarehouseActivityLineLocal.SetCurrentKey("Activity Type", "No.", "Line No.");
if not WarehouseActivityLineLocal.FindSet() then
exit;
repeat
if (SortOrder = SortOrder::Bin) and
(WarehouseActivityLineLocal."Action Type" = WarehouseActivityLineLocal."Action Type"::Take) or
(SortOrder = SortOrder::Shelf) and
(WarehouseActivityLineLocal."Action Type" = WarehouseActivityLineLocal."Action Type"::" ")
then begin
TempWarehouseActivityLine := WarehouseActivityLineLocal;
TempWarehouseActivityLine.Insert();
end;
until WarehouseActivityLineLocal.Next() = 0;
case SortOrder of
SortOrder::Bin:
TempWarehouseActivityLine.SetCurrentKey("Activity Type", "No.", "Bin Code", "Shelf No.");
SortOrder::Shelf:
TempWarehouseActivityLine.SetCurrentKey("Activity Type", "No.", "Shelf No.");
end;
if not TempWarehouseActivityLine.Find('-') then
exit;
NewSequenceNo := 0;
repeat
NewSequenceNo += 10000;
WarehouseActivityLineLocal.Get(
TempWarehouseActivityLine."Activity Type", TempWarehouseActivityLine."No.", TempWarehouseActivityLine."Line No.");
WarehouseActivityLineLocal."Sorting Sequence No." := NewSequenceNo;
WarehouseActivityLineLocal.Modify();
NewSequenceNo += 10000;
if WarehouseActivityLineLocal.Next() <> 0 then
if WarehouseActivityLineLocal."Action Type" = WarehouseActivityLineLocal."Action Type"::Place then begin
WarehouseActivityLineLocal."Sorting Sequence No." := NewSequenceNo;
WarehouseActivityLineLocal.Modify();
end;
until TempWarehouseActivityLine.Next() = 0;
SeqNo := NewSequenceNo;
end;
local procedure SetBreakbulkFilter()
var
WhseActivLine: Record "Warehouse Activity Line";
begin
WhseActivLine.SetRange("Activity Type", Type);
WhseActivLine.SetRange("No.", "No.");
WhseActivLine.SetRange("Original Breakbulk", true);
if "Breakbulk Filter" then
WhseActivLine.ModifyAll(Breakbulk, true)
else
WhseActivLine.ModifyAll(Breakbulk, false)
end;
procedure SetActivityFilter(var WhseActivLineFrom: Record "Warehouse Activity Line"; var WhseActivLineTo: Record "Warehouse Activity Line")
begin
WhseActivLineTo.Copy(WhseActivLineFrom);
WhseActivLineTo.SetRange("Bin Code", WhseActivLineFrom."Bin Code");
WhseActivLineTo.SetFilter("Breakbulk No.", '<>0');
WhseActivLineTo.SetRange("Whse. Document Type", WhseActivLineFrom."Whse. Document Type");
WhseActivLineTo.SetRange("Whse. Document No.", WhseActivLineFrom."Whse. Document No.");
WhseActivLineTo.SetRange("Whse. Document Line No.", WhseActivLineFrom."Whse. Document Line No.");
end;
local procedure DeleteWhseActivHeader()
var
WhseActivLine2: Record "Warehouse Activity Line";
WhseCommentLine: Record "Warehouse Comment Line";
begin
WhseActivLine2.SetRange("Activity Type", Type);
WhseActivLine2.SetRange("No.", "No.");
if WhseActivLine2.FindFirst() then
WhseActivLine2.DeleteRelatedWhseActivLines(WhseActivLine2, true);
WhseCommentLine.SetRange("Table Name", WhseCommentLine."Table Name"::"Whse. Activity Header");
WhseCommentLine.SetRange(Type, Type);
WhseCommentLine.SetRange("No.", "No.");
WhseCommentLine.DeleteAll();
OnAfterDeleteWhseActivHeader(Rec);
end;
local procedure GetLocation(LocationCode: Code[10])
begin
if LocationCode = '' then
Clear(Location)
else
if Location.Code <> LocationCode then
Location.Get(LocationCode);
end;
procedure LookupActivityHeader(var CurrentLocationCode: Code[10]; var WhseActivHeader: Record "Warehouse Activity Header")
begin
Commit();
if UserId <> '' then begin
WhseActivHeader.FilterGroup := 2;
WhseActivHeader.SetRange("Location Code");
end;
if PAGE.RunModal(0, WhseActivHeader) = ACTION::LookupOK then;
if UserId <> '' then begin
WhseActivHeader.FilterGroup := 2;
WhseActivHeader.SetRange("Location Code", WhseActivHeader."Location Code");
WhseActivHeader.FilterGroup := 0;
end;
CurrentLocationCode := WhseActivHeader."Location Code";
end;
procedure LineExist(): Boolean
var
WhseActivLine: Record "Warehouse Activity Line";
begin
WhseActivLine.SetRange("Activity Type", Type);
WhseActivLine.SetRange("No.", "No.");
exit(not WhseActivLine.IsEmpty);
end;
procedure FindFirstAllowedRec(Which: Text[1024]): Boolean
var
WhseActivHeader: Record "Warehouse Activity Header";
WMSManagement: Codeunit "WMS Management";
begin
if Find(Which) then begin
WhseActivHeader := Rec;
while true do begin
if WMSManagement.LocationIsAllowedToView("Location Code") then
exit(true);
if Next(1) = 0 then begin
Rec := WhseActivHeader;
if Find(Which) then
while true do begin
if WMSManagement.LocationIsAllowedToView("Location Code") then
exit(true);
if Next(-1) = 0 then
exit(false);
end;
end;
end;
end;
exit(false);
end;
procedure FindNextAllowedRec(Steps: Integer): Integer
var
WhseActivHeader: Record "Warehouse Activity Header";
WMSManagement: Codeunit "WMS Management";
RealSteps: Integer;
NextSteps: Integer;
begin
RealSteps := 0;
if Steps <> 0 then begin
WhseActivHeader := Rec;
repeat
NextSteps := Next(Steps / Abs(Steps));
if WMSManagement.LocationIsAllowedToView("Location Code") then begin
RealSteps := RealSteps + NextSteps;
WhseActivHeader := Rec;
end;
until (NextSteps = 0) or (RealSteps = Steps);
Rec := WhseActivHeader;
if not Find() then;
end;
exit(RealSteps);
end;
procedure ErrorIfUserIsNotWhseEmployee()
var
WMSManagement: Codeunit "WMS Management";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeErrorIfUserIsNotWhseEmployee("Location Code", IsHandled);
if IsHandled then
exit;
WMSManagement.CheckUserIsWhseEmployee();
end;
procedure GetUserLocation(): Code[10]
var
WarehouseEmployee: Record "Warehouse Employee";
LocationCode: Code[10];
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeGetUserLocation(LocationCode, IsHandled);
if IsHandled then
exit(LocationCode);
WarehouseEmployee.SetCurrentKey(Default);
WarehouseEmployee.SetRange("User ID", UserId);
WarehouseEmployee.SetRange(Default, true);
if WarehouseEmployee.FindFirst() then
exit(WarehouseEmployee."Location Code");
WarehouseEmployee.SetRange(Default);
WarehouseEmployee.FindFirst();
exit(WarehouseEmployee."Location Code");
end;
local procedure ClearDestinationFields()
begin
"Destination Type" := "Destination Type"::" ";
"Destination No." := '';
end;
procedure Lock()
begin
LockTable();
if FindLast() then;
end;
procedure BinCodeMandatory(): Boolean;
begin
GetLocation("Location Code");
exit(Location."Bin Mandatory");
end;
internal procedure IsInvoiceNoMandatory(): Boolean
var
PostingSelectionManagement: Codeunit "Posting Selection Management";
begin
exit(PostingSelectionManagement.IsPostingInvoiceMandatoryPurchase());
end;
internal procedure AssignToCurrentUser()
begin
if Rec.IsEmpty() then
exit;
Rec.Validate("Assigned User ID", UserId());
Rec.Modify()
end;
internal procedure ProdWhseHandlingIsInventoryPutaway(Location: Record Location) Result: Boolean
begin
OnProdWhseHandlingIsInventoryPutaway(Location, Result);
end;
/// <summary>
/// Determines whether the inbound transfer should be posted in one step.
/// </summary>
/// <returns>True if the transfer should post shipment and receipt together; otherwise, false.</returns>
internal procedure PostInboundTransferInOneStep(): Boolean
var
TransferHeader: Record "Transfer Header";
begin
if Rec."Source Type" <> Database::"Transfer Line" then
exit(false);
if Rec.Type = "Warehouse Activity Type"::"Invt. Put-away" then
exit(false);
TransferHeader.SetLoadFields("Direct Transfer", "Transfer-to Code");
if TransferHeader.Get(Rec."Source No.") then
exit(TransferHeader.ShouldPostReceiptWithShipment());
end;
[IntegrationEvent(false, false)]
local procedure OnAfterDeleteWhseActivHeader(var WarehouseActivityHeader: Record "Warehouse Activity Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterGetNoSeriesCode(var WarehouseActivityHeader: Record "Warehouse Activity Header"; var NoSeriesCode: Code[20])
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeErrorIfUserIsNotWhseEmployee(LocationCode: Code[10]; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeGetUserLocation(var LocationCode: Code[10]; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeSortWhseDoc(var WarehouseActivityHeader: Record "Warehouse Activity Header"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCaseSortWhseDoc(WarehouseActivityHeader: Record "Warehouse Activity Header"; var WarehouseActivityLine: Record "Warehouse Activity Line"; var SequenceNo: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeGetRegisteringNoSeriesCode(var WarehouseActivityHeader: Record "Warehouse Activity Header"; WarehouseSetup: Record "Warehouse Setup"; var Result: Code[20]; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSortWhseDoc(var WarehouseActivityHeader: Record "Warehouse Activity Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnSortWhseDocByShelfOrBinOnBeforeWhseActivLine2Find(var WarehouseActivityLine2: Record "Warehouse Activity Line"; var TempWarehouseActivityLine: Record "Warehouse Activity Line" temporary)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnValidateSourceDocumentOnAssignSourceType(var WarehouseActivityHeader: Record "Warehouse Activity Header")
begin
end;
[InternalEvent(false)]
local procedure OnProdWhseHandlingIsInventoryPutaway(Location: Record Location; var Result: Boolean)
begin
end;
}