2023 Aug 21 3:47 PM
Hi,
I am tyring to delete a schedule line using following code
* schedule lines
I_SCHED-ITM_NUMBER = ITM_NUMBER .
I_SCHED-SCHED_LINE = LINE.
I_SCHED-REQ_QTY = 0 .
APPEND I_SCHED.
* SCHEDULE LINE UPDATE FLAGS
I_SCHEDX-UPDATEFLAG = 'D'.
I_SCHEDX-ITM_NUMBER = ITM_NUMBER .
I_SCHEDX-SCHED_LINE = LINE.
I_SCHEDX-REQ_QTY = 'X'.
APPEND I_SCHEDX.
using BAPI_SALESORDER_CHANGE
data is being passed to bapi and result is without errors, but it doesn't delete any schedule line.
Insert & Update is working a ok. Am i missing something?
The line mentioned under is what i am trying to delete.
2023 Sep 08 12:16 PM
Hi Ali Jibran,
To better understand, I really need the complete code to know how you are filling in the fields, not just the function call.
2023 Aug 31 8:55 PM
Hello Ali Jibran,
Did you call the BAPI_TRANSACTION_COMMIT function after the BAPI_SALESORDER_CHANGE?
Can you post the complete code?
2023 Sep 08 6:39 AM
vinicius.cesar.dias Yes, Here is the code,
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
SALESDOCUMENT = WSVBELN-VBELN
ORDER_HEADER_IN = S_ORDER_HEADER_IN
ORDER_HEADER_INX = S_ORDER_HEADER_INX
BEHAVE_WHEN_ERROR = 'P'
TABLES
RETURN = IT_RETURN
ORDER_ITEM_IN = I_ORDER_ITEM_IN
ORDER_ITEM_INX = I_ORDER_ITEM_INX
SCHEDULE_LINES = I_SCHED
SCHEDULE_LINESX = I_SCHEDX.<br> CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
2023 Sep 08 12:16 PM
Hi Ali Jibran,
To better understand, I really need the complete code to know how you are filling in the fields, not just the function call.
2023 Sep 11 5:21 AM
*----
* UPLOAD FROM FILE IS REMOVED
*----
FORM DATA_UPDATE.
* Get Distinct VBELN
DATA(SVBELN) = ITAB[].
DELETE SVBELN INDEX 1.
SORT SVBELN BY VBELN ASCENDING.
DELETE ADJACENT DUPLICATES FROM SVBELN COMPARING VBELN.
* Work on every schedule line
LOOP AT SVBELN INTO DATA(WSVBELN).
* Setup for Update
ORDER_HEADER_IN-SD_DOC_CAT = 'C'.
ORDER_HEADER_INX-UPDATEFLAG = 'U'.
I_BAPI_VIEW-HEADER = 'X'.
I_BAPI_VIEW-ITEM = 'X'.
SALES_DOCUMENTS-VBELN = WSVBELN-VBELN.
APPEND SALES_DOCUMENTS.
CLEAR: ORDER_HEADER_IN[],ORDER_ITEM_IN[],ITAB_CH[].
* Get list of all Materials in Sales Order
CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
I_BAPI_VIEW = I_BAPI_VIEW
TABLES
SALES_DOCUMENTS = SALES_DOCUMENTS
ORDER_HEADERS_OUT = ORDER_HEADERS_OUT
ORDER_ITEMS_OUT = ORDER_ITEMS_OUT. " BAPISDORDER_GETDETAILEDLIST
* Find the Material in Schedule. If not in , Raise Error
PERFORM CHECK_MATERIALS.
* Update the schedule lines of Current Materials
LOOP AT ORDER_ITEM_IN .
MOVE-CORRESPONDING ORDER_ITEM_IN TO ITAB_CH.
APPEND ITAB_CH.
ENDLOOP. "ORDER_ITEM_IN
LOOP AT ITAB_CH .
* Prepare Material Line for update
PERFORM UPDATE_HEADER_DATA USING ITAB_CH-ITM_NUMBER
ITAB_CH-MATERIAL
ITAB_CH-TARGET_QTY
ITAB_CH-SALES_UNIT.
* Get Schedule Lines from current month only
CONCATENATE YEAR MONTH '01' INTO DATA(MSTART).
* Collect all existing schedule lines
SELECT * FROM VBEP INTO TABLE @IVBEP
WHERE VBELN EQ @WSVBELN-VBELN
AND POSNR EQ @ITAB_CH-ITM_NUMBER
AND EDATU GE @MSTART. "
IF LINES( IVBEP ) LE 0. "NO schedule lines. Atleast one should be added by SCM.
WAITR-TYPE = 'E'.
WAITR-ID = 'INTERNAL'.
WAITR-MESSAGE = |Sch.Agree { WSVBELN-VBELN } - Material# { ITAB_CH-MATERIAL } doesn't have any schedule lines.Please add atlease 1 line manually. |.
APPEND WAITR TO IT_RETURN2.
ELSE.
DATA: STARTDATE TYPE I.
MOVE SY-DATUM+6(2) TO STARTDATE.
PERFORM ADD_SCHEDULE_LINES USING DAYS ITAB_CH-ITM_NUMBER ITAB_CH-MATERIAL ITAB_CH-TARGET_QTY.
ENDIF.
ENDLOOP. "ITAB_CH
BREAK UPLOAD.
* Update Data in SAP
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
SALESDOCUMENT = WSVBELN-VBELN
ORDER_HEADER_IN = S_ORDER_HEADER_IN
ORDER_HEADER_INX = S_ORDER_HEADER_INX
BEHAVE_WHEN_ERROR = 'P'
TABLES
RETURN = IT_RETURN
ORDER_ITEM_IN = I_ORDER_ITEM_IN
ORDER_ITEM_INX = I_ORDER_ITEM_INX
SCHEDULE_LINES = I_SCHED
SCHEDULE_LINESX = I_SCHEDX.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
LOOP AT IT_RETURN INTO DATA(WITR).
APPEND WITR TO IT_RETURN2.
ENDLOOP.
CLEAR IT_RETURN[].
ENDLOOP. " SVBELN
PERFORM SHOW_LOG.
ENDFORM.
*--------------------------------------------------------------------*
FORM CHECK_MATERIALS.
LOOP AT ITAB INTO DATA(WITAB2).
IF SY-TABIX LE 1. "Skip first lines
CONTINUE.
ELSE.
TRY.
DATA(MAT) = ORDER_ITEMS_OUT[ MATERIAL = WITAB2-MATNR ].
MOVE-CORRESPONDING MAT TO ORDER_ITEM_IN.
APPEND ORDER_ITEM_IN.
CATCH CX_SY_ITAB_LINE_NOT_FOUND.
MESSAGE |Line Number : { SY-TABIX } => Material# { WITAB2-MATNR } from schedule# { WITAB2-VBELN } is not found. Please add the material manually| TYPE 'E'.
EXIT.
ENDTRY.
ENDIF.
ENDLOOP. "WITAB2
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPDATE_HEADER_DATA
*&---------------------------------------------------------------------*
FORM UPDATE_HEADER_DATA USING P_ITM_NUMBER
P_MATERIAL
P_TARGET_QTY
P_SALES_UNIT.
* Header update indicator
S_ORDER_HEADER_INX-UPDATEFLAG = 'U'.
I_ORDER_ITEM_IN-ITM_NUMBER = P_ITM_NUMBER .
I_ORDER_ITEM_IN-MATERIAL = P_MATERIAL.
I_ORDER_ITEM_IN-TARGET_QTY = P_TARGET_QTY.
I_ORDER_ITEM_IN-SALES_UNIT = P_SALES_UNIT.
* I_ORDER_ITEM_IN-VAL_TYPE = ITAB_CH-VAL_TYPE.
I_ORDER_ITEM_INX-UPDATEFLAG = 'U'.
I_ORDER_ITEM_INX-ITM_NUMBER = P_ITM_NUMBER .
I_ORDER_ITEM_INX-MATERIAL = P_MATERIAL.
I_ORDER_ITEM_INX-TARGET_QTY = 'X'.
I_ORDER_ITEM_INX-SALES_UNIT = P_SALES_UNIT.
* I_ORDER_ITEM_INX-VAL_TYPE = 'X'.
APPEND: I_ORDER_ITEM_IN, I_ORDER_ITEM_INX.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form ADD_SCHEDULE_LINES
*&---------------------------------------------------------------------*
FORM ADD_SCHEDULE_LINES USING DAYS
ITM_NUMBER
MATERIAL
TARGET_QTY.
FIELD-SYMBOLS: <QUANTITY> TYPE ANY.
DATA: CURRENT TYPE SY-DATUM.
DATA(DLOOP) = DAYN. " Current Date Day #
DATA(LOOPDATE) = SY-DATUM. " Current Date
LOOPDATE = '20230801'.
LINENUM = 0.
* Set Etenr Here
LOOP AT IVBEP INTO DATA(WIBEP).
LINENUM = WIBEP-ETENR.
ENDLOOP.
CREATE DATA LINE1 LIKE LINE OF <DYN_TABLE>.
ASSIGN LINE1->* TO <LINE1>.
* Start Loop From Current Date
WHILE DLOOP LT DAYS.
TRY.
DATA(LMAT) = ITAB[ MATNR = MATERIAL ].
LOOP AT <DYN_TABLE> ASSIGNING <LINE1>.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <LINE1> TO FIELD-SYMBOL(<FSMAT>).
ASSIGN COMPONENT 'DATE' OF STRUCTURE <LINE1> TO FIELD-SYMBOL(<FSDATE>).
ASSIGN COMPONENT 'QUANTITY' OF STRUCTURE <LINE1> TO FIELD-SYMBOL(<FSQTY>).
IF <FSMAT> EQ LMAT-MATNR AND <FSDATE> EQ LOOPDATE AND <FSQTY> EQ 0.
DATA(IVA) = IVBEP[ EDATU = LOOPDATE ].
PERFORM DELETE_LINE USING ITM_NUMBER IVA-ETENR TARGET_QTY.
ENDIF.
IF <FSMAT> EQ LMAT-MATNR AND <FSDATE> EQ LOOPDATE AND <FSQTY> GT 0.
TRY.
DATA(IV) = IVBEP[ EDATU = LOOPDATE ].
* Update Schedule Line
PERFORM UPDATE_LINE USING
ITM_NUMBER
<FSQTY>
LOOPDATE
IV-ETENR.
CATCH CX_ROOT INTO DATA(CHX2).
* Create New Line
PERFORM ADD_NEW_LINE USING
ITM_NUMBER
<FSQTY>
LOOPDATE
LINENUM.
ENDTRY.
ENDIF.
ENDLOOP.
CATCH CX_ROOT INTO DATA(CHX1).
ENDTRY.
LOOPDATE = LOOPDATE + 1.
DLOOP = DLOOP + 1. " Increment Loop
*
ENDWHILE. " END LOOP
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DELETE_LINE - UPDATE & CREATE REMOVED
*&---------------------------------------------------------------------*
FORM DELETE_LINE USING ITM_NUMBER
LINE
TARGET_QTY.
TRY.
* schedule lines
I_SCHED-ITM_NUMBER = ITM_NUMBER .
I_SCHED-SCHED_LINE = LINE.
I_SCHED-REQ_QTY = 0 .
APPEND I_SCHED.
* SCHEDULE LINE UPDATE FLAGS
I_SCHEDX-UPDATEFLAG = 'D'.
I_SCHEDX-ITM_NUMBER = ITM_NUMBER .
I_SCHEDX-SCHED_LINE = LINE.
I_SCHEDX-REQ_QTY = 'X'.
APPEND I_SCHEDX.
CATCH CX_ROOT INTO DATA(CH) .
MESSAGE | { CH->GET_TEXT( ) } | TYPE 'I'.
ENDTRY.
ENDFORM.
2023 Sep 14 5:13 AM
2023 Sep 14 2:07 PM
Hi Ali Jibran,
Here's an example report where you can delete a line from the schedule line.
REPORT ZBAPI_SALESORDER_CHANGE.
DATA: ls_order_header_inx TYPE bapisdh1x.
DATA: lt_order_item_in TYPE STANDARD TABLE OF bapisditm.
DATA: ls_order_item_in TYPE bapisditm.
DATA: lt_order_item_inx TYPE STANDARD TABLE OF bapisditmx.
DATA: ls_order_item_inx TYPE bapisditmx.
DATA: lt_schedule_lines TYPE STANDARD TABLE OF bapischdl.
DATA: ls_schedule_lines TYPE bapischdl.
DATA: lt_schedule_linesx TYPE STANDARD TABLE OF bapischdlx.
DATA: ls_schedule_linesx TYPE bapischdlx.
DATA: lt_return TYPE bapiret2_t.
DATA: ls_return TYPE bapiret2.
DATA: ld_error TYPE flag.
SELECTION-SCREEN BEGIN OF BLOCK main WITH FRAME.
PARAMETERS p_vbeln TYPE vbak-vbeln.
SELECTION-SCREEN END OF BLOCK main.
START-OF-SELECTION.
" header
ls_order_header_inx-updateflag = 'U'.
" items
CLEAR ls_order_item_in.
ls_order_item_in-itm_number = '000010'.
APPEND ls_order_item_in TO lt_order_item_in.
CLEAR ls_order_item_inx.
ls_order_item_inx-itm_number = '000010'.
ls_order_item_inx-updateflag = 'U'.
APPEND ls_order_item_inx TO lt_order_item_inx.
CLEAR ls_schedule_lines.
ls_schedule_lines-itm_number = '000010'.
ls_schedule_lines-sched_line = '0001'.
ls_schedule_lines-req_qty = 0.
APPEND ls_schedule_lines TO lt_schedule_lines.
CLEAR ls_schedule_linesx.
ls_schedule_linesx-itm_number = '000010'.
ls_schedule_linesx-sched_line = '0001'.
ls_schedule_linesx-req_qty = 'X'.
ls_schedule_linesx-updateflag = 'U'.
APPEND ls_schedule_linesx TO lt_schedule_linesx.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = p_vbeln
order_header_inx = ls_order_header_inx
TABLES
return = lt_return
order_item_in = lt_order_item_in
order_item_inx = lt_order_item_inx
schedule_lines = lt_schedule_lines
schedule_linesx = lt_schedule_linesx.
CALL FUNCTION 'RSCRMBW_DISPLAY_BAPIRET2'
TABLES
it_return = lt_return.
LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A'.
ld_error = 'X'.
EXIT.
ENDLOOP.
IF ld_error <> 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
Evidence
Test it in your environment and check if it works for you.
2023 Sep 15 6:27 AM
Thanks for you time and support .
Your code did the trick. it seems below mentioned line is the key to delete, not update flag.
ls_schedule_linesx-req_qty = 'X'.
2023 Sep 11 6:50 AM
When you use a BAPI function module, you should manage the RETURN table or structure before calling the Commit Work.
In the update flag you set a 'U' means update, not delete, did you try with 'D' ?
2023 Sep 11 7:13 AM
2024 Nov 15 6:28 AM
I got same requirement to delete /update/insert schedule line using bpi
There is no scope to delete the Schedule line item using BAPI_SALESORDER_CHANGE. Just pass the schedule_linesx-updkz = 'U' for update or delete. then write the code MV45AFZZ inside form FORM userexit_save_document_prepare . First get the old values from VBEP based on XVBEP[] and move the YVBEP[]. Update the UPDKZ flag 'D' for schedule line item for both XVBEP[] and YVBEP[]. for any change or insert update only XVBEP[]. for delete line we have to update both XVBEP[] and YVBEP[]. Last pass the UPD_VBEP = 'U' for capture change log.