CS02
背景:根据变更编号和数据对BOM进行修改操作
I_HEAD 和 I_ITEM分别为接口的导入抬头数据和导入项目数据
I_HEAD结构
I_ITEM结构
创建变更编号关键代码:
LV_CHANGE_NO = I_HEAD-AENNR.
LV_CHANGE_NO = |{ LV_CHANGE_NO ALPHA = IN }|.
LS_CHANGE_HEADER-CHANGE_NO = LV_CHANGE_NO.
LS_CHANGE_HEADER-STATUS = I_HEAD-AENST.
LS_CHANGE_HEADER-VALID_FROM = I_HEAD-DATUV.
LS_CHANGE_HEADER-DESCRIPT = I_HEAD-AETXT.
"勾选下列四个
LS_OBJECT_BOM_MAT-ACTIVE = 'X'.
LS_OBJECT_BOM_MAT-OBJ_REQU = 'X'.
LS_OBJECT_BOM_MAT-MGTREC_GEN = 'X'.
LS_OBJECT_BOM_MAT-GEN_NEW = 'X'.
LS_OBJMGREC-BOM_USAGE = I_HEAD-STLAN. "BOM 用途
LS_OBJMGREC-MATERIAL = I_HEAD-MATNR.
LS_OBJMGREC-PLANT = I_HEAD-WRKAN.
LS_OBJMGREC-CHG_OBJTYP = '1'. "工程更改管理对象\
LS_OBJMGREC-BOM_CAT = 'M'.
APPEND LS_OBJMGREC TO LT_OBJMGREC.
CLEAR LS_OBJMGREC.
"查看当前变更编号是否已在系统中存在
CALL FUNCTION 'CCAP_ECN_HEADER_READ'
EXPORTING
CHANGE_NO = LV_CHANGE_NO
IMPORTING
CHANGE_HEADER = LS_CHG
EXCEPTIONS
NO_RECORD_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0. "不存在创建
CALL FUNCTION 'CCAP_ECN_CREATE'
EXPORTING
CHANGE_HEADER = LS_CHANGE_HEADER
OBJECT_BOM = LS_OBJECT_BOM_MAT
OBJECT_BOM_MAT = LS_OBJECT_BOM_MAT
FL_COMMIT_AND_WAIT = 'X'
IMPORTING
CHANGE_NO = LV_CHANGE_NO
TABLES
OBJMGREC = LT_OBJMGREC
EFFECTIVITY = LT_EFFECTIVITY
EXCEPTIONS
CHANGE_NO_ALREADY_EXISTS = 1
ERROR = 2
OTHERS = 3.
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.
ELSE. "存在做修改
CALL FUNCTION 'CCAP_ECN_MAINTAIN'
EXPORTING
CHANGE_HEADER = LS_CHANGE_HEADER
OBJECT_BOM = LS_OBJECT_BOM_MAT
OBJECT_BOM_MAT = LS_OBJECT_BOM_MAT
* object_bom_psp = ls_object_bom_mat
FL_NO_COMMIT_WORK = SPACE
FL_SYNCH = SPACE
TABLES
OBJMGREC = LT_OBJMGREC
EFFECTIVITY = LT_EFFECTIVITY
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.
ENDIF.
情况1、仅对指定行项目和物料号的数据进行修改,不更改其他
LOOP AT I_ITEM INTO DATA(LS_I_ITEM).
LV_POSNR = LS_I_ITEM-POSNR.
LS_T_STPO-ID_ITEM_NO = LV_POSNR. "项目号
CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
EXPORTING
INPUT = LS_T_STPO-ID_ITEM_NO
IMPORTING
OUTPUT = LS_T_STPO-ID_ITEM_NO.
CLEAR LV_POSNR.
LS_T_STPO-ITEM_CATEG = LS_I_ITEM-POSTP. "项目类型
LS_T_STPO-ID_COMP = LS_I_ITEM-IDNRK. "子件物料
LS_T_STPO-COMP_QTY = LS_I_ITEM-MENGE. "数量
LS_T_STPO-VALID_FROM = LV_VALID_FROM.
LS_T_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
LS_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
LS_T_STPO-COMPONENT = LS_T_STPO-ID_COMP.
* LS_T_STPO-FLDELETE = 'X'."此字段不为空的话表示删除LV_POSNR和LS_I_ITEM-IDNRK对应的BOM组件
APPEND LS_T_STPO TO LT_T_STPO.
CLEAR: LS_T_STPO.
ENDLOOP.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
MATERIAL = LV_MATERIAL
PLANT = LV_PLANT
BOM_USAGE = LV_BOM_USAGE
ALTERNATIVE = LV_ALTERNATIVE
VALID_FROM = LV_VALID_FROM
CHANGE_NO = LV_CHANGE_NO
I_STKO = LS_I_STKO
FL_COMMIT_AND_WAIT = 'X'
FL_BOM_CREATE = 'X'
FL_NEW_ITEM = 'X'
FL_COMPLETE = 'X'
* FL_DEFAULT_VALUES = 'X'
IMPORTING
FL_WARNING = LV_FL_WARNING
O_STKO = LS_O_STKO
TABLES
T_STPO = LT_T_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
情况2、在修改BOM组件之前删除掉旧的组件
对于这种情况,在T_STPO中有个字段为FLDELETE,如果情况1中的ITEM数据都给这个字段赋值为X,则表示删除掉该BOM中对应项目号和组件号的BOM组件。
如果直接使用CS_BOM_EXPL_MAT_V2展开这个BOM,则只能得到变更生效的组件项目,而不能得到未生效的组件项目,因此,我们需要先使用函数CSAP_MAT_BOM_OPEN来获得BOM的组件项目,并将组件项目全部删除,主要代码如下:
V_MATERIAL = I_HEAD-MATNR. "父件物料
LV_PLANT = I_HEAD-WRKAN. " 工厂
LV_BOM_USAGE = I_HEAD-STLAN. "用途
LV_ALTERNATIVE = I_HEAD-STLAL. "备选
LV_VALID_FROM = I_HEAD-DATUV. "生效时间
LV_CHANGE_NO = LV_CHANGE_NO. "变更号
* LS_I_STKO-BOM_STATUS = I_HEAD-STLST. "状态
* LS_I_STKO-BASE_QUAN = I_HEAD-BMENG.
* LS_I_STKO-BOM_GROUP = I_HEAD-STLAL.
* LS_I_STKO-DELETE_IND
CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
EXPORTING
MATERIAL = LV_MATERIAL
PLANT = LV_PLANT
BOM_USAGE = LV_BOM_USAGE
ALTERNATIVE = LV_ALTERNATIVE
VALID_FROM = LV_VALID_FROM
TABLES
T_STPO = LT_STPO"这里得到了LV_MATERIAL对应的BOM的所有的组件数据
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC EQ 0.
LOOP AT LT_STPO ASSIGNING FIELD-SYMBOL(<LFS_STPO>).
<LFS_STPO>-FLDELETE = 'X'."注意,这里将得到的组件项目打上删除标记
ENDLOOP.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
MATERIAL = LV_MATERIAL
PLANT = LV_PLANT
BOM_USAGE = LV_BOM_USAGE
ALTERNATIVE = LV_ALTERNATIVE
VALID_FROM = LV_VALID_FROM
CHANGE_NO = LV_CHANGE_NO
I_STKO = LS_I_STKO
FL_COMMIT_AND_WAIT = 'X'
FL_BOM_CREATE = 'X'
FL_NEW_ITEM = 'X'
FL_COMPLETE = 'X'
IMPORTING
FL_WARNING = LV_FL_WARNING
O_STKO = LS_O_STKO
TABLES
T_STPO = LT_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
ENDIF.
接口全部代码如下所示:
FUNCTION Z_XXXX.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_HEAD) TYPE ZPPS_PDM_ECN
*" VALUE(I_ITEM) TYPE ZPPT_PDM_ECN_ITEM
*" EXPORTING
*" VALUE(E_TYP) TYPE CHAR1
*" VALUE(E_MSG) TYPE CHAR255
*"----------------------------------------------------------------------
DATA:RETURN TYPE STRING.
DATA:LV_MATERIAL TYPE CSAP_MBOM-MATNR,
LV_PLANT TYPE CSAP_MBOM-WERKS,
LV_BOM_USAGE TYPE CSAP_MBOM-STLAN,
LV_ALTERNATIVE TYPE CSAP_MBOM-STLAL,
LV_VALID_FROM TYPE CSAP_MBOM-DATUV,
LV_CHANGE_NO TYPE CSAP_MBOM-AENNR,
LS_I_STKO TYPE STKO_API01,
LS_O_STKO TYPE STKO_API02,
LT_T_STPO TYPE TABLE OF STPO_API03,
LS_T_STPO TYPE STPO_API03,
LT_STPO TYPE TABLE OF STPO_API03,
LS_STPO TYPE STPO_API03.
DATA:LV_FL_WARNING TYPE CAPIFLAG-FLWARNING.
"创建变更号参数
DATA: LS_CHANGE_HEADER TYPE AENR_API01.
DATA: LS_CHG TYPE AENR_API02.
DATA: LS_RETURN_MSG TYPE BAPIRET2.
DATA: LS_OBJECT_BOM_MAT TYPE AENV_API01..
DATA: LS_OBJECT_BOM_PSP TYPE AENV_API01..
DATA: LS_OBJECT_DOC TYPE AENV_API01.
DATA: LT_OBJMGREC TYPE STANDARD TABLE OF AEOI_API01.
DATA: LS_OBJMGREC TYPE AEOI_API01.
DATA: LT_EFFECTIVITY TYPE STANDARD TABLE OF AEEF_API01.
DATA: LS_EFFECTIVITY TYPE AEEF_API01.
DATA:LV_POSNR TYPE I.
DATA:LT_STB TYPE TABLE OF STPOX.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = I_HEAD-MATNR
IMPORTING
OUTPUT = I_HEAD-MATNR.
LV_CHANGE_NO = I_HEAD-AENNR.
LV_CHANGE_NO = |{ LV_CHANGE_NO ALPHA = IN }|.
LS_CHANGE_HEADER-CHANGE_NO = LV_CHANGE_NO.
LS_CHANGE_HEADER-STATUS = I_HEAD-AENST.
LS_CHANGE_HEADER-VALID_FROM = I_HEAD-DATUV.
LS_CHANGE_HEADER-DESCRIPT = I_HEAD-AETXT.
LS_OBJECT_BOM_MAT-ACTIVE = 'X'.
LS_OBJECT_BOM_MAT-OBJ_REQU = 'X'.
LS_OBJECT_BOM_MAT-MGTREC_GEN = 'X'.
LS_OBJECT_BOM_MAT-GEN_NEW = 'X'.
LS_OBJMGREC-BOM_USAGE = I_HEAD-STLAN. "BOM 用途
LS_OBJMGREC-MATERIAL = I_HEAD-MATNR.
LS_OBJMGREC-PLANT = I_HEAD-WRKAN.
LS_OBJMGREC-CHG_OBJTYP = '1'. "工程更改管理对象\
LS_OBJMGREC-BOM_CAT = 'M'.
APPEND LS_OBJMGREC TO LT_OBJMGREC.
CLEAR LS_OBJMGREC.
CALL FUNCTION 'CCAP_ECN_HEADER_READ'
EXPORTING
CHANGE_NO = LV_CHANGE_NO
IMPORTING
CHANGE_HEADER = LS_CHG
EXCEPTIONS
NO_RECORD_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0. "不存在创建
CALL FUNCTION 'CCAP_ECN_CREATE'
EXPORTING
CHANGE_HEADER = LS_CHANGE_HEADER
OBJECT_BOM = LS_OBJECT_BOM_MAT
OBJECT_BOM_MAT = LS_OBJECT_BOM_MAT
FL_COMMIT_AND_WAIT = 'X'
IMPORTING
CHANGE_NO = LV_CHANGE_NO
TABLES
OBJMGREC = LT_OBJMGREC
EFFECTIVITY = LT_EFFECTIVITY
EXCEPTIONS
CHANGE_NO_ALREADY_EXISTS = 1
ERROR = 2
OTHERS = 3.
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.
ELSE. "存在做修改
CALL FUNCTION 'CCAP_ECN_MAINTAIN'
EXPORTING
CHANGE_HEADER = LS_CHANGE_HEADER
OBJECT_BOM = LS_OBJECT_BOM_MAT
OBJECT_BOM_MAT = LS_OBJECT_BOM_MAT
* object_bom_psp = ls_object_bom_mat
FL_NO_COMMIT_WORK = SPACE
FL_SYNCH = SPACE
TABLES
OBJMGREC = LT_OBJMGREC
EFFECTIVITY = LT_EFFECTIVITY
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.
ENDIF.
IF SY-SUBRC = 0 .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
.
ELSE.
E_TYP = 'E'.
E_MSG = LV_CHANGE_NO && '创建修改失败,请检查上传的数据.'.
ENDIF.
IF E_TYP IS INITIAL.
LV_MATERIAL = I_HEAD-MATNR. "父件物料
LV_PLANT = I_HEAD-WRKAN. " 工厂
LV_BOM_USAGE = I_HEAD-STLAN. "用途
LV_ALTERNATIVE = I_HEAD-STLAL. "备选
LV_VALID_FROM = I_HEAD-DATUV. "生效时间
LV_CHANGE_NO = LV_CHANGE_NO. "变更号
CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
EXPORTING
MATERIAL = LV_MATERIAL
PLANT = LV_PLANT
BOM_USAGE = LV_BOM_USAGE
ALTERNATIVE = LV_ALTERNATIVE
VALID_FROM = LV_VALID_FROM
TABLES
T_STPO = LT_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC EQ 0.
LOOP AT LT_STPO ASSIGNING FIELD-SYMBOL(<LFS_STPO>).
<LFS_STPO>-FLDELETE = 'X'.
ENDLOOP.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
MATERIAL = LV_MATERIAL
PLANT = LV_PLANT
BOM_USAGE = LV_BOM_USAGE
ALTERNATIVE = LV_ALTERNATIVE
VALID_FROM = LV_VALID_FROM
CHANGE_NO = LV_CHANGE_NO
I_STKO = LS_I_STKO
FL_COMMIT_AND_WAIT = 'X'
FL_BOM_CREATE = 'X'
FL_NEW_ITEM = 'X'
FL_COMPLETE = 'X'
IMPORTING
FL_WARNING = LV_FL_WARNING
O_STKO = LS_O_STKO
TABLES
T_STPO = LT_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
ENDIF.
LOOP AT I_ITEM INTO DATA(LS_I_ITEM).
LV_POSNR = LS_I_ITEM-POSNR.
LS_T_STPO-ID_ITEM_NO = LV_POSNR. "项目号
CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
EXPORTING
INPUT = LS_T_STPO-ID_ITEM_NO
IMPORTING
OUTPUT = LS_T_STPO-ID_ITEM_NO.
CLEAR LV_POSNR.
LS_T_STPO-ITEM_CATEG = LS_I_ITEM-POSTP. "项目类型
LS_T_STPO-ID_COMP = LS_I_ITEM-IDNRK. "子件物料
LS_T_STPO-COMP_QTY = LS_I_ITEM-MENGE. "数量
LS_T_STPO-VALID_FROM = LV_VALID_FROM.
LS_T_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
LS_STPO-ITEM_NO = LS_T_STPO-ID_ITEM_NO.
LS_T_STPO-COMPONENT = LS_T_STPO-ID_COMP.
APPEND LS_T_STPO TO LT_T_STPO.
CLEAR: LS_T_STPO.
ENDLOOP.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
MATERIAL = LV_MATERIAL
PLANT = LV_PLANT
BOM_USAGE = LV_BOM_USAGE
ALTERNATIVE = LV_ALTERNATIVE
VALID_FROM = LV_VALID_FROM
CHANGE_NO = LV_CHANGE_NO
I_STKO = LS_I_STKO
FL_COMMIT_AND_WAIT = 'X'
FL_BOM_CREATE = 'X'
FL_NEW_ITEM = 'X'
FL_COMPLETE = 'X'
IMPORTING
FL_WARNING = LV_FL_WARNING
O_STKO = LS_O_STKO
TABLES
T_STPO = LT_T_STPO
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC NE 0.
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.
E_MSG = RETURN.
* BREAK-POINT.
ELSE.
E_TYP = 'S'.
E_MSG = I_HEAD-MATNR && ' BOM修改成功 更改号为' && LV_CHANGE_NO.
CLEAR LV_CHANGE_NO.
ENDIF.
ENDIF.
ENDFUNCTION.