@ [TOC]
1 BAPI:CSAP_ORD_BOM_MAINTAIN
2 Detail
2.1 Deleted line
STPO_API03-FLDELETE = ‘X’
2 .2 Modified Line
2.21 Please specify below lines .
STPO_API03-ITEM_NODE = STPO-STLKN.
STPO_API03-ITEM_COUNT = STOP-STPOZ.
2.22 Example.
CONSTANTS : C(1) VALUE '.'.
DATA: LT_OUT LIKE GT_OUT,
LS_OUT LIKE GS_OUT.
DATA: LWA_STKO TYPE STKO_API01,
LWA_STPO TYPE STPO_API03,
LIT_STPO TYPE TABLE OF STPO_API03 WITH HEADER LINE.
DATA : LT_STPO LIKE TABLE OF STPO,
LW_STPO LIKE LINE OF LT_STPO.
DATA:L_FORM TYPE CSAP_KBOM-DATUV.
DATA:L_DATE TYPE SY-DATUM.
DATA:U_DATE TYPE SY-DATUM.
DATA:HEARDER LIKE CSAP_KBOM .
DATA: LT_ZPPT018 LIKE TABLE OF ZPPT018,
LS_ZPPT018 LIKE LINE OF LT_ZPPT018.
DATA: LT_CDHDR LIKE TABLE OF CDHDR,
LS_CDHDR LIKE LINE OF LT_CDHDR.
DATA:L_INDEX LIKE SY-TABIX.
"触发数据变更
CALL METHOD GCL_ALV_GRID->CHECK_CHANGED_DATA
IMPORTING
E_VALID = DATA(LV_VALID).
IF LV_VALID IS NOT INITIAL.
CASE S_UCOMM.
WHEN '&IC1'.
* READ TABLE GT_OUT INTO GS_OUT INDEX RE_SELFIELD-TABINDEX.
* SET PARAMETER ID 'MAT' FIELD GS_OUT-MATNR.
* CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
WHEN '&ZMODIFY' . " 修改BOM
LOOP AT GT_OUT INTO GS_OUT WHERE SEL = 'X'.
MOVE-CORRESPONDING GS_OUT TO LS_OUT.
APPEND LS_OUT TO LT_OUT.
CLEAR:GS_OUT , LS_OUT.
ENDLOOP.
IF LT_OUT IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_STPO FROM STPO
FOR ALL ENTRIES IN LT_OUT
WHERE STLNR = LT_OUT-STLNR AND STLKN = LT_OUT-STLKN AND STPOZ = LT_OUT-STPOZ
AND DATUV = LT_OUT-DATUV .
ENDIF.
READ TABLE LT_OUT INTO LS_OUT INDEX 1.
HEARDER-VBELN = LS_OUT-VBELN.
HEARDER-VBPOS = LS_OUT-VBPOS.
HEARDER-MATNR = LS_OUT-MATNR.
HEARDER-WERKS = LS_OUT-WERKS.
HEARDER-STLAN = LS_OUT-STLAN.
CONCATENATE LS_OUT-DATUV+0(4) LS_OUT-DATUV+4(2) LS_OUT-DATUV+6(2) INTO L_FORM SEPARATED BY C.
* SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_STPO FROM STPO WHERE STLNR = '00000004' AND STLKN = '00000002' AND STPOZ = '00000004' .
LOOP AT LT_STPO INTO Lw_STPO .
IF p_MENGE IS NOT INITIAL.
Lw_STPO-MENGE = p_MENGE .
ENDIF.
IF p_POTX12 IS NOT INITIAL.
Lw_STPO-POTX1 = p_POTX11 .
ENDIF.
IF p_IDNRK IS NOT INITIAL.
Lw_STPO-IDNRK = p_IDNRK .
ENDIF.
LWA_STPO-ITEM_TEXT1 = Lw_STPO-POTX1 .
LWA_STPO-COMP_QTY = Lw_STPO-MENGE .
LWA_STPO-ITEM_NO = Lw_STPO-POSNR .
LWA_STPO-ITEM_CATEG = Lw_STPO-POSTP .
LWA_STPO-COMPONENT = Lw_STPO-IDNRK .
LWA_STPO-ITEM_COUNT = Lw_STPO-STPOZ.
LWA_STPO-ITEM_NODE = Lw_STPO-STLKN .
LWA_STPO-BOM_NO = Lw_STPO-STLNR .
APPEND LWA_STPO TO LIT_STPO.
CLEAR:Lw_STPO,LWA_STPO.
ENDLOOP.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
* 订单BOM维护
CALL FUNCTION 'CSAP_ORD_BOM_MAINTAIN'
EXPORTING
ORDER = HEARDER-VBELN
POSITION = HEARDER-VBPOS
MATERIAL = HEARDER-MATNR
PLANT = HEARDER-WERKS
BOM_USAGE = HEARDER-STLAN
VALID_FROM = L_FORM
I_STKO = LWA_STKO
FL_DEFAULT_VALUES = 'X'
FL_COMMIT_AND_WAIT = 'X'
TABLES
T_STPO = LIT_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC = 0.
COMMIT WORK .
MESSAGE '修改成功' TYPE 'S' .
ELSE.
ROLLBACK WORK .
MESSAGE '修改失败' TYPE 'E' .
ENDIF.
LOOP AT LT_OUT INTO LS_OUT.
L_INDEX = SY-TABIX.
CONCATENATE SY-MANDT 'K' LS_OUT-STLNR INTO LS_OUT-OBJECTID .
MODIFY LT_OUT INDEX L_INDEX FROM LS_OUT TRANSPORTING OBJECTID.
CLEAR:LS_OUT .
ENDLOOP.
CLEAR:L_INDEX .
IF LT_OUT[] IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CDHDR
FROM CDHDR
FOR ALL ENTRIES IN LT_OUT
WHERE CDHDR~OBJECTCLAS = 'STUE' AND CDHDR~OBJECTID = LT_OUT-OBJECTID .
U_DATE = SY-DATUM .
DELETE LT_CDHDR WHERE UDATE <> U_dATE.
SORT LT_CDHDR BY UDATE UTIME DESCENDING .
DELETE ADJACENT DUPLICATES FROM LT_CDHDR COMPARING UDATE .
ENDIF.
LOOP AT LT_CDHDR INTO LS_CDHDR .
LS_ZPPT018-CHANGENR = LS_CDHDR-CHANGENR.
LS_ZPPT018-ZSBH = P_ZSBH.
LS_ZPPT018-ZDATE = SY-DATUM.
LS_ZPPT018-ZTIME = SY-UZEIT.
LS_ZPPT018-ZUSER = SY-UNAME .
APPEND LS_ZPPT018 TO LT_ZPPT018.
CLEAR:LS_CDHDR ,LS_ZPPT018.
ENDLOOP.
IF LT_ZPPT018 IS NOT INITIAL.
MODIFY ZPPT018 FROM TABLE LT_ZPPT018.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK .
ENDIF.
ENDIF.
CLEAR: LIT_STPO, L_FORM,HEARDER .
WHEN '&ZDELETE' . " 删除BOM
LOOP AT GT_OUT INTO GS_OUT WHERE SEL = 'X'.
MOVE-CORRESPONDING GS_OUT TO LS_OUT.
APPEND LS_OUT TO LT_OUT.
CLEAR:GS_OUT , LS_OUT.
ENDLOOP.
IF LT_OUT IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_STPO FROM STPO
FOR ALL ENTRIES IN LT_OUT
WHERE STLNR = LT_OUT-STLNR AND STLKN = LT_OUT-STLKN AND STPOZ = LT_OUT-STPOZ
AND DATUV = LT_OUT-DATUV .
ENDIF.
READ TABLE LT_OUT INTO LS_OUT INDEX 1.
HEARDER-VBELN = LS_OUT-VBELN.
HEARDER-VBPOS = LS_OUT-VBPOS.
HEARDER-MATNR = LS_OUT-MATNR.
HEARDER-WERKS = LS_OUT-WERKS.
HEARDER-STLAN = LS_OUT-STLAN.
CONCATENATE LS_OUT-DATUV+0(4) LS_OUT-DATUV+4(2) LS_OUT-DATUV+6(2) INTO L_FORM SEPARATED BY C.
LOOP AT LT_STPO INTO Lw_STPO .
LWA_STPO-FLDELETE = 'X' .
LWA_STPO-ITEM_COUNT = Lw_STPO-STPOZ.
LWA_STPO-ITEM_NODE = Lw_STPO-STLKN .
APPEND LWA_STPO TO LIT_STPO.
CLEAR:Lw_STPO,LWA_STPO.
ENDLOOP.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
* 订单BOM维护
CALL FUNCTION 'CSAP_ORD_BOM_MAINTAIN'
EXPORTING
ORDER = HEARDER-VBELN
POSITION = HEARDER-VBPOS
MATERIAL = HEARDER-MATNR
PLANT = HEARDER-WERKS
BOM_USAGE = HEARDER-STLAN
VALID_FROM = L_FORM
I_STKO = LWA_STKO
FL_DEFAULT_VALUES = 'X'
FL_COMMIT_AND_WAIT = 'X'
TABLES
T_STPO = LIT_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC = 0.
COMMIT WORK .
MESSAGE '创建成功' TYPE 'S' .
ELSE.
ROLLBACK WORK .
MESSAGE '删除失败 ' TYPE 'E' .
ENDIF.
LOOP AT LT_OUT INTO LS_OUT.
L_INDEX = SY-TABIX.
CONCATENATE SY-MANDT 'K' LS_OUT-STLNR INTO LS_OUT-OBJECTID .
MODIFY LT_OUT INDEX L_INDEX FROM LS_OUT TRANSPORTING OBJECTID.
CLEAR:LS_OUT .
ENDLOOP.
IF LT_OUT[] IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CDHDR
FROM CDHDR
FOR ALL ENTRIES IN LT_OUT
WHERE CDHDR~OBJECTCLAS = 'STUE' AND CDHDR~OBJECTID = LT_OUT-OBJECTID .
ENDIF.
U_DATE = SY-DATUM .
DELETE LT_CDHDR WHERE UDATE <> U_dATE.
SORT LT_CDHDR BY UDATE UTIME DESCENDING .
DELETE ADJACENT DUPLICATES FROM LT_CDHDR COMPARING UDATE .
LOOP AT LT_CDHDR INTO LS_CDHDR .
LS_ZPPT018-CHANGENR = LS_CDHDR-CHANGENR.
LS_ZPPT018-ZSBH = P_ZSBH1.
LS_ZPPT018-ZDATE = SY-DATUM.
LS_ZPPT018-ZTIME = SY-UZEIT.
LS_ZPPT018-ZUSER = SY-UNAME .
APPEND LS_ZPPT018 TO LT_ZPPT018.
CLEAR:LS_CDHDR ,LS_ZPPT018.
ENDLOOP.
IF LT_ZPPT018 IS NOT INITIAL.
MODIFY ZPPT018 FROM TABLE LT_ZPPT018.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK .
ENDIF.
ENDIF.
CLEAR: LIT_STPO, L_FORM,HEARDER .
WHEN '&ZADD' . " 添加BOM
LOOP AT GT_OUT INTO GS_OUT WHERE SEL = 'X'.
MOVE-CORRESPONDING GS_OUT TO LS_OUT.
APPEND LS_OUT TO LT_OUT.
CLEAR:GS_OUT , LS_OUT.
ENDLOOP.
IF LT_OUT IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_STPO FROM STPO
FOR ALL ENTRIES IN LT_OUT
WHERE STLNR = LT_OUT-STLNR AND STLKN = LT_OUT-STLKN AND STPOZ = LT_OUT-STPOZ
AND DATUV = LT_OUT-DATUV.
ENDIF.
READ TABLE LT_OUT INTO LS_OUT INDEX 1.
HEARDER-VBELN = LS_OUT-VBELN.
HEARDER-VBPOS = LS_OUT-VBPOS.
HEARDER-MATNR = LS_OUT-MATNR.
HEARDER-WERKS = LS_OUT-WERKS.
HEARDER-STLAN = LS_OUT-STLAN.
CONCATENATE LS_OUT-DATUV+0(4) LS_OUT-DATUV+4(2) LS_OUT-DATUV+6(2) INTO L_FORM SEPARATED BY C.
CLEAR:Lw_STPO,LT_STPO.
Lw_STPO-IDNRK = p_IDNRK2 .
Lw_STPO-MENGE = p_MENGE2 .
Lw_STPO-POTX1 = p_POTX14 .
Lw_STPO-POSNR = p_POSNR2.
APPEND Lw_STPO TO LT_STPO .
LOOP AT LT_STPO INTO Lw_STPO .
LWA_STPO-ITEM_CATEG = 'L'.
LWA_STPO-ITEM_no = Lw_STPO-POSNR .
LWA_STPO-ITEM_TEXT1 = Lw_STPO-POTX1 .
LWA_STPO-COMP_QTY = Lw_STPO-MENGE .
LWA_STPO-COMPONENT = Lw_STPO-IDNRK .
APPEND LWA_STPO TO LIT_STPO.
CLEAR:Lw_STPO,LWA_STPO.
ENDLOOP.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
* 订单BOM维护
CALL FUNCTION 'CSAP_ORD_BOM_MAINTAIN'
EXPORTING
ORDER = HEARDER-VBELN
POSITION = HEARDER-VBPOS
MATERIAL = HEARDER-MATNR
PLANT = HEARDER-WERKS
BOM_USAGE = HEARDER-STLAN
VALID_FROM = L_FORM
I_STKO = LWA_STKO
FL_DEFAULT_VALUES = 'X'
FL_COMMIT_AND_WAIT = 'X'
FL_NEW_ITEM = 'X'
TABLES
T_STPO = LIT_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC = 0.
COMMIT WORK .
MESSAGE '创建成功' TYPE 'S' .
ELSE.
ROLLBACK WORK .
MESSAGE '创建失败' TYPE 'E' .
ENDIF.
LOOP AT LT_OUT INTO LS_OUT.
L_INDEX = SY-TABIX.
CONCATENATE SY-MANDT 'K' LS_OUT-STLNR INTO LS_OUT-OBJECTID .
MODIFY LT_OUT INDEX L_INDEX FROM LS_OUT TRANSPORTING OBJECTID.
CLEAR:LS_OUT .
ENDLOOP.
IF LT_OUT[] IS NOT INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_CDHDR
FROM CDHDR
FOR ALL ENTRIES IN LT_OUT
WHERE CDHDR~OBJECTCLAS = 'STUE' AND CDHDR~OBJECTID = LT_OUT-OBJECTID .
ENDIF.
U_DATE = SY-DATUM .
DELETE LT_CDHDR WHERE UDATE <> U_dATE.
SORT LT_CDHDR BY UDATE UTIME DESCENDING .
DELETE ADJACENT DUPLICATES FROM LT_CDHDR COMPARING UDATE .
LOOP AT LT_CDHDR INTO LS_CDHDR .
LS_ZPPT018-CHANGENR = LS_CDHDR-CHANGENR.
LS_ZPPT018-ZSBH = p_ZSBH2.
LS_ZPPT018-ZDATE = SY-DATUM.
LS_ZPPT018-ZTIME = SY-UZEIT.
LS_ZPPT018-ZUSER = SY-UNAME .
APPEND LS_ZPPT018 TO LT_ZPPT018.
CLEAR:LS_CDHDR ,LS_ZPPT018.
ENDLOOP.
IF LT_ZPPT018 IS NOT INITIAL.
MODIFY ZPPT018 FROM TABLE LT_ZPPT018.
IF SY-SUBRC = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK .
ENDIF.
ENDIF.
CLEAR: LIT_STPO, L_FORM,HEARDER .
ENDCASE.
ENDIF.
2.23 Experence
We must take care date format ‘2023.07.26’ for calling .
2.3
Please specify normal value .