This WF-DCN sample illustrates WF-DCN with payload.
FUNCTION ZSUP_MWF_PUSH_WORKITEM.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(DESTINATION) TYPE ZSUP_MWF_CHAR20
*" VALUE(QNAME) TYPE ZSUP_MWF_CHAR20
*" VALUE(QCOUNT) TYPE ZSUP_MWF_INT4
*" VALUE(SUPSECURITY) TYPE ZSUP_MWF_CHAR255CS
*" VALUE(ACTION) TYPE ZSUP_MWF_CHAR1
*" VALUE(WORKITEM) TYPE ZSUP_MWF_CHAR32
*" VALUE(COMPLETE) TYPE ZSUP_MWF_CHAR1 OPTIONAL
*" VALUE(PRIORITY) TYPE ZSUP_MWF_CHAR1 OPTIONAL
*" VALUE(MARKREAD) TYPE ZSUP_MWF_CHAR1 OPTIONAL
*" VALUE(SENDER) TYPE ZSUP_MWF_CHAR255CS OPTIONAL
*" VALUE(RECIPIENT) TYPE ZSUP_MWF_CHAR20 OPTIONAL
*" VALUE(SUBJECT) TYPE ZSUP_MWF_CHAR255CS OPTIONAL
*" VALUE(BODY) TYPE ZSUP_MWF_STRINGCS OPTIONAL
*" TABLES
*" SENDERTEXTS STRUCTURE ZSUP_MWF_PARAM OPTIONAL
*" RECIPIENTS STRUCTURE ZSUP_MWF_PARAM OPTIONAL
*"----------------------------------------------------------------------
"* if complete indicator is set, we directly generate
"* json and execute the push to the http endpoint
IF complete = 'X'.
DATA lv_json_notif TYPE zsup_mwf_stringcs.
"* generate a workitem notification body
CALL FUNCTION 'ZSUP_MWF_GEN_NOTIF_JSON'
EXPORTING
notif_id = workitem
delete = action
markread = markread
priority = priority
to = recipient
from = sender
subject = subject
body = body
IMPORTING
json_out = lv_json_notif.
"* execute http push function module using specified destination
CALL FUNCTION 'ZSUP_MWF_HTTP_POST'
EXPORTING
destination = destination
supsecurity = supsecurity
msg_body = lv_json_notif.
RETURN.
ENDIF.
DATA lv_trfcqnam TYPE trfcqnam VALUE IS INITIAL.
DATA lv_xubname TYPE xubname VALUE IS INITIAL.
DATA ls_userdefault TYPE bapidefaul VALUE IS INITIAL.
DATA lv_lang_iso TYPE t002-laiso VALUE IS INITIAL.
DATA lv_wiid TYPE sww_wiid VALUE IS INITIAL.
DATA lv_wi_text TYPE witext VALUE IS INITIAL.
DATA lv_return_code TYPE sysubrc VALUE IS INITIAL.
DATA lv_subject TYPE zsup_mwf_stringcs VALUE IS INITIAL.
DATA lv_body TYPE zsup_mwf_stringcs VALUE IS INITIAL.
DATA lv_body2 TYPE zsup_mwf_stringcs VALUE IS INITIAL.
DATA lv_sender TYPE zsup_mwf_char255cs VALUE IS INITIAL.
DATA lv_sendertext TYPE zsup_mwf_param VALUE IS INITIAL.
DATA ls_recipient TYPE zsup_mwf_param VALUE IS INITIAL.
DATA lv_recipient TYPE zsup_mwf_char20 VALUE IS INITIAL.
DATA lt_message_struct TYPE TABLE OF swr_mstruc.
DATA lt_alternatives TYPE TABLE OF swr_decialts.
DATA lt_user_parameter TYPE TABLE OF bapiparam.
DATA ls_user_parameter TYPE bapiparam VALUE IS INITIAL.
DATA lt_bapiret2 TYPE TABLE OF bapiret2.
"* loop over all entries in the recipient list
"* and determine the user language, translate
"* the workitem text into the users language
"* and call the function module again with the
"* complete indicator set to push individual
"* notifications to configured destination
LOOP AT recipients INTO ls_recipient.
IF ls_recipient-pkey = 'US'.
"* read user defaults to determine user
"* default language and if user is mobile
"* enabled
MOVE ls_recipient-pvalue TO lv_xubname.
CALL FUNCTION 'BAPI_USER_GET_DETAIL'
EXPORTING
username = lv_xubname
IMPORTING
defaults = ls_userdefault
TABLES
parameter = lt_user_parameter
return = lt_bapiret2.
"* set output language to user default,
"* if not set, set temporarily to default
IF NOT ls_userdefault-langu IS INITIAL.
SET LANGUAGE ls_userdefault-langu.
ELSE.
ls_userdefault-langu = sy-langu.
ENDIF.
"* check returned BAPIRET2 table for any error
"* or abort entries, stops execution in case
"* an error or abort entry is found
PERFORM check_bapiret2 TABLES lt_bapiret2.
"* initialize recipient name to username
MOVE lv_xubname TO lv_recipient.
"* check if user is mobile enabled (ZSUP_ENABLED)
"* and set the recipient name to the mobile username
lv_return_code = 1.
LOOP AT lt_user_parameter INTO ls_user_parameter.
IF ls_user_parameter-parid = 'ZSUP_MWF_ENABLED' AND
ls_user_parameter-parva = 'X'.
lv_return_code = 0.
ENDIF.
ENDLOOP.
"* if the user is not mobile enabled
"* continue with the next entry in the
"* recipient list
IF lv_return_code <> 0.
CONTINUE.
ENDIF.
"* if the notification push is a delete skip the
"* determination of further content for the push such
"* as localized subject and sender, etc.
IF NOT action = 'D'.
"* translate user language code to iso
CALL FUNCTION 'LANGUAGE_CODE_SAP_TO_ISO'
EXPORTING
sap_code = ls_userdefault-langu
IMPORTING
iso_code = lv_lang_iso
EXCEPTIONS
not_found = 1
OTHERS = 2.
"* output MESSAGE to stop execution in case of
"* an error during language code conversion
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno.
ENDIF.
"* read decision in users configured default language
MOVE workitem TO lv_wiid.
CALL FUNCTION 'SAP_WAPI_DECISION_READ'
EXPORTING
workitem_id = lv_wiid
language = ls_userdefault-langu
user = lv_xubname
IMPORTING
return_code = lv_return_code
decision_title = lv_wi_text
TABLES
alternatives = lt_alternatives
message_struct = lt_message_struct.
"* check returned MESSAGE_STRUCT table for any error
"* or abort entries, stops execution in case
"* an error or abort entry is found
IF lv_return_code <> 0.
PERFORM check_message_struct TABLES lt_message_struct.
ENDIF.
"* copy localized version of the decision title
"* into local subject valiable
MOVE lv_wi_text TO lv_subject.
"* loop over all available configured l10n versions
"* of the sender field and determine the match
"* for the particular users default language or
"* use the configured default sender text
LOOP AT sendertexts INTO lv_sendertext.
IF lv_sendertext-pkey CS lv_lang_iso.
lv_sender = lv_sendertext-pvalue.
EXIT.
ELSEIF lv_sendertext-pkey = ''.
lv_sender = lv_sendertext-pvalue.
ENDIF.
ENDLOOP.
"* complete the fixed workitem notification body
"* used for matching and paramater value extract
"* in the SUP notification processing
CONCATENATE body ', USER:' lv_xubname '*#END#*' INTO lv_body.
DATA lv_decision TYPE ZSUP_MWF_CHAR255CS VALUE IS INITIAL.
DATA lv_name TYPE ZSUP_MWF_CHAR20 VALUE IS INITIAL.
DATA lv_description TYPE ZSUp_MWF_STRINGCS VALUE IS INITIAL.
DATA lv_alter TYPE TABLE OF ZSUP_MWF_PARAM .
DATA lv_return TYPE TABLE OF BAPIRET2.
DATA ltater TYPE ZSUP_MWF_PARAM VALUE IS INITIAL.
Move ls_recipient-pvalue to lv_name.
Call Function 'ZSUP_MWF_WI_GETDETAIL'
Exporting
USERNAME = lv_name
WORKITEM = workitem
IMPORTING
DECISION = lv_decision
Description = lv_description
TABLES
RETURN = lv_return
ALTERNATIVES = lv_alter.
CONCATENATE lv_body '","data":[{"id":"'workitem'","pkg":"sup_mwf:1.2","messages":[{"id":"'workitem'","mbo":"Workitem","op":":upsert","cols":{"WORKITEM":"'workitem
'","USERNAME":"'lv_xubname'","DESCRIPTION":"'lv_description'","DECISION":"'lv_decision'"}}'Into lv_body.
loop at lv_alter into ltater.
Concatenate lv_body ',{"id":"'workitem'","mbo":"Alternatives","op":":upsert","cols":{"WORKITEM":"'workitem
'","USERNAME":"'lv_xubname'","PKEY":"'ltater-PKEY'","PVALUE":"'ltater-PVALUE'"}}' Into lv_body.
EndLoop.
Concatenate lv_body ']}],' INTO lv_body.
ENDIF.
"* if qname was not set skip
"* and execute as tRFC
IF qname <> ''.
"* if qcount was specified hash username
"* into one of the possible queues before
"* setting the queue name for qRFC
IF qcount > 0.
PERFORM hash_user_to_queue USING lv_xubname qcount CHANGING qname.
ENDIF.
MOVE qname TO lv_trfcqnam.
CALL FUNCTION 'TRFC_SET_QUEUE_NAME'
EXPORTING
QNAME = lv_trfcqnam.
ENDIF.
"* execute push function module in the background
"* with complete flag set
CALL FUNCTION 'ZSUP_MWF_PUSH_WORKITEM' IN BACKGROUND TASK AS SEPARATE UNIT
EXPORTING
destination = destination
qname = qname
qcount = qcount
supsecurity = supsecurity
action = action
workitem = workitem
complete = 'X'
priority = priority
markread = markread
sender = lv_sender
recipient = lv_recipient
subject = lv_subject
body = lv_body.
ENDIF.
ENDLOOP.
"* tRFC/qRFC requires explicit commit
COMMIT WORK.
ENDFUNCTION.