The code handles EWM Outbound Delivery processing in SAP.
It retrieves ERP delivery information, maps it to the EWM warehouse, locks and reads the delivery, updates extension fields (blocks, texts), and finally saves or rolls back changes with proper error handling.
DATA: lv_bskey TYPE sld_bskey,
lt_items TYPE /scdl/t_sp_a_item,
lt_a_head TYPE /scdl/t_sp_a_head,
ls_sp_action TYPE /scdl/s_sp_act_action,
lt_sp_k_head TYPE /scdl/t_sp_k_head,
ls_include_data TYPE /scwm/dlv_query_incl_str_prd,
ls_dlv_sel TYPE /scwm/dlv_selection_str,
ls_read_options TYPE /scwm/dlv_query_contr_str,
lt_dlv_sel TYPE /scwm/dlv_selection_tab,
lt_a_head_eew TYPE /scdl/t_sp_a_head_eew_prd,
lt_a_head_eew_out TYPE /scdl/t_sp_a_head_eew_prd,
lt_a_item TYPE /scdl/t_sp_a_item,
lt_sp_k_item TYPE /scdl/t_sp_k_item.
DATA: lo_sp TYPE REF TO /scdl/cl_sp_prd_out,
lo_dlv TYPE REF TO /scwm/cl_dlv_management_prd.
* get business system key for sender
SELECT SINGLE bskey
FROM /scmb/tbussys
INTO @DATA(lv_erpbskey)
WHERE logsys EQ @iv_sender.
IF sy-subrc IS INITIAL AND lv_erpbskey IS NOT INITIAL.
* Read warehouse mapping
SELECT *
FROM /scwm/tmapwhnum
INTO TABLE @DATA(lt_tmapwhnum)
WHERE erpbskey EQ @lv_erpbskey
AND whnumerp EQ @iv_erplgnum.
IF sy-subrc IS INITIAL.
" Get warehouse
DATA(lv_lgnum) = VALUE #( lt_tmapwhnum[ 1 ]-whnumwme OPTIONAL ).
ELSE.
" Error to fail queue
MESSAGE e006(zewm_nvda).
ENDIF.
ELSE.
" Error to fail queue
MESSAGE e006(zewm_nvda).
ENDIF.
* create delivery object
lo_dlv = /scwm/cl_dlv_management_prd=>get_instance( ).
* query deliveries
lt_dlv_sel = VALUE #( " Warehouse number
( fieldname = /scwm/if_dl_logfname_c=>sc_whno_i
sign = wmegc_sign_inclusive
option = wmegc_option_eq
low = lv_lgnum )
" ERP delivery
( fieldname = /scdl/if_dl_logfname_c=>sc_refdocno_erp_h
sign = wmegc_sign_inclusive
option = wmegc_option_eq
low = iv_del_no ) ).
ls_read_options = VALUE #( data_retrival_only = abap_true
mix_in_object_instances = /scwm/if_dl_c=>sc_mix_in_load_instance ).
* @raman, please copy logic from /SCWM/WHRHEAD_MON_OUT_COMMON for the below code
ls_include_data = VALUE #( head_status = abap_true
head_status_dyn = 'Y'
item_status = abap_true
head_status_dyn_detail = VALUE #( ( /scdl/if_dl_status_c=>sc_t_packing ) " Packing status (DPC)
( /scdl/if_dl_status_c=>sc_t_picking ) " Picking status (DPI)
( /scdl/if_dl_status_c=>sc_t_picking_dist ) " Picking and Distribution status (DPD)
( /scdl/if_dl_status_c=>sc_t_loading ) " Loading status (DLO)
( /scdl/if_dl_status_c=>sc_t_goods_issue ) ) ). " Goods issue status (DGI)
* Call delivery manager
TRY.
CALL METHOD lo_dlv->query
EXPORTING
it_selection = lt_dlv_sel
iv_doccat = 'PDO'
is_read_options = ls_read_options
is_include_data = ls_include_data
IMPORTING
et_headers = DATA(lt_prd_hdr)
et_items = DATA(lt_items_prd).
CATCH /scdl/cx_delivery. "#EC NO_HANDLER
" Error to fail queue
MESSAGE e007(zewm_nvda).
ENDTRY.
* read header
DATA(ls_hdr) = VALUE #( lt_prd_hdr[ 1 ] OPTIONAL ).
IF ls_hdr IS NOT INITIAL.
" Fill GUID of delivery header
APPEND VALUE #( docid = ls_hdr-docid ) TO lt_sp_k_head.
ELSE.
" Error to fail queue
MESSAGE e007(zewm_nvda).
ENDIF.
lt_sp_k_item = VALUE #( FOR ls_item IN lt_items_prd
( docid = ls_item-docid
itemid = ls_item-itemid ) ).
* create service provider
DATA(lo_message_box) = NEW /scdl/cl_sp_message_box( ).
CREATE OBJECT lo_sp
EXPORTING
io_message_box = lo_message_box
iv_doccat = /scdl/if_dl_doc_c=>sc_doccat_out_prd
iv_mode = /scdl/cl_sp=>sc_mode_classic.
* get real warehouse dont hardcode
/scwm/cl_tm=>set_lgnum( lv_lgnum ).
* lock dlv
lo_sp->lock(
EXPORTING
inkeys = lt_sp_k_head
aspect = /scdl/if_sp_c=>sc_asp_head
lockmode = /scdl/if_sp1_locking=>sc_exclusive_lock
IMPORTING
rejected = DATA(lv_rejected)
return_codes = DATA(lt_return_codes) ).
" Check if any error occurred
IF line_exists( lt_return_codes[ failed = abap_true ] ) OR lv_rejected EQ abap_true.
* RETURN." handle error in real program
" Error to fail queue
MESSAGE e008(zewm_nvda).
ENDIF.
* reading item to avoid short dump in /SCWM/CL_DLV_MSL_FILL_PRD_OUTB
* method DET_MSG_DSH_H line number 16, item data is bnot needed in our logic
lo_sp->select( EXPORTING inkeys = lt_sp_k_item
aspect = /scdl/if_sp_c=>sc_asp_item
IMPORTING outrecords = lt_a_item
rejected = lv_rejected
return_codes = lt_return_codes ).
" Check if any error occurred
IF line_exists( lt_return_codes[ failed = abap_true ] ) OR lv_rejected EQ abap_true.
* RETURN." handle error in real program
" Error to fail queue
MESSAGE e009(zewm_nvda).
ENDIF.
lo_sp->select(
EXPORTING
inkeys = lt_sp_k_head
aspect = /scdl/if_sp_c=>sc_asp_head_eew_prd
IMPORTING
outrecords = lt_a_head_eew
rejected = lv_rejected
return_codes = lt_return_codes ).
" Check if any error occurred
IF line_exists( lt_return_codes[ failed = abap_true ] ) OR lv_rejected EQ abap_true.
* RETURN." handle error in real program
" Error to fail queue
MESSAGE e010(zewm_nvda).
ENDIF.
LOOP AT lt_a_head_eew ASSIGNING FIELD-SYMBOL(<ls_a_head_eew>).
LOOP AT it_extension INTO DATA(ls_ext2).
IF ls_ext2-field = 'DNBLK'.
<ls_a_head_eew>-zzdel_block = ls_ext2-value.
ELSEIF ls_ext2-field = 'CRBLK'.
<ls_a_head_eew>-zzcred_block = ls_ext2-value.
ELSEIF ls_ext2-field = 'DNBLK_TXT'.
<ls_a_head_eew>-zzdel_block_text = ls_ext2-value.
ELSEIF ls_ext2-field = 'CRBLK_TXT'.
<ls_a_head_eew>-zzcred_block_text = ls_ext2-value.
ENDIF.
ENDLOOP.
ENDLOOP.
lo_sp->update(
EXPORTING
inrecords = lt_a_head_eew
aspect = /scdl/if_sp_c=>sc_asp_head_eew_prd
IMPORTING
outrecords = lt_a_head_eew_out
rejected = lv_rejected
return_codes = lt_return_codes ).
" Check if any error occurred
IF line_exists( lt_return_codes[ failed = abap_true ] ) OR lv_rejected EQ abap_true.
" Error to fail queue
MESSAGE e011(zewm_nvda).
ENDIF.
lo_sp->save(
IMPORTING
rejected = lv_rejected ).
* Commit / rollback based on errors
IF lv_rejected IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
CALL METHOD lo_sp->('CLEANUP')
EXPORTING
reason = /scmb/if_sp_transaction=>sc_cleanup_commit.
" Clear buffers and release locks
/scwm/cl_tm=>cleanup( ).
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
" Clear buffers and release locks
/scwm/cl_tm=>cleanup( ).
MESSAGE e012(zewm_nvda).
ENDIF.