Versions Compared

Key

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


Info
titleMinimum Requirements

Extension version MOB5.27 and Android App 1v1.5.9

Description

Excerpt

Dynamically add extra steps by interrupting posting to collect steps based on values from previous steps.

...


Overview

Table of Contents
maxLevel2
minLevel2
excludeDescription|Examples|Overview


Example 1: Three steps with interdependence for Ship

...

...

Important: "HasValue()" must be used to check if a step has been registered and ensures a step is never returned more than once

  1. Step1 is always shown
  2. Step2 is only shown if step1 has a value > 5
  3. Step3 is only shown if step2 has a value > 5


    [EventSubscriber(ObjectType::Codeunit, Codeunit::"MOB WMS Ship", 'OnPostShipOrder_OnAddStepsToWarehouseShipmentHeader', '', false, false)]
    localprocedure"MOB WMS Ship_OnPostShipOrder_OnAddStepsToWarehouseShipmentHeader"(var_OrderValues: Record"MOB Common Element"; _WhseShipmentHeader: Record"Warehouse Shipment Header"; var_StepsElement: Record"MOB Steps Element")
    begin
        // Step1 is always shown
        ifnot_OrderValues.HasValue('Step1') thenbegin
            _StepsElement.Create_IntegerStep(10, 'Step1');
            _StepsElement.Set_header('Step1');
            _StepsElement.Set_optional(true);
        end;

        // Step2 depends on Step1
        ifnot_OrderValues.HasValue('Step2') then
            if_OrderValues.GetValueAsDecimal('Step1') >5thenbegin// Step 1 has to be over 5
                _StepsElement.Create_IntegerStep(20, 'Step2');
                _StepsElement.Set_header('Step2');
                _StepsElement.Set_optional(true);
            end;

        // Step3 depends on Step2 (implicit Step 1)
        ifnot_OrderValues.HasValue('Step3') then
            if_OrderValues.GetValueAsDecimal('Step2') >5thenbegin// Step 2  both has to be over 5
                _StepsElement.Create_IntegerStep(2030, 'Step3');
                _StepsElement.Set_header('Step3');
                _StepsElement.Set_optional(true);
            end;
    end;


Example 2 & 3: Posting Date for Receive

...

    // OnGetReceiveOrderLines
    // Create a RadioButton step in the default header collector (for warehouse receipts only)
    [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrderLines_OnAddStepsToAnyHeader''', true, true)]
    local procedure MyOnGetReceiveOrderLines_OnAddStepsToAnyHeader(_RecRef: RecordRefvar _StepsElement: Record "MOB Steps Element")
    begin
        if _RecRef.Number() <> Database::"Warehouse Receipt Header" then
            exit;

        _StepsElement.Create_RadioButtonStep(10000'MyPostingDateRadioButtonStep');
        _StepsElement.Set_header('Posting Date');
        _StepsElement.Set_listValues('Today;Yesterday;Other date');
        _StepsElement.Set_defaultValue('Today');
    end;

Step 1.2 - Interrupt posting (conditionally) to pick posting date from a calendar

...

    // OnPostReceiveOrder
    // Create a conditional step on posting based on collected value from the 'MyPostingDateRadioButtonStep' created above
    [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnPostReceiveOrder_OnAddStepsToWarehouseReceiptHeader''', true, true)]
    local procedure MyOnPostReceiveOrder_OnAddStepsToWarehouseReceiptHeader(var _OrderValues: Record "MOB Common Element"; _WhseReceiptHeader: Record "Warehouse Receipt Header"; var _StepsElement: Record "MOB Steps Element")
    begin
        // Break when any option different from 'Other date' was selected in the 'MyPostingDateRadioButtonStep'
        if _OrderValues.GetValue('MyPostingDateRadioButtonStep'<> 'Other date' then
            exit;


        // Break if new datestep for 'Other date' is already collected to prevent infinite loop
        if _OrderValues.HasValue('MyPostingDate'then
            exit;

        // Create a new date step for manually selecting Posting Date
        _StepsElement.Create_DateStep(10000'MyPostingDate');
        _StepsElement.Set_header('Posting Date');
        _StepsElement.Set_minDate(Today() 10);
        _StepsElement.Set_maxDate(Today());
    end;

Step 1.3 - Set Posting Date

...

    // OnPostReceiveOrder
    // Set new posting date including using a value from conditional step 'MyPostingDate'
    [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnPostReceiveOrder_OnBeforePostWarehouseReceipt''', true, true)]
    local procedure MyOnPostReceiveOrder_OnBeforePostWarehouseReceipt(var _OrderValues: Record "MOB Common Element"; var _WhseReceiptHeader: Record "Warehouse Receipt Header")
    var
        PostingDate: Date;
    begin
        case _OrderValues.GetValue('MyPostingDateRadioButtonStep'of
            'Today':
                PostingDate := Today();
            'Yesterday':
                PostingDate := Today() 1;
            'Other date':
                PostingDate := _OrderValues.GetValueAsDate('MyPostingDate', true);
        end;

        if (PostingDate <> 0D) and (PostingDate <> _WhseReceiptHeader."Posting Date"then
            _WhseReceiptHeader.Validate("Posting Date", PostingDate);
    end;


Example 3: Add extra steps for all document sources (AnyHeader)

...

    // OnGetReceiveOrderLines
    // Create a step in the default header collector (displayed for "Warehouse Receipt" and "Purchase Order", but not "Transfer Order" or "Sales Return Order")
    [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnGetReceiveOrderLines_OnAddStepsToAnyHeader''', true, true)]
    local procedure MyOnGetReceiveOrderLines_OnAddStepsToAnyHeader(_RecRef: RecordRefvar _StepsElement: Record "MOB Steps Element")
    begin
        if (_RecRef.Number() in [Database::"Warehouse Receipt Header", Database::"Purchase Header"]then begin
            _StepsElement.Create_RadioButtonStep(10000'MyPostingDateRadioButtonStep');
            _StepsElement.Set_header('Posting Date');
            _StepsElement.Set_listValues('Today;Yesterday;Other date');
            _StepsElement.Set_defaultValue('Today');
        end;
    end;

Step 2.2 - Interrupt posting (conditionally) to pick posting date from a calendar

...

    // OnPostReceiveOrder
    // Create a conditional step on posting based on collected value from the 'MyPostingDateRadioButtonStep' created above
    [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnPostReceiveOrder_OnAddStepsToAnyHeader''', true, true)]
    local procedure MyOnPostReceiveOrder_OnAddStepsToAnyHeader(var _OrderValues: Record "MOB Common Element"; _RecRef: RecordRefvar _StepsElement: Record "MOB Steps Element")
    begin
        // Break when any option different from 'Other date' was selected in the 'MyPostingDateRadioButtonStep'
        if _OrderValues.GetValue('MyPostingDateRadioButtonStep'<> 'Other date' then
            exit;


        // Break if new datestep for 'Other date' is already collected to prevent infinite loop
        if _OrderValues.HasValue('MyPostingDate'then
            exit;

        // Create a new date step for manually selecting Posting Date
        _StepsElement.Create_DateStep(10000'MyPostingDate');
        _StepsElement.Set_header('Posting Date');
        _StepsElement.Set_minDate(Today() 10);
        _StepsElement.Set_maxDate(Today());
    end;

Step 2.3 - Set Posting Date

...

    // OnPostReceiveOrder
    // Set new posting date including using a value from conditional step 'MyPostingDate'. Step can exist only for "Warehouse Receipt" or "Purchase Order"
    [EventSubscriber(ObjectType::CodeunitCodeunit::"MOB WMS Receive", 'OnPostReceiveOrder_OnBeforePostAnyOrder''', true, true)]
    local procedure MyOnPostReceiveOrder_OnBeforePostAnyOrder(var _OrderValues: Record "MOB Common Element"; var _RecRef: RecordRef)
    var
        WhseReceiptHeader: Record "Warehouse Receipt Header";
        PurchHeader: Record "Purchase Header";
        PurchRelease: Codeunit "Release Purchase Document";
        PostingDate: Date;
    begin
        case _OrderValues.GetValue('MyPostingDateRadioButtonStep'of
            'Today':
                PostingDate := Today();
            'Yesterday':
                PostingDate := Today() 1;
            'Other date':
                PostingDate := _OrderValues.GetValueAsDate('MyPostingDate', true);
        end;

        case _RecRef.Number() of
            Database::"Warehouse Receipt Header":
                begin
                    _RecRef.SetTable(WhseReceiptHeader);
                    if (PostingDate <> 0D) and (PostingDate <> WhseReceiptHeader."Posting Date"then
                        WhseReceiptHeader.Validate("Posting Date", PostingDate);
                    _RecRef.GetTable(WhseReceiptHeader);
                end;
            Database::"Purchase Header":
                begin
                    _RecRef.SetTable(PurchHeader);
                    PurchRelease.Reopen(PurchHeader);
                    PurchRelease.SetSkipCheckReleaseRestrictions();
                    PurchHeader.SetHideValidationDialog(true);   // same behavior when reprocessing from queue ie. no "change exchange rate" confirmation
                    PurchHeader.Validate("Posting Date", PostingDate);
                    PurchRelease.Run(PurchHeader);
                    _RecRef.GetTable(PurchHeader);
                end;
        end;