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.

Jun 17, 2026

Upload Internal Table to AL11 in Sap Abap

To upload internal table data to the SAP Application Server (Transaction AL11), you must use standard ABAP Dataset statements: OPEN DATASET, TRANSFER, and CLOSE DATASET. 

Below is a direct answer and complete guide on how to implement this programmatically. 
1. Simple Text Mode Upload
Use TEXT MODE if you want to upload data as a standard text file or CSV. 
abap
DATA: lv_filepath TYPE string VALUE '/usr/sap/interfaces/test_file.txt',
      ls_data     TYPE ty_your_structure. " Replace with your structure type

" Step 1: Open the application server file path
OPEN DATASET lv_filepath FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.

IF sy-subrc = 0.
  " Step 2: Loop through the internal table and transfer records
  LOOP AT lt_internal_table INTO ls_data.
    TRANSFER ls_data TO lv_filepath.
  --ENDLOOP.

  " Step 3: Close the dataset (Mandatory)
  CLOSE DATASET lv_filepath.
  MESSAGE 'File uploaded successfully to AL11' TYPE 'S'.
ELSE.
  MESSAGE 'Error opening file path on AL11' TYPE 'E'.
ENDIF.
2. Comma-Separated Values (CSV) Upload 
If you want to view the fields properly structured in a spreadsheet layout later, convert the table to a string/CSV format using SAP_CONVERT_TO_CSV_FORMAT before sending it to the server.
abap
DATA: lv_filepath   TYPE string VALUE '/tmp/sales_data.csv',
      lt_csv_format TYPE truxs_t_text_data, " Standard table type for text
      lv_csv_line   TYPE string.

" Step 1: Convert internal table to CSV structure
CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT'
  EXPORTING
    i_field_seperator    = ','
  TABLES
    i_tab_sap_data       = lt_internal_table
  CHANGING
    i_tab_converted_data = lt_csv_format
  EXCEPTIONS
    conversion_failed    = 1
    OTHERS               = 2.

IF sy-subrc = 0.
  " Step 2: Write to Application Server
  OPEN DATASET lv_filepath FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  
  IF sy-subrc = 0.
    LOOP AT lt_csv_format INTO lv_csv_line.
      TRANSFER lv_csv_line TO lv_filepath.
    ENDLOOP.
    CLOSE DATASET lv_filepath.
  ENDIF.
ENDIF.
3. Binary Mode Upload (For Excel / Zip / Images)
Use BINARY MODE if your data is an XSTRING or raw binary data stream (e.g., generating an actual .xlsx file using cl_salv_bs_lex). 
abap
DATA: lv_filepath TYPE string VALUE '/usr/sap/interfaces/report.xlsx',
      lv_xstring  TYPE xstring. " Contains your binary file data

OPEN DATASET lv_filepath FOR OUTPUT IN BINARY MODE.
IF sy-subrc = 0.
  TRANSFER lv_xstring TO lv_filepath.
  CLOSE DATASET lv_filepath.
ENDIF.
Key Syntax Reminders
  • FOR OUTPUT: Opens a file for writing. If the file already exists, this completely overwrites its contents.
  • FOR APPENDING: Opens a file and places the cursor at the end of the existing text. Use this if you want to append new rows without losing old logs.
  • ENCODING DEFAULT: Mandatory constraint for text mode file handling in modern Unicode SAP environments. 
If you would like, tell me:
  • What file type do you want to create in AL11 (TXT, CSV, XLSX)?
  • Are you handling large datasets that require specific block sizing?
I can provide the exact target layout adjustments or helper class transformations you need!