Versions Compared

Key

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

This method is executed in the implementation class whenever an action is triggered on by a decision task by the user in OneList.

The actions are configured in OneList and can be used to represent approval decision decisions made by the user for a specific task for example Approve, Reject, Return, etc. 

Method Parameters

Type

Name

Description

Importing

ID_TASK_ID

OneList Task ID being actioned (SAP workflow work item ID)

Importing

ID_ACTION_BY

User Name that triggered the action

Importing

ID_ACTION_ID

OneList Action ID

Importing

ID_ACTION_COMMENT

Action comment entered by the user in OneList

Importing

ID_OBJECT_ID

The object ID of the workflow task (generally, the SAP document number being actioned)

Exception

FAILED_TO_ACTION

Raised exception when the action could not be executed

Method Implementation

Custom ABAP logic can be implemented using the import parameters sent by OneList to execute the desired action outcome in SAP. 

...

Code Block
METHOD execute_action.

    DATA: lo_api TYPE REF TO cl_gbapp_apv_po_api.

    DATA: lt_approval_decision TYPE gbappt_po_approval_decision,
          ls_approval_decision TYPE LINE OF gbappt_po_approval_decision,
          ls_parameter         TYPE LINE OF /iwbep/t_mgw_name_value_pair,
          lt_parameter         TYPE /iwbep/t_mgw_name_value_pair,
          ls_action_result     TYPE gbapps_action_result.

    DATA: ld_po_number TYPE bapimmpara-po_number,
          ld_rel_code  TYPE bapimmpara-po_rel_cod.

    ld_po_number = id_object_id.
    ld_rel_code = me->get_po_rel_code( id_po_number = ld_po_number ).

    lo_api = cl_gbapp_apv_po_api=>get_instance( ).

    CHECK ld_rel_code IS NOT INITIAL.

    CLEAR ls_approval_decision.
    CLEAR lt_approval_decision.
    ls_approval_decision-workitem_id = id_task_id.

    CASE id_action_id.
      WHEN 'RELEASE'.
        ls_approval_decision-decision = '0001'.
        ls_approval_decision-approval_text = id_action_comment.

      WHEN 'REJECT'.
        ls_approval_decision-decision = '0002'.
        ls_approval_decision-rejection_text = id_action_comment.

    ENDCASE.
    APPEND ls_approval_decision TO lt_approval_decision.

    TRY.
        lo_api->set_decision( EXPORTING it_approval_decision = lt_approval_decision
                              IMPORTING es_action_result     = ls_action_result ).
      CATCH /iwbep/cx_mgw_busi_exception .
        RAISE failed_to_action.
    ENDTRY.

  ENDMETHOD.

Below are other sample implementations that cater to various OneList decision workflows.

Standard Decision Task

Code Block
  METHOD execute_action.

*   Call default OneList action via Decision Task

    DATA: lv_wi_id             TYPE swr_struct-workitemid,
          lv_new_wi_status     TYPE sww_wistat,
          lv_return_code       LIKE  sy-subrc,
          lt_message_lines     TYPE TABLE OF swr_messag,
          lt_message_struct    TYPE TABLE OF swr_mstruc,
          ls_container_simple  TYPE swr_cont,
          lt_container_simple  TYPE swrtcont,
          lv_status            TYPE tim_req_status,

          lv_decision_key      TYPE swr_decikey,
          lv_decision_note     TYPE swrsobjid,
          lv_rc                TYPE sy-subrc,
          lv_comment_str       TYPE string,
          lv_comnam            TYPE text255 VALUE gc_comnam,
          lwa_return           TYPE bapiret2,
          lv_newstat           TYPE sww_wistat,

          lt_msglines          TYPE STANDARD TABLE OF swr_messag,
          lt_msgstruct         TYPE STANDARD TABLE OF swr_mstruc,

          lv_new_date_char(10),
          lv_new_date          TYPE datum,
          lv_escalated         TYPE flag,
          lv_must_be_after     TYPE dats.

    FIELD-SYMBOLS: <lfs_msglines>  TYPE swr_messag,
                   <lfs_msgstruct> TYPE swr_mstruc.

    CLEAR: lv_new_date, lv_new_date_char.

    lv_wi_id = id_task_id.
    lv_decision_key = id_action_id.
    lv_decision_note = id_action_comment.

    CALL FUNCTION 'SAP_WAPI_DECISION_COMPLETE'
      EXPORTING
        workitem_id    = lv_wi_id
        user           = id_action_by
        decision_key   = lv_decision_key
        decision_note  = lv_decision_note
      IMPORTING
        return_code    = lv_rc
        new_status     = lv_newstat
      TABLES
        message_lines  = lt_message_lines
        message_struct = lt_message_struct.

    IF lv_rc IS NOT INITIAL.
      READ TABLE lt_message_lines INDEX 1 ASSIGNING FIELD-SYMBOL(<message>).
      MESSAGE ID zcacl_ol_scenario_adpt=>gc_message_id_error
        TYPE <message>-msg_type
        NUMBER zcacl_ol_scenario_adpt=>gc_message_no_error
              WITH <message>-line RAISING failed_to_action.
    ENDIF.

  ENDMETHOD.

HCM Task

Code Block
  METHOD execute_action.
    DATA: lt_messages            TYPE hrasr_return_tab,
          lt_attachments         TYPE hrasr00attachment_tab,
          lt_form_field_values   TYPE hrasr_special_param_tab,
          lt_input_help_values   TYPE hrasr_special_param_tab,
          lt_field_ui_attributes TYPE hrasr_uiattribute_param_tab,
          lt_events              TYPE hrasr00form_events_tab,
          lt_link_lists          TYPE hrasr00link_tab,
          lt_history_details     TYPE hrasr00step_attributes_ui_tab.

    DATA: lv_event TYPE syucomm,
          lv_ok    TYPE abap_bool,
          lv_wi_id TYPE swr_struct-workitemid,
          lv_notes TYPE hrasr_s_special_param-fieldvalue.

    lv_wi_id = iv_task_id.

    lv_notes = iv_action_comment.

    lv_event = if_hrasr00_ui_constants=>c_event_initialize.

    " First, initialize
    CALL FUNCTION 'HRASR_PROCESS_EXECUTE'
      EXPORTING
        iv_wi_id               = lv_wi_id
        iv_event               = lv_event
      IMPORTING
        ev_is_ok               = lv_ok
        et_messages            = et_messages
      CHANGING
        ct_attachments         = lt_attachments
        ct_form_field_values   = lt_form_field_values
        ct_input_help_values   = lt_input_help_values
        ct_field_ui_attributes = lt_field_ui_attributes
        ct_events              = lt_events
        ct_link_lists          = lt_link_lists
        ct_history_details     = lt_history_details.
    IF lv_ok EQ abap_false.
      RAISE failed_to_action.
    ENDIF.

*   Prepare notes
    IF lv_notes IS NOT INITIAL.
      TRY.
          lt_form_field_values[ fieldname = gc_hrasr_current_note ]-fieldvalue = lv_notes.
        CATCH cx_sy_itab_line_not_found.
          INSERT VALUE #( fieldname  = gc_hrasr_current_note
                          fieldvalue = lv_notes )
            INTO TABLE lt_form_field_values.
      ENDTRY.
    ENDIF.

    CLEAR lv_ok.

    CASE iv_action_id.
      WHEN gc_ol_action_id_approve. "APPROVE
        lv_event = if_hrasr00_fpm_constants=>c_event_approve.
      WHEN gc_ol_action_id_reject. "REJECT
        lv_event = if_hrasr00_fpm_constants=>c_event_reject.
      WHEN gc_ol_action_id_back. "BACK
        lv_event = if_hrasr00_fpm_constants=>c_event_backto.
      WHEN OTHERS.
    ENDCASE.

    CALL FUNCTION 'HRASR_PROCESS_EXECUTE'
      EXPORTING
        iv_wi_id               = lv_wi_id
        iv_event               = lv_event
      IMPORTING
        ev_is_ok               = lv_ok
        et_messages            = et_messages
      CHANGING
        ct_attachments         = lt_attachments
        ct_form_field_values   = lt_form_field_values
        ct_input_help_values   = lt_input_help_values
        ct_field_ui_attributes = lt_field_ui_attributes
        ct_events              = lt_events
        ct_link_lists          = lt_link_lists
        ct_history_details     = lt_history_details.
    IF lv_ok EQ abap_false.
      TRY.
          zhrcl_hrasr_ui5_connector=>wait_for_workitem_status( iv_wi_id   = lv_wi_id
                                                               iv_wi_stat = gc_wi_stat_completed ). "COMPLETED
        CATCH zcx_hrasr_ui5_exception.
          RAISE failed_to_action.
      ENDTRY.
    ENDIF.
  ENDMETHOD.

SRM Task

Code Block
  METHOD execute_action.

    CONSTANTS: lc_return_success TYPE bapi_mtype VALUE 'S',
               lc_return_error   TYPE bapi_mtype VALUE 'E'.

    DATA: lv_wi_id    TYPE swr_struct-workitemid,
          lv_decision TYPE bbp_following_action,
          lo_bbp_obj  TYPE REF TO cl_bbp_smtp_inbound_offapp.

    DATA: lv_new_wi_status     TYPE sww_wistat,
          lv_return_code       LIKE  sy-subrc,
          lt_message_lines     TYPE TABLE OF swr_messag,
          lt_message_struct    TYPE TABLE OF swr_mstruc,
          ls_container_simple  TYPE swr_cont,
          lt_container_simple  TYPE swrtcont,
          lv_new_date_char(10),
          lv_new_date          TYPE datum,
          lv_escalated         TYPE flag,
          lv_objid             TYPE crmt_object_id_db,
          lv_objtype           TYPE crmt_subobject_category_db,
          lv_objguid           TYPE bbp_guid,
          lv_objguid2          TYPE bbp_guid_32,
          lv_action            TYPE bbp_wfl_action,
          lv_objchanged        TYPE xfeld,
          lv_must_be_after     TYPE dats,

          lv_comment_str       TYPE string,
          lv_comnam            TYPE text255 VALUE 'Approver Comments',
          lwa_return           TYPE bapiret2,

          lv_wfelem            TYPE swc_elem,
          lv_sc_guid           TYPE /sapsrm/wf_document_guid,
          lv_sc_wiid           TYPE /sapsrm/wf_workitem_id,
          lv_sc_agent          TYPE /sapsrm/wf_agent_id,
          lv_sc_decision       TYPE /sapsrm/wf_decision,
          lv_return            TYPE syst_subrc.

    DATA: lt_simpcont    TYPE STANDARD TABLE OF swr_cont.

    FIELD-SYMBOLS: <lfs_objects>   TYPE swr_object,
                   <lfs_return>    TYPE bapiret2,
                   <lfs_simp_cont> TYPE swr_cont,
                   <lfs_wf_cont>   TYPE /IQX/OL_WF_CONTAINER_SINGLE_ST.

    WRITE: / 'id_task_id:', id_task_id.
    WRITE: / 'id_action_id:', id_action_id.

    lv_wi_id = id_task_id.
    lv_decision = id_action_id.

*   Add approver comments, if there's any
    IF id_action_comment IS NOT INITIAL.
      CLEAR: lwa_return.
      CALL METHOD zprcl_onelist_scart_adapter=>add_approval_notes
        EXPORTING
          im_wiid    = lv_wi_id
          im_comment = lv_comment_str
        IMPORTING
          ex_return  = lwa_return.
      IF lwa_return-type EQ lc_return_success.
*       Successfully added, do nothing.
      ENDIF.

    ENDIF.

*   Read details of WI
*   Get workflow container data
    CALL FUNCTION 'SAP_WAPI_READ_CONTAINER'
      EXPORTING
        workitem_id      = lv_wi_id
      IMPORTING
        return_code      = lv_return
      TABLES
        simple_container = lt_simpcont.

    lv_wfelem = 'BOID'.
    READ TABLE lt_simpcont ASSIGNING <lfs_simp_cont>
      WITH KEY element = lv_wfelem.
    IF sy-subrc EQ 0.

      lv_sc_guid = <lfs_simp_cont>-value.
      lv_sc_wiid = id_task_id.
      lv_sc_agent = id_action_by.
      lv_sc_decision = id_action_id.

      WRITE: / 'lv_sc_guid:', lv_sc_guid.
      WRITE: / 'lv_sc_wiid:', lv_sc_wiid.
      WRITE: / 'lv_sc_agent:', lv_sc_agent.
      WRITE: / 'lv_sc_decision:', lv_sc_decision.

      CALL METHOD /sapsrm/cl_wf_process_mgr_sbwf=>system_decision
        EXPORTING
          iv_document_guid = lv_sc_guid
          iv_workitem_id   = lv_sc_wiid
          iv_agent_id      = lv_sc_agent
          iv_decision      = lv_sc_decision.
      IF sy-subrc EQ 0.
        WRITE: / 'system_decision successful.'.
      ENDIF.
    ELSE.
      MESSAGE ID '00' TYPE 'E' NUMBER 398
              WITH 'Unable to find document.' RAISING failed_to_action.
    ENDIF.

  ENDMETHOD.