Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

BAPI_SALESORDER_CHANGE - Delete Schedule Line

dukejib5
Participant
0 Kudos

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.

1 ACCEPTED SOLUTION

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.

ABAP / Fiori Developer
9 REPLIES 9

0 Kudos

Hello Ali Jibran,

Did you call the BAPI_TRANSACTION_COMMIT function after the BAPI_SALESORDER_CHANGE?

Can you post the complete code?

ABAP / Fiori Developer

0 Kudos

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'.

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.

ABAP / Fiori Developer

0 Kudos
*----
* 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.

0 Kudos
vinicius.cesar.dias

code added. please check

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.

ABAP / Fiori Developer

vinicius.cesar.dias

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'.

FredericGirod
Active Contributor
0 Kudos

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' ?

dukejib5
Participant
0 Kudos
frdric.girod

Yes i am using 'D' to delete the line item.

Here is my code