2006 Aug 07 8:55 AM
Hello,
I want to change Sales Orders with given schedule-dates using the function module "BAPI_SALESORDER_CHANGE".
It seems, that this FM ignores the table-parameters schedule_lines and schedulde_linesx.
Here's the code of a small test-program:
REPORT zschoe1.
TABLES: vbak, vbap, vbep.
PARAMETERS p_vbeln LIKE vbak-vbeln DEFAULT 15003132.
DATA: lt_schdl TYPE TABLE OF bapischdl WITH HEADER LINE,
ls_ord_header_inx TYPE bapisdh1x,
ls_return LIKE bapiret2,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_schdlx TYPE TABLE OF bapischdlx WITH HEADER LINE.
*--------------------------------------------------------------------*
START-OF-SELECTION.
SELECT SINGLE * FROM vbap WHERE vbeln = p_vbeln.
CHECK sy-subrc = 0.
SELECT * FROM vbep WHERE vbeln = p_vbeln.
WRITE: / 'Before:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
SELECT SINGLE * FROM vbep WHERE vbeln = vbap-vbeln
AND posnr = vbap-posnr.
CHECK sy-subrc = 0.
CLEAR lt_schdl.
lt_schdl-itm_number = vbep-posnr.
lt_schdl-sched_line = vbep-etenr.
* Einteilungsdatum
lt_schdl-req_date = vbep-edatu + 1.
lt_schdl-date_type = '1'.
* Materialbereitstellungsdatum
lt_schdl-ms_date = vbep-mbdat - 1.
SKIP.
WRITE: / 'WANTED:', lt_schdl-itm_number,
/ 'DLV_DATE ', lt_schdl-dlv_date,
/ 'MS_DATE ', lt_schdl-ms_date,
/ 'GI_DATE ', lt_schdl-gi_date,
/ 'TP_DATE ', lt_schdl-tp_date,
/ 'LOAD_DATE ', lt_schdl-load_date,
/ 'REQ_DATE ', lt_schdl-req_date.
APPEND lt_schdl.
ls_ord_header_inx-updateflag = 'U'.
lt_schdlx-updateflag = 'U'.
lt_schdlx-req_date = 'X'.
lt_schdlx-ms_date = 'X'.
** lt_schdlx-date_type = 'X'.
** lt_schdlx-dlv_date = 'X'.
** lt_schdlx-load_date = 'X'.
** lt_schdlx-gi_date = 'X'.
** lt_schdlx-tp_date = 'X'.
APPEND lt_schdlx.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = p_vbeln
order_header_inx = ls_ord_header_inx
TABLES
return = lt_return
schedule_lines = lt_schdl
schedule_linesx = lt_schdlx.
.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_return.
SKIP.
LOOP AT lt_return.
WRITE: / lt_return-message(100).
ENDLOOP.
SKIP.
SELECT * FROM vbep WHERE vbeln = p_vbeln
AND posnr = vbep-posnr.
WRITE: / 'After:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
Output of this program is:
Before: 001000 0001 EDATU 07.11.2006 MBDAT 02.11.2006
WANTED: 001000
DLV_DATE 00.00.0000
MS_DATE 01.11.2006
GI_DATE 00.00.0000
TP_DATE 00.00.0000
LOAD_DATE 00.00.0000
REQ_DATE 08.11.2006
ORDER_HEADER_IN erfolgreich verarbeitet
Interner Auftrag 0015003132 wurde gesichert
After: 001000 0001 EDATU 07.11.2006 MBDAT 02.11.2006
As you can see, the situation "Before" and "After" ist the same, although the FM-Call was successfully. (Sorry - I just recognize, that the message-output after "ORDER_HEADER_IN" is in german).
With transaction VA02 it is possible to change the sales order manually to this schedule-parameters. So my very last solution will be, to try batch-input or call transaction instead of the function module.
But I still hope, that somebody can help me regarding the FM BAPI_SALESORDER_CHANGE
Regards
Juergen Schoetteler
2006 Aug 08 8:02 AM
Hi Jurgen
Have done some minor modifications to your program. Please check if this helps you.
TABLES: vbak, vbap, vbep.
PARAMETERS p_vbeln LIKE vbak-vbeln DEFAULT 15003132.
DATA: lt_schdl TYPE TABLE OF bapischdl WITH HEADER LINE,
ls_ord_header_inx TYPE bapisdh1x,
ls_return LIKE bapiret2,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_schdlx TYPE TABLE OF bapischdlx WITH HEADER LINE.
----
START-OF-SELECTION.
SELECT SINGLE * FROM vbap WHERE vbeln = p_vbeln.
CHECK sy-subrc = 0.
SELECT * FROM vbep WHERE vbeln = p_vbeln.
WRITE: / 'Before:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
SELECT SINGLE * FROM vbep WHERE vbeln = vbap-vbeln
AND posnr = vbap-posnr.
CHECK sy-subrc = 0.
CLEAR lt_schdl.
lt_schdl-itm_number = lt_schdlx-itm_number = vbep-posnr.
lt_schdl-sched_line = lt_schdlx-sched_line = vbep-etenr.
Einteilungsdatum
lt_schdl-req_date = vbep-edatu + 1.
lt_schdl-date_type = '1'.
Materialbereitstellungsdatum
lt_schdl-ms_date = vbep-mbdat - 1.
SKIP.
WRITE: / 'WANTED:', lt_schdl-itm_number,
/ 'DLV_DATE ', lt_schdl-dlv_date,
/ 'MS_DATE ', lt_schdl-ms_date,
/ 'GI_DATE ', lt_schdl-gi_date,
/ 'TP_DATE ', lt_schdl-tp_date,
/ 'LOAD_DATE ', lt_schdl-load_date,
/ 'REQ_DATE ', lt_schdl-req_date.
APPEND lt_schdl.
ls_ord_header_inx-updateflag = 'U'.
lt_schdlx-updateflag = 'U'.
lt_schdlx-req_date = 'X'.
lt_schdlx-ms_date = 'X'.
lt_schdlx-date_type = 'X'.
lt_schdlx-dlv_date = 'X'.
lt_schdlx-load_date = 'X'.
lt_schdlx-gi_date = 'X'.
lt_schdlx-tp_date = 'X'.
APPEND lt_schdlx.
ls_ord_header_inx-updateflag = 'X'.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = p_vbeln
order_header_inx = ls_ord_header_inx
TABLES
return = lt_return
schedule_lines = lt_schdl
schedule_linesx = lt_schdlx.
.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_return.
SKIP.
LOOP AT lt_return.
WRITE: / lt_return-message(100).
ENDLOOP.
SKIP.
SELECT * FROM vbep WHERE vbeln = p_vbeln
AND posnr = vbep-posnr.
WRITE: / 'After:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
Kind Regards
Eswar
Note: Reward for helpful answers
Hello,
I want to change Sales Orders with given schedule-dates using the function module "BAPI_SALESORDER_CHANGE".
It seems, that this FM ignores the table-parameters schedule_lines and schedulde_linesx.
Here's the code of a small test-program:
REPORT zschoe1.
TABLES: vbak, vbap, vbep.
PARAMETERS p_vbeln LIKE vbak-vbeln DEFAULT 15003132.
DATA: lt_schdl TYPE TABLE OF bapischdl WITH HEADER LINE,
ls_ord_header_inx TYPE bapisdh1x,
ls_return LIKE bapiret2,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_schdlx TYPE TABLE OF bapischdlx WITH HEADER LINE.
*--------------------------------------------------------------------*
START-OF-SELECTION.
SELECT SINGLE * FROM vbap WHERE vbeln = p_vbeln.
CHECK sy-subrc = 0.
SELECT * FROM vbep WHERE vbeln = p_vbeln.
WRITE: / 'Before:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
SELECT SINGLE * FROM vbep WHERE vbeln = vbap-vbeln
AND posnr = vbap-posnr.
CHECK sy-subrc = 0.
CLEAR lt_schdl.
lt_schdl-itm_number = vbep-posnr.
lt_schdl-sched_line = vbep-etenr.
* Einteilungsdatum
lt_schdl-req_date = vbep-edatu + 1.
lt_schdl-date_type = '1'.
* Materialbereitstellungsdatum
lt_schdl-ms_date = vbep-mbdat - 1.
SKIP.
WRITE: / 'WANTED:', lt_schdl-itm_number,
/ 'DLV_DATE ', lt_schdl-dlv_date,
/ 'MS_DATE ', lt_schdl-ms_date,
/ 'GI_DATE ', lt_schdl-gi_date,
/ 'TP_DATE ', lt_schdl-tp_date,
/ 'LOAD_DATE ', lt_schdl-load_date,
/ 'REQ_DATE ', lt_schdl-req_date.
APPEND lt_schdl.
ls_ord_header_inx-updateflag = 'U'.
lt_schdlx-updateflag = 'U'.
lt_schdlx-req_date = 'X'.
lt_schdlx-ms_date = 'X'.
** lt_schdlx-date_type = 'X'.
** lt_schdlx-dlv_date = 'X'.
** lt_schdlx-load_date = 'X'.
** lt_schdlx-gi_date = 'X'.
** lt_schdlx-tp_date = 'X'.
APPEND lt_schdlx.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = p_vbeln
order_header_inx = ls_ord_header_inx
TABLES
return = lt_return
schedule_lines = lt_schdl
schedule_linesx = lt_schdlx.
.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_return.
SKIP.
LOOP AT lt_return.
WRITE: / lt_return-message(100).
ENDLOOP.
SKIP.
SELECT * FROM vbep WHERE vbeln = p_vbeln
AND posnr = vbep-posnr.
WRITE: / 'After:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
Output of this program is:
Before: 001000 0001 EDATU 07.11.2006 MBDAT 02.11.2006
WANTED: 001000
DLV_DATE 00.00.0000
MS_DATE 01.11.2006
GI_DATE 00.00.0000
TP_DATE 00.00.0000
LOAD_DATE 00.00.0000
REQ_DATE 08.11.2006
ORDER_HEADER_IN erfolgreich verarbeitet
Interner Auftrag 0015003132 wurde gesichert
After: 001000 0001 EDATU 07.11.2006 MBDAT 02.11.2006
As you can see, the situation "Before" and "After" ist the same, although the FM-Call was successfully. (Sorry - I just recognize, that the message-output after "ORDER_HEADER_IN" is in german).
With transaction VA02 it is possible to change the sales order manually to this schedule-parameters. So my very last solution will be, to try batch-input or call transaction instead of the function module.
But I still hope, that somebody can help me regarding the FM BAPI_SALESORDER_CHANGE
Regards
Juergen Schoetteler
2006 Aug 08 8:02 AM
Hi Jurgen
Have done some minor modifications to your program. Please check if this helps you.
TABLES: vbak, vbap, vbep.
PARAMETERS p_vbeln LIKE vbak-vbeln DEFAULT 15003132.
DATA: lt_schdl TYPE TABLE OF bapischdl WITH HEADER LINE,
ls_ord_header_inx TYPE bapisdh1x,
ls_return LIKE bapiret2,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_schdlx TYPE TABLE OF bapischdlx WITH HEADER LINE.
----
START-OF-SELECTION.
SELECT SINGLE * FROM vbap WHERE vbeln = p_vbeln.
CHECK sy-subrc = 0.
SELECT * FROM vbep WHERE vbeln = p_vbeln.
WRITE: / 'Before:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
SELECT SINGLE * FROM vbep WHERE vbeln = vbap-vbeln
AND posnr = vbap-posnr.
CHECK sy-subrc = 0.
CLEAR lt_schdl.
lt_schdl-itm_number = lt_schdlx-itm_number = vbep-posnr.
lt_schdl-sched_line = lt_schdlx-sched_line = vbep-etenr.
Einteilungsdatum
lt_schdl-req_date = vbep-edatu + 1.
lt_schdl-date_type = '1'.
Materialbereitstellungsdatum
lt_schdl-ms_date = vbep-mbdat - 1.
SKIP.
WRITE: / 'WANTED:', lt_schdl-itm_number,
/ 'DLV_DATE ', lt_schdl-dlv_date,
/ 'MS_DATE ', lt_schdl-ms_date,
/ 'GI_DATE ', lt_schdl-gi_date,
/ 'TP_DATE ', lt_schdl-tp_date,
/ 'LOAD_DATE ', lt_schdl-load_date,
/ 'REQ_DATE ', lt_schdl-req_date.
APPEND lt_schdl.
ls_ord_header_inx-updateflag = 'U'.
lt_schdlx-updateflag = 'U'.
lt_schdlx-req_date = 'X'.
lt_schdlx-ms_date = 'X'.
lt_schdlx-date_type = 'X'.
lt_schdlx-dlv_date = 'X'.
lt_schdlx-load_date = 'X'.
lt_schdlx-gi_date = 'X'.
lt_schdlx-tp_date = 'X'.
APPEND lt_schdlx.
ls_ord_header_inx-updateflag = 'X'.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = p_vbeln
order_header_inx = ls_ord_header_inx
TABLES
return = lt_return
schedule_lines = lt_schdl
schedule_linesx = lt_schdlx.
.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_return.
SKIP.
LOOP AT lt_return.
WRITE: / lt_return-message(100).
ENDLOOP.
SKIP.
SELECT * FROM vbep WHERE vbeln = p_vbeln
AND posnr = vbep-posnr.
WRITE: / 'After:', vbep-posnr, vbep-etenr,
'EDATU', vbep-edatu,
'MBDAT', vbep-mbdat.
ENDSELECT.
Kind Regards
Eswar
Note: Reward for helpful answers
2006 Aug 08 1:14 PM
Thank You Eswar!
Filling lt_schdlx-itm_number and -sched_line is the solution.
Regards
2006 Aug 08 1:24 PM
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |