Jun 21, 2026

SAP ABAP EWM Sample Code for Goods Movement, Reversal, GR and GI

This Function module works for Goods Movement, Reversal, GR and GI 

FUNCTION zdifm_goods_movement .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_DOCNO) TYPE  /SCDL/DL_DOCNO_INT
*"     VALUE(IV_REVERSAL) TYPE  XFELD OPTIONAL
*"  EXPORTING
*"     VALUE(ET_MESSAGE) TYPE  /SCDL/DM_MESSAGE_TAB
*"----------------------------------------------------------------------

  DATA: lo_dlv_save TYPE REF TO /scwm/cl_dlv_management_prd,
        lo_message  TYPE REF TO /scdl/cl_dm_message,
        lt_dlv      TYPE        /scwm/dlv_docid_item_tab,
        ls_dlv      TYPE        /scwm/dlv_docid_item_str,
        lv_gmcat    TYPE        /scdl/dl_doccat.


  lo_dlv_save = /scwm/cl_dlv_management_prd=>get_instance( ).

  SELECT i~docid, i~itemid, h~docno, h~doccat
    FROM /scdl/db_proci_i AS i
    INNER JOIN /scdl/db_proch_i AS h
      ON h~docid = i~docid
    INTO TABLE @DATA(lt_pdi)
    WHERE h~docno = @iv_docno.


  CHECK sy-subrc IS INITIAL.

  LOOP AT lt_pdi INTO DATA(ls_pdi).

    IF sy-tabix = 1.
      lo_dlv_save->get_warehouse(
               EXPORTING iv_doccat = ls_pdi-doccat
                         iv_docid  = ls_pdi-docid
               IMPORTING ev_whno   = DATA(lv_lgnum) ).
    ENDIF.

    ls_dlv-docid  = ls_pdi-docid.
    ls_dlv-itemid = ls_pdi-itemid.
    ls_dlv-doccat = ls_pdi-doccat.
    APPEND ls_dlv TO lt_dlv.

  ENDLOOP.


  CHECK lt_dlv[] IS NOT INITIAL.

  /scwm/cl_tm=>cleanup( iv_lgnum = lv_lgnum ).

  "Reversal GM
  IF iv_reversal IS NOT INITIAL.
    CASE ls_pdi-doccat.
* Goods receipt
      WHEN wmegc_doccat_pdi.                    "PDI Inbound delivery
        "GRR Reverse Goods Receipt/SCDL/IF_DL_DOC_C=>SC_DOCCAT_GRR
        lv_gmcat = /scwm/if_docflow_c=>sc_grr.
* Goods issue
      WHEN wmegc_doccat_pdo                     "PDO Outbound del
        OR /scdl/if_dl_doc_c=>sc_doccat_out_fd. "FDO Document type delivery
        "GI (Goods Issue)  /SCDL/IF_DL_DOC_C=>SC_DOCCAT_GI
        lv_gmcat = /scwm/if_docflow_c=>sc_gir.
    ENDCASE.

  ELSE.                                       "Create Goods Movement
    CASE ls_pdi-doccat.
* Goods receipt
      WHEN wmegc_doccat_pdi.                    "PDI Inbound delivery
        "GR (Goods Receipt)  /SCDL/IF_DL_DOC_C=>SC_DOCCAT_GR
        lv_gmcat = /scwm/if_docflow_c=>sc_gr.
* Goods issue
      WHEN wmegc_doccat_pdo                     "PDO Outbound del
        OR /scdl/if_dl_doc_c=>sc_doccat_out_fd. "FDO Document type delivery
        "GI (Goods Issue)  /SCDL/IF_DL_DOC_C=>SC_DOCCAT_GI
        lv_gmcat = /scwm/if_docflow_c=>sc_gi.
    ENDCASE.

  ENDIF.

  /scwm/cl_goods_movement=>/scwm/if_gm_dlv~post_dlv(
                 EXPORTING it_dlv     = lt_dlv
                           iv_gmcat   = lv_gmcat
                 IMPORTING eo_message = lo_message ).

  "Message handling
  IF lo_message IS BOUND.
    et_message = lo_message->get_messages( ).
    IF et_message[] IS INITIAL.
      ##NEEDED
      lo_dlv_save->save( IMPORTING ev_rejected = DATA(lv_flag_rejected)
                                   et_message  = et_message ).
    ENDIF.
  ENDIF. "lo_message IS BOUND.


  LOOP AT et_message INTO DATA(ls_message)
                     WHERE msgty CA 'AXE'.
    EXIT.
  ENDLOOP.

  IF sy-subrc EQ 0 AND
     ls_message IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.
  ENDIF.

*   /scwm/cl_tm=>cleanup( iv_lgnum = lv_lgnum ).
  CALL METHOD /scwm/cl_tm=>cleanup( ).
  CALL FUNCTION '/SCWM/HUMAIN_REFRESH'.


ENDFUNCTION.

No comments :