Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Description

Excerpt

Examples for including/excluding orders using basic filtering

This information applies to all Planned functions.

There are two methods for Filtering Orders

OnSetFilter: Basic filtering using Header Fields (this article)
Works with both Standard and Custom header fields
  • OnInclude: Complex per-document condition
    • Used for conditions that cannot be solved by OnSetFilter
    • Orders/Lines cannot be "re-included" once excluded via OnSetFilter-events. See How-to: Filter Orders - Complex
  • Tips

     Add your own fields to an existing header

    Description

    Excerpt

    Examples for including/excluding orders using basic filtering


    This information applies to all Planned functions.

    There are two methods for filtering orders

    1. OnSetFilter: Basic filter  (this article)
      • Works with both standard and custom Header-fields

    2. OnInclude: Complex per-document filter
      • Used for conditions that cannot be solved by OnSetFilter.
      • Elements cannot be "re-included" once excluded via OnSetFilter-events
      • See How-to: Filter Orders - Complex

    See also


    Expand
    titleEvent flow for getting Orders and Lines
    1. ...OnSetFilter-events

      • Reads data from source tables
        • Add Filters
        • Modify Filters


    2. ...OnAfterSetFrom-events

      • Data goes into accessor table "BaseOrderLineElement"
        • Add Data
        • Modify Data
        • Set Sorting Key Fields (Custom fields)


    3. ...OnAfterSetCurrentKey-events

      • Data is sorted
        • Set Sorting Key Fields (ONLY standard fields)
        • Set Sorting Direction


    4. (XML Response is transmitted to the Mobile Device)

    See more: Planned Functions

    See also Use Headers


    Examples

    Table of Contents
    maxLevel3
    minLevel3
    include.*?(\bExample\b)


    How to handle filters

    Step 1 - Select the event

    Select the correct event for the function area you are working on.

    Filter by label (Content by label)
    showLabelsfalse
    max25
    showSpacefalse
    sorttitle
    reversetrue
    cqllabel = "bc" and label = "orders" and label = "onsetfilter" and label = "integrationevent" and ancestor = "47220743"

     

    Step 2 - Structure your code

    Make sure to affect all related documents if needed

    Example: A change in filter "PO Number" should affect both:

    • "Warehouse Receipts"
    • "Purchase Orders"

    Make your code callable from both events:

    • OnGetReceiveOrders_OnSetFilterPurchaseOrder

    • OnGetReceiveOrders_OnSetFilterWarehouseReceipt

    Important note:

    • Line filters also affect Orders. If no Lines fits the filter, then the corresponding Order is excluded


    Step 3 - Write your code

    You are given these parameters to use for your filtering

    Expand
    titleClick to view parameters
    • _HeaderFilter.Name
    • _HeaderFilter.Value
      • The filter value collected from the mobile user
      • Use or Modify this value for filtering

    • _WhseReceiptHeader:
      • Resulting filtering set of Orders
      • Apply filters to affect the resulting OrderList

    • _WhseReceiptLine
      • Resulting filtering set of Order Lines
      • Apply filters to affect the resulting OrderList
        • Line filters also affects which Order are included
        • Empty lines = the order is not relevant
    • _IsHandled
      • Use this to decide whether the Standard code should continue to apply the filter as normal
      • You might want to Piggyback on a standard filter OR Overrule it


    Examples

    Note: The examples use Receive function, but works for all Planned Functions


    Example 01: Modify "Location" filter


        [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrders_OnSetFilterWarehouseReceipt''', true, true)]
            local procedure Example01_Additional_Location_Filtering(_HeaderFilter: Record "MOB NS Request Element"; var _WhseReceiptHeader: Record "Warehouse Receipt Header"; var _WhseReceiptLine: Record "Warehouse Receipt Line"; var _IsHandled: Boolean)
        begin
            // [Scenario]
            // Modify "Location" filter
            // Only if location is = "WHITE" OR "GREEN". Set filter to include Both Location, no matter which is chosen
            // Handle the filter, so standard filter is overruled

            if _HeaderFilter.Name = 'Location' then
                if _HeaderFilter."Value" IN ['WHITE''GREEN'then begin
                    _WhseReceiptHeader.SetFilter("Location Code", '%1|%2''WHITE''GREEN');
                    _IsHandled := true;
                end;

            // When Filter is NOT "White" or "Green", the standard code runs as normal and filters on the choosen location
        end;

       


    Example 02: Modify "Expected Receipt Date" filter


        [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrders_OnSetFilterWarehouseReceipt''', true, true)]
        local procedure Example02_Overrule_ExptRecptDate_Filter(_HeaderFilter: Record "MOB NS Request Element"; var _WhseReceiptHeader: Record "Warehouse Receipt Header"; var _WhseReceiptLine: Record "Warehouse Receipt Line"; var _IsHandled: Boolean)
        begin
            // [Scenario]
            // Add additional Receipt lines are default filtered for "Due Date" filter to the standard using the formula <=%1 where %1 is "Expected Receipt Date" filter on Receipt Lines
            // Note: A filter
            // Overrule the filter to always search one year from the current workdate

            // Filter on LINES will also affect which Orders are included
            // Handle the filter, so standard filter is overruledORDERS that are included

            if _HeaderFilter.Name = 'Date' then begin


                // We use a "static" filter, not the dynamic "_HeaderFilter.Value" from the user
                // Filter due date 1 year higher than current year


                _WhseReceiptLine.SetFilter("Due Date", '..%1', CalcDate('<CY+1Y>', WorkDate()));  // One year from the current workdate
                _IsHandled := true;
            end;
        end;


    Example 03: Modify "Purchase Order" filter


       [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrders_OnSetFilterWarehouseReceipt''', true, true)]
           local procedure Example03_Validate_PurchaseOrder_Filter(_HeaderFilter: Record "MOB NS Request Element"; var _WhseReceiptHeader: Record "Warehouse Receipt Header"; var _WhseReceiptLine: Record "Warehouse Receipt Line"; var _IsHandled: Boolean)
        var
            PurchaseHeader: Record "Purchase Header";
        begin
            // [Scenario]
            // Add validation to the "Purchase Order" filter by checking the order is Open
            // If not, abort process and force user to change filter


            if _HeaderFilter.Name = 'PurchaseOrderNumber' then
                if PurchaseHeader.Get(PurchaseHeader."Document Type"::"Order", _HeaderFilter."Value") and (PurchaseHeader.Status <> PurchaseHeader.Status::Releasedthen
                    Error('Purchase Order %1 is not released', PurchaseHeader."No.")// We use "error" since filter a single document no. (Error is not recommended for common filtering)

            // _IsHandled: No point in handling the filter or not, as Error stops the entire proces if needed
        end;

      

    Example 04: Modify "Assigned User" filter


        [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrders_OnSetFilterWarehouseReceipt''', true, true)]
        procedure Example04_Overrule_AssignedUserAll_Filter(_HeaderFilter: Record "MOB NS Request Element"; var _WhseReceiptHeader: Record "Warehouse Receipt Header"; var _WhseReceiptLine: Record "Warehouse Receipt Line"; var _IsHandled: Boolean)
        local begin
            // [Scenario]
            // Overrule when the standard filter "Assigned User" is set to "All"
            // Instead of no filter, set a filter that must not be Blank
            // Handle the filter, so standard filter is overruled


            if _HeaderFilter.Name = 'AssignedUser' then
                if _HeaderFilter."Value" = 'All' then begin
                    _WhseReceiptHeader.SetFilter("Assigned User ID", '<>%1''');  // Order must be assigned to someone
                    _IsHandled := true;
                end;
        end;

    Example 05: Modify "ScannedValue" filter

    If you are scanning an Encoded Barcode (GS1) then you have to update the"orderFilterGs1AI" on Planned (Service) Mobile Configuration.

    See Select Order by scan (scannedValue) for details.


        [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrders_OnSetFilterWarehouseReceipt''', true, true)]
            local procedure Example05_Validate_ScannedValue_Filter(_HeaderFilter: Record "MOB NS Request Element"; var _WhseReceiptHeader: Record "Warehouse Receipt Header"; var _WhseReceiptLine: Record "Warehouse Receipt Line"; var _IsHandled: Boolean)
        begin
            // [Scenario]
            // Overrule when the standard filter "Scanned Value"

            // Instead of searching for Item No., use the value to filter Document no.
            // Handle the filter, so standard filter is overruled


            if _HeaderFilter.Name = 'ScannedValue' then begin
                _WhseReceiptHeader.SetRange("No.", _HeaderFilter."Value");
                _IsHandled := true;
            end;
        end;

      



    Receive Order filters

    Press the filter icon to show the header filter


    Put-away Order filter


    Pick Order filter