How-to: Sorting of Orders
Description
Examples of sorting Order list
This information applies to Planned functions.
There are two types of events for sorting orders:
OnAfterSetCurrentKey
Set Sorting Key Fields (Standard fields only)
Set Sorting Direction
OnAfterSetFrom
Set Sorting Key Fields (Custom fields)
Event flow for retrieving Orders and Lines
OnSetFilter-events
Reads data from source tables
Add Filters
Modify Filters
OnAfterSetFrom-events
Data goes into accessor table "BaseOrderLineElement"
Add Data
Modify Data
Set Sorting Key Fields (Custom fields)
OnAfterSetCurrentKey-events
Set Sorting Key Fields (ONLY standard fields)
Set Sorting Direction
See more: Planned Functions
1: Sorting on standard fields (OnAfterSetCurrentKey)
Change key
Use
.SetCurrentKey(field)
-function with any of the existing fields from the Header table (Record parameter on this event).
Change direction
Use
.Ascending(true/false)
-function.-
2: Sorting on custom fields (OnAfterSetFrom)
To change sorting key use Set_Sorting1()-
function.
Change sorting direction
This is done in two steps:
Use OnAfterSetFrom[ and the
Set_Sorting1()
-function.Use OnAfterSetCurrentKey and the
.Ascending()
-function.
Affect all sources by using "Any"-events
If you work across locations you might also want to filter across all of them
For example, the sorting for Receive orders list is:
Warehouse Receipts
Purchase Orders
Transfer Orders
Sales Return Orders
All four document sources can be in the same list (with each internally ordered by document numbers)
If you filter across all document types, then use the "Any"-event, else use the document-specific event(s)
Sorting on Existing fields ("OnAfterSetCurrentKey"-events)
Example 1
Change key to existing field "Item no."
Change sorting direction to "Descending"
[EventSubscriber(ObjectType::Codeunit, Codeunit::"MOB WMS Put Away", 'OnGetPutAwayOrderLines_OnAfterSetCurrentKey', '', true, true)]
procedure OnGetPutAwayOrderLines_OnAfterSetCurrentKey(var _BaseOrderLineElementView: Record "MOB Ns BaseDataModel Element")
begin
_BaseOrderLineElementView.SetCurrentKey(ItemNumber);
_BaseOrderLineElementView.Ascending(false);
end;
Example 2
Change key to existing field "Order No."
[EventSubscriber(ObjectType::Codeunit, Codeunit::"MOB WMS Receive", 'OnGetReceiveOrders_OnAfterSetCurrentKey', '', true, true)]
procedure OnGetReceiveOrders_OnAfterSetCurrentKey(var _BaseOrderElementView: Record "MOB Ns BaseDataModel Element")
begin
_BaseOrderElementView.SetCurrentKey(BackendID);
_BaseOrderElementView.Ascending(true);
end;
Sorting on Custom fields ("OnAfterSetFrom"-events)
Note. For this task: you must both:
Set the value
Enable sorting on it
Example 1:
Sort any pick by "Assigned User ID"
Sort on "Assigned User ID'" from the source RecordRef
For this "AnyEvent" the RecordRef can be "Warehouse Activity Header", "Sales Header", "Purchase Header" or "Transfer Header" depending on what documents are available to pick
[EventSubscriber(ObjectType::Codeunit, Codeunit::"MOB WMS Pick", 'OnGetPickOrders_OnAfterSetFromAnyHeader', '', true, true)]
local procedure MySortByCustomTag_OnGetPickOrders_OnAfterSetFromAnyHeader(_RecRef: RecordRef; var _BaseOrderElement: Record "MOB Ns BaseDataModel Element")
var
DataTypeManagement: Codeunit "Data Type Management";
NewFieldRef: FieldRef;
begin
if DataTypeManagement.FindFieldByName(_RecRef, NewFieldRef, 'Assigned User ID') then
_BaseOrderElement.SetValue('AssignedUserID', 'Assigned to: ' + CopyStr(NewFieldRef.Value(), 1, NewFieldRef.Length()));
_BaseOrderElement.Set_Sorting1(_BaseOrderElement.GetValue('AssignedUserID'));
end;
Example 2:
Sort only “Warehouse Picks” by "Assigned User ID"
Sort on "Assigned User ID'" from the Source Warehouse Activity Header
[EventSubscriber(ObjectType::Codeunit, Codeunit::"MOB WMS Pick", 'OnGetPickOrders_OnAfterSetFromWarehouseActivityHeader', '', true, true)]
local procedure My02GetPickOrders_OnAfterSetFromWarehouseActivityHeader(_WhseActHeader: Record "Warehouse Activity Header"; var _BaseOrderElement: Record "MOB Ns BaseDataModel Element")
begin
_BaseOrderElement.SetValue('AssignedUserID', 'Assigned to: ' + _WhseActHeader."Assigned User ID");
_BaseOrderElement.Set_Sorting1(_BaseOrderElement.GetValue('AssignedUserID'));
end;