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. |