Hello,

Sign up to join our community!

Welcome Back,

Please sign in to your account!

Forgot Password,

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

You must login to ask a question.

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

SAP EWM Help Latest Questions

  • 0
  • 0
admin

Update custom fields in Outbound Delivery Order SAP EWM

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.

Related Questions

Leave an answer

Leave an answer