使用此函数修改时,
只要ITEM_NODE 项目节点号 ITEM_COUNT 内部计数器字段相同,就可以对原BOM种的相同项做修改。
特别要注意一点,单原项目带安装地点,修改的时候不带安装地点,例如只修改数量,而该项目的STPU数据为空,执行后的结果是,安装地点的标志被取消了(但STPU中数据仍然存在),数量并没有修改,目前的解决办法是,人为加入判断这种情况(原来BOM项有安装地点,则传给函数就变成两条数据,一条用于删除原来的数据,一条用于新增加来达到修改的目的)
下面是一个修改BOM的行数。本接口用于PDM发生ECO BOM变更于SAP的接口。
FUNCTION zpdm_eco_bom.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(MATERIAL) LIKE CSAP_MBOM-MATNR OPTIONAL
*" VALUE(PLANT) LIKE CSAP_MBOM-WERKS OPTIONAL
*" VALUE(BOM_USAGE) LIKE CSAP_MBOM-STLAN OPTIONAL
*" VALUE(ALTERNATIVE) LIKE CSAP_MBOM-STLAL OPTIONAL
*" VALUE(VALID_FROM) LIKE CSAP_MBOM-DATUV OPTIONAL
*" VALUE(CHANGE_NO) LIKE CSAP_MBOM-AENNR OPTIONAL
*" VALUE(REVISION_LEVEL) LIKE CSAP_MBOM-REVLV OPTIONAL
*" VALUE(FL_NO_CHANGE_DOC) LIKE CAPIFLAG-NO_CHG_DOC OPTIONAL
*" VALUE(I_STKO) LIKE STKO_API01 STRUCTURE STKO_API01 OPTIONAL
*" EXPORTING
*" VALUE(O_STKO) LIKE STKO_API02 STRUCTURE STKO_API02
*" VALUE(FL_WARNING) LIKE CAPIFLAG-FLWARNING
*" VALUE(RETURN) TYPE CHAR100
*" VALUE(RETURN2) TYPE CHAR100
*" TABLES
*" T_DEP_DATA STRUCTURE CSDEP_DAT OPTIONAL
*" T_DEP_DESCR STRUCTURE CSDEP_DESC OPTIONAL
*" T_DEP_ORDER STRUCTURE CSDEP_ORD OPTIONAL
*" T_DEP_SOURCE STRUCTURE CSDEP_SORC OPTIONAL
*" T_DEP_DOC STRUCTURE CSDEP_DOC OPTIONAL
*" T_STPO1 STRUCTURE STPO_API03
*" T_STPU STRUCTURE STPU_API01 OPTIONAL
*"----------------------------------------------------------------------
DATA: t_stpo_line_mod LIKE TABLE OF stpo_api02 WITH HEADER LINE.
DATA: t_stpo_line_add LIKE TABLE OF stpo_api03 WITH HEADER LINE.
DATA: t_stpo_new LIKE TABLE OF stpo_api03 WITH HEADER LINE.
DATA: w_stlnr LIKE mast-stlnr.
DATA: t_stpo_mod LIKE TABLE OF stpo_api03 WITH HEADER LINE.
DATA: temp-component LIKE stpo-idnrk.
DATA: i_stpo LIKE TABLE OF stpo WITH HEADER LINE.
DATA: i_stpu LIKE TABLE OF stpu WITH HEADER LINE.
w_stlnr = ''.
CLEAR i_stpo[].
i_stko-base_quan = 1.
SELECT SINGLE stlnr INTO w_stlnr FROM mast WHERE matnr = material AND werks = plant AND stlan = 1 .
SELECT * INTO CORRESPONDING FIELDS OF TABLE i_stpo
FROM stpo WHERE stlnr = w_stlnr AND stlty = 'M'
.
SELECT * INTO CORRESPONDING FIELDS OF TABLE i_stpu
FROM stpu WHERE stlnr = w_stlnr AND stlty = 'M'
.
SORT i_stpo BY posnr idnrk stlkn DESCENDING .
LOOP AT t_stpo1.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = t_stpo1-component
IMPORTING
utput = temp-component.
IF t_stpo1-fldelete = 'X'."删除处理
READ TABLE i_stpo WITH KEY posnr = t_stpo1-item_no idnrk = temp-component postp = t_stpo1-item_categ.
IF sy-subrc = 0.
MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
t_stpo_mod-item_node = i_stpo-stlkn.
t_stpo_mod-item_count = i_stpo-stpoz.
APPEND t_stpo_mod.
* DELETE FROM STPU WHERE stlnr = w_stlnr AND stlty = 'M' AND STLKN = i_stpo-stlkn.
ELSE.
CONCATENATE '要删除的物料没有找到' t_stpo1-component INTO return.
WRITE:/ '删除处理',return.
LEAVE .
ENDIF.
ENDIF.
IF t_stpo1-fldelete = 'A'."新增处理
MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
t_stpo_mod-fldelete = ''.
APPEND t_stpo_mod.
WRITE:/ 'ZCSAP_MAT_BOM_MAINTAIN-return',return.
ENDIF.
IF t_stpo1-fldelete = 'M'."修改处理
READ TABLE i_stpo WITH KEY posnr = t_stpo1-item_no idnrk = temp-component postp = t_stpo1-item_categ.
IF sy-subrc = 0.
* 当修改数量,原物料有安装地点,而新的没有安装地点时,需要先删除以前的,再新增加一条。
READ TABLE i_stpu WITH KEY stlkn = i_stpo-stlkn.
IF sy-subrc = 0.
READ TABLE t_stpu WITH KEY pointer = t_stpo1-identifier.
IF sy-subrc <> 0."而新的没有安装地点时.
* 原来一条删除
t_stpo_mod-item_node = i_stpo-stlkn.
t_stpo_mod-item_count = i_stpo-stpoz.
t_stpo_mod-fldelete = 'X'.
APPEND t_stpo_mod.
* 新增一条
MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
t_stpo_mod-fldelete = ''.
APPEND t_stpo_mod.
ENDIF.
ELSE."原有物料也没有安装地点,直接修改
MOVE-CORRESPONDING t_stpo1 TO t_stpo_mod.
t_stpo_mod-item_node = i_stpo-stlkn.
t_stpo_mod-item_count = i_stpo-stpoz.
t_stpo_mod-fldelete = ''.
APPEND t_stpo_mod.
ENDIF.
ELSE.
CONCATENATE '要修改的物料没有找到' t_stpo1-component INTO return.
WRITE:/ '修改处理',return.
LEAVE .
ENDIF.
ENDIF.
ENDLOOP.
*新增
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
material = material
plant = plant
bom_usage = bom_usage
* VALID_FROM =
change_no = change_no
i_stko = i_stko
fl_bom_create = 'X'
fl_new_item = 'X'
* fl_commit_and_wait = 'X'
* fl_default_values = 'X'
IMPORTING
fl_warning = fl_warning
o_stko = o_stko
TABLES
t_stpo = t_stpo_mod
t_stpu = t_stpu
EXCEPTIONS
error = 1
OTHERS = 2
.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = return.
IF sy-subrc <> 0.
return2 = return+12(10).
WRITE:/ '建立时错误信息:',return2.
WRITE: return2.
ELSE.
WRITE:/ return2.
WRITE:/ '建立时信息:',return.
ENDIF.
ENDFUNCTION.