Please find below a sample code which demonstrate the use of the function module \’SD_BACKORDER_UPDATE\’ to change or cancel the confirmed quantity (VBEP-BMENG) in sales order schedule lines.
The nice part of this function module is that whenever the confirmed quantity is change or cancel, ATP check is carried out automatically.
REPORT ztestfmconfirmedquantity. *&--------------------------------------------------------------------&* *& Program Description: &* *& ----------------------- &* *& This demo program will update the confirmed quantity in a &* *& sales order. &* *& &* *& The program demonstrate the use of the FM \'SD_BACKORDER_UPDATE\'. &* *& &* *& Author: ABAPCOOKBOOK &* *& Website: www.abapcookbook.com &* ************************************************************************ ************************************************************************ * DATA DECLARATIONS * ************************************************************************ *Tables: TABLES: vbap, vbep. *Internal tables: DATA: gt_vbap TYPE STANDARD TABLE OF vbap, gt_vbep TYPE STANDARD TABLE OF vbep, gt_kortab TYPE STANDARD TABLE OF mdvu, gt_return TYPE STANDARD TABLE OF bapiret2. *Field Symbols: FIELD-SYMBOLS: <fs_vbap> TYPE vbap, <fs_vbep> TYPE vbep. *Structures: DATA: gst_kortab TYPE mdvu. *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, * Confirm Quantity. p_bmeng TYPE vbep-bmeng 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>. * ........................ * FM Data for updating the confirm 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. * Current item of the sales order for the current * availability date. gst_kortab-vbeln = <fs_vbep>-vbeln. gst_kortab-posnr = <fs_vbep>-posnr. gst_kortab-mbdat = <fs_vbep>-mbdat. * Setting the confirm quantity. Please note that * setting this value to \'0\' will cancel the confirm quantity * in the sales order on all schedule lines. gst_kortab-vmeng = p_bmeng. APPEND gst_kortab TO gt_kortab. ELSE. * Clear index CLEAR gv_tabix. * Move out of the loop. EXIT. ENDIF. * Clearing of work areas. CLEAR: gst_kortab. ENDLOOP. ENDIF. * Calling function module to update confirm quantity. The ATP check is * also generated using this function module. * Please Note: The drawback of this FM is that it automatically commit * changes to database even if a sales order is in edit mode and * it don\'t look that much perfomant. CALL FUNCTION \'SD_BACKORDER_UPDATE\' TABLES kortab = gt_kortab et_return = gt_return. * 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 FM. 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. * 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. * 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. * Refreshing internal tables: REFRESH: gt_kortab, gt_return. ENDLOOP. ENDIF. ENDIF.
Note that, to cancel confirmed quantity just set the value of the field \’GST_KORTAB-VMENG\’ to \’0\’.