Please find below a sample program using the BAPI ‘BAPI_SALESORDER_CHANGE’ to demonstrate how to update the reason for rejection (VBAP-ABGRU) for all items in a sales order.

REPORT ztestbapiso1.


************************************************************************
* DATA DECLARATIONS                                                    *
************************************************************************
*Tables:
TABLES:
  vbap.

*Internal tables:
DATA:
  gt_vbap           TYPE STANDARD TABLE OF vbap,
  gt_item_in        TYPE STANDARD TABLE OF bapisditm,
  gt_item_inx       TYPE STANDARD TABLE OF bapisditmx,
  gt_return         TYPE STANDARD TABLE OF bapiret2.

*Field Symbols:
FIELD-SYMBOLS:
  <fs_vbap>         TYPE vbap.

*Structures:
DATA:
  gst_item_hedx     TYPE bapisdh1x,
  gst_item_in       TYPE bapisditm,
  gst_item_inx      TYPE bapisditmx.

*Variables:
DATA:
  gv_msg            TYPE string.

*Constants:
CONSTANTS:
  gc_error          TYPE string VALUE ': An error occured, no change done to the sales order.',
  gc_success        TYPE string VALUE ': Sales order changed successfully.'.

************************************************************************
* SELECTION SCREEN                                                     *
************************************************************************
SELECT-OPTIONS:
*  Sales Order Number.
   s_vbeln FOR vbap-vbeln OBLIGATORY.

PARAMETERS:
*   Reason for Rejection.
    p_abgru TYPE vbap-abgru OBLIGATORY.


************************************************************************
* CODE LOGIC                                                           *
************************************************************************

*Select sales order data from table VBAP.
SELECT *
  FROM vbap
  INTO TABLE gt_vbap
  WHERE vbeln IN s_vbeln.

IF sy-subrc EQ 0.

  LOOP AT gt_vbap ASSIGNING <fs_vbap>.

*   (Order Header Level)
*   Setting the update flag at order header level to update mode.
    gst_item_hedx-updateflag = 'U'.

*   (Order Item Level)
*   Setting of the material number(MATNR) at order item level.
    gst_item_in-material = <fs_vbap>-matnr.

*   Setting of the item number(POSNR) at order item level.
    gst_item_in-itm_number  = <fs_vbap>-posnr.
    gst_item_inx-itm_number = <fs_vbap>-posnr.

*   Setting of the reason for rejection(ABGRU) at order item level.
    gst_item_in-reason_rej  = p_abgru.
    gst_item_inx-reason_rej = 'X'.

*   Setting the update flag at order item level to update mode.
    gst_item_inx-updateflag = 'U'.

*   BAPI items level tables:
    APPEND:
      gst_item_in  TO gt_item_in,
      gst_item_inx TO gt_item_inx.

*   Calling BAPI to update reason for rejection in the selected sales order.
    CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
      EXPORTING
        salesdocument    = <fs_vbap>-vbeln
        order_header_inx = gst_item_hedx
      TABLES
        return           = gt_return
        order_item_in    = gt_item_in
        order_item_inx   = gt_item_inx.

*   Preparing the result message.
    CONCATENATE <fs_vbap>-vbeln   " Sales Order Number
                <fs_vbap>-posnr   " Item Number
           INTO gv_msg            " Message
   SEPARATED BY space.            " Space

*   Check if at least one error was raised by the BAPI. Loop inside
*   loop is not advise, however, the return table will contains small
*   amount of entries. We can use that for our demo.
    LOOP AT gt_return TRANSPORTING NO FIELDS
    WHERE type EQ 'E'
       OR type EQ 'A'.

*     Exit and rollback changes.
      EXIT.

    ENDLOOP.

*   If error found, rollback database changes.
    IF sy-subrc EQ 0.

*     Rollback changes.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

*     Preparing error message.
      CONCATENATE gv_msg        "Sales Order and Item Number
                  gc_error      "Error Message
             INTO gv_msg
     SEPARATED BY space.

*     Output message.
      WRITE / gv_msg.

*   Else, no error found, commit database changes.
    ELSE.

*     Commit changes.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = abap_true.

*     Preparing success message.
      CONCATENATE gv_msg        "Sales Order and Item Number
                  gc_success    "Success Message
             INTO gv_msg
     SEPARATED BY space.

*     Output message.
      WRITE / gv_msg.

    ENDIF.

*   Write a line after each sales order.
    AT END OF vbeln.
      WRITE: sy-uline.
    ENDAT.

*   Clearing of variables and structures:
    CLEAR:
*     Variables:
      gv_msg,
*     Structures:
      gst_item_hedx,
      gst_item_in,
      gst_item_inx.

*   Refreshing internal tables:
    REFRESH:
      gt_item_in,
      gt_item_inx,
      gt_return.

  ENDLOOP.

ENDIF.


Serkan AKKAVAK
Computer Engineer
ABAP Developer & SAP S/4 HANA Logistics Consultant
Contact : serkurumsal@yandex.com