Autor Tema: BAPI_SALESORDER_CHANGE - Ejemplo  (Leído 10614 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carlos

  • Usuario Sr.
  • ****
  • Mensajes: 177
    • Ver Perfil
BAPI_SALESORDER_CHANGE - Ejemplo
« en: 09 de Enero de 2020, 10:33:20 am »
Esto es un ejemplo de como actualizar el motivo del rechazo (VBAP-ABGRU) y la cantidad de pedido (VBAP-WMENG) para todos los artículos en un pedido de ventas. "BAPI_SALESORDER_CHANGE"



REPORT ztestbapiso2.
*&--------------------------------------------------------------------&*
*& Program Description:                                               &*
*& -----------------------                                            &*
*& This demo program will update the reason for rejection and the     &*
*& order quantity for all items in a selected sales order.            &*
*&                                                                    &*
*& The program demonstrate the use of the 'BAPI_SALESORDER_CHANGE'.   &*
*&                                                                    &*
*& Author:  ABAPCOOKBOOK          <------                             &*
*& Website: www.abapcookbook.com  <------                             &*
************************************************************************

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

*Internal tables:
DATA:
  gt_vbap               TYPE STANDARD TABLE OF vbap,
  gt_vbep               TYPE STANDARD TABLE OF vbep,
  gt_item_in            TYPE STANDARD TABLE OF bapisditm,
  gt_item_inx           TYPE STANDARD TABLE OF bapisditmx,
  gt_schedule_lines     TYPE STANDARD TABLE OF bapischdl,
  gt_schedule_linesx    TYPE STANDARD TABLE OF bapischdlx,
  gt_return             TYPE STANDARD TABLE OF bapiret2.

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

*Structures:
DATA:
  gst_item_hedx         TYPE bapisdh1x,
  gst_item_in           TYPE bapisditm,
  gst_item_inx          TYPE bapisditmx,
  gst_schedule_lines    TYPE bapischdl,
  gst_schedule_linesx   TYPE bapischdlx.

*Variables:
DATA:
  gv_msg                TYPE string,
  gv_tabix              TYPE sy-tabix.

*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,

* Order Quantity.
  p_wmeng TYPE vbep-wmeng 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.

* Rules 'For All Entries'.
* Not necessary as 'VBELN' and 'POSNR' is already primary key, this
*                                                              logic
* just to demonstrate 'For All Entries' rule.
  SORT gt_vbap BY vbeln posnr.
  DELETE ADJACENT DUPLICATES FROM gt_vbap COMPARING vbeln posnr.

* Retrieving schedule lines entries.
  SELECT *
    FROM vbep
   INTO TABLE gt_vbep
 FOR ALL ENTRIES IN gt_vbap
   WHERE vbeln EQ gt_vbap-vbeln
     AND posnr EQ gt_vbap-posnr.

  IF sy-subrc EQ 0.

*   Sorting for binary search.
    SORT gt_vbep BY vbeln posnr.

    LOOP AT gt_vbap ASSIGNING <fs_vbap>.

*     ........................
*     BAPI Data for updating the reason for rejection.
*     ........................
*     (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.

*     ........................
*     BAPI Data for updating the order quantity.
*     ........................
*     Adding the schedule lines items.
      READ TABLE gt_vbep TRANSPORTING NO FIELDS
      WITH KEY  vbeln = <fs_vbap>-vbeln
                posnr = <fs_vbap>-posnr
                BINARY SEARCH.

      IF sy-subrc EQ 0.

        gv_tabix = sy-tabix.

*       Index looping for better performance.
        LOOP AT gt_vbep ASSIGNING <fs_vbep> FROM gv_tabix.

          IF  <fs_vbep>-vbeln EQ <fs_vbap>-vbeln
          AND <fs_vbep>-posnr EQ <fs_vbap>-posnr.

*           (Schedule Line Level)
*           Setting of the item number(POSNR) at schedule line level.
            gst_schedule_lines-itm_number  = <fs_vbep>-posnr.
            gst_schedule_linesx-itm_number = <fs_vbep>-posnr.

*           Setting of the schedule line number(ETENR) at schedule
*                                                        line level.
            gst_schedule_lines-sched_line  = <fs_vbep>-etenr.
            gst_schedule_linesx-sched_line = <fs_vbep>-etenr.

*           Setting the update flag at schedule line level to update
*                                                                mode.
            gst_schedule_linesx-updateflag = 'U'.

*           Setting the new order quantity(WMENG).
            gst_schedule_lines-req_qty  = p_wmeng.
            gst_schedule_linesx-req_qty = 'X'.

*           BAPI schedule lines level tables:
            APPEND:
              gst_schedule_lines  TO gt_schedule_lines,
              gst_schedule_linesx TO gt_schedule_linesx.

          ELSE.

*           Clear index
            CLEAR gv_tabix.

*           Move out of the loop.
            EXIT.

          ENDIF.

*         Clearing of work areas.
          CLEAR:
            gst_schedule_lines,
            gst_schedule_linesx.

        ENDLOOP.

      ENDIF.

*     Calling BAPI to update reason for rejection and the
*     schedule line order quantity 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
          schedule_lines   = gt_schedule_lines
          schedule_linesx  = gt_schedule_linesx.

*     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,
        gv_tabix,
*       Structures:
        gst_item_hedx,
        gst_item_in,
        gst_item_inx.

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

    ENDLOOP.

  ENDIF.

ENDIF.