三个BAPI可以用来创建BOM
1、CSAP_MAT_BOM_CREATE
call function 'CSAP_MAT_BOM_CREATE'
exporting
material = g_matnr
plant = g_werks
bom_usage = g_stlan
valid_from = g_datuv
change_no = g_aennr
* REVISION_LEVEL =
i_stko = gw_stko_api01
* FL_NO_CHANGE_DOC = ' '
* FL_COMMIT_AND_WAIT = ' '
* FL_CAD = ' '
* FL_DEFAULT_VALUES = 'X'
* FL_RECURSIVE = ' '
* IMPORTING
* FL_WARNING =
* BOM_NO =
tables
t_stpo = gt_stpo_api03
* T_DEP_DATA =
* T_DEP_DESCR =
* T_DEP_ORDER =
* T_DEP_SOURCE =
* T_DEP_DOC =
* T_LTX_LINE =
* T_STPU =
* T_FSH_BOMD =
* T_SGT_BOMC =
exceptions
error = 1
others = 2.
if sy-subrc <> 0.
* Implement suitable error handling here
endif.
这个BAPI没有"可选的BOM"字段的传值,默认为"01"。
2、CSAP_MAT_BOM_MAINTAIN
call function 'CSAP_MAT_BOM_MAINTAIN'
exporting
material = g_matnr
plant = g_werks
bom_usage = g_stlan
alternative = lv_stlal
valid_from = g_datuv
change_no = g_aennr
i_stko = gw_stko_api01
fl_commit_and_wait = 'X'
fl_bom_create = 'X'
fl_new_item = 'X'
fl_complete = 'X'
tables
t_stpo = gt_stpo_api03
exceptions
error = 1
others = 2.
if sy-subrc = 0. "成功
commit work and wait.
gw_ztpp021-resultstatus = 'S'.
else. "出错
rollback work.
gw_ztpp021-resultstatus = 'E'.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
into gw_ztpp021-resultmsg.
endif.
这个BAPI有"可选的BOM"字段的传值,但是需要注意的是,传"可选的BOM"值时需要补足前导0,即传值"2"时,要加前导0,传入"02"。
但是以上两个BAPI在已经创建了这个物料的BOM的情况下,都无法再创建一个新的可选的BOM,会报错提示:“用于……的BOM 已占用”。
查询并测试后,发现以下BAPI可创建新的可选的BOM
BAPI_MATERIAL_BOM_GROUP_CREATE
data: lt_bomgroup like bapi1080_bgr_c occurs 0 with header line,
lt_variants like bapi1080_bom_c occurs 0 with header line,
lt_items like bapi1080_itm_c occurs 0 with header line,
lt_subitems like bapi1080_sui_c occurs 0 with header line,
lt_materialr like bapi1080_mbm_c occurs 0 with header line,
lt_itemassig like bapi1080_rel_itm_bom_c occurs 0 with header line,
lt_subitemas like bapi1080_rel_sui_itm_c occurs 0 with header line,
texts like bapi1080_txt_c occurs 0 with header line,
lt_return like bapiret2 occurs 0 with header line.
data: lv_stlal type mast-stlal.
lv_stlal = '11'.
lt_bomgroup-bom_group_identification = 'BAPI_SMP_COL1'.
lt_bomgroup-object_type = 'BGR'.
lt_bomgroup-object_id = 'SIMPLE1'.
lt_bomgroup-bom_usage = g_stlan. " YOU COULD CHANGE THE BOM USAGE TO YOUR
lt_bomgroup-ltxt_lang = sy-langu.
lt_bomgroup-created_in_plant = g_werks.
lt_bomgroup-technical_type = ' '.
* lt_bomgroup-bom_text = ls_head-ztext.
* lt_bomgroup-auth_group = ls_head-stlbe.
append lt_bomgroup.
clear lt_bomgroup.
* Header Details of the different variants
clear lt_variants.
lt_variants-bom_group_identification = 'BAPI_SMP_COL1'.
lt_variants-object_type = 'BOM'.
lt_variants-object_id = 'SIMPLE1'.
lt_variants-alternative_bom = lv_stlal. "可选BOM
* lt_variants-bom_status = '01'. "BOM状态
lt_variants-bom_status = gw_stko_api01-bom_status."BOM状态
lt_variants-base_qty = gw_stko_api01-base_quan. "数量
lt_variants-base_unit = gw_stko_api01-base_unit. "单位
lt_variants-valid_from_date = sy-datum. "有效期起始日期
* lt_variants-alt_text = ls_head-stktx. "可选BOM文本
lt_variants-function = 'NEW'.
append lt_variants.
* 物料分配 CREATE-/CHANGE BAPI 物料 BOM
clear lt_materialr.
lt_materialr-bom_group_identification = 'BAPI_SMP_COL1'.
lt_materialr-material = g_matnr. "物料编码
lt_materialr-plant = g_werks. "工厂
lt_materialr-bom_usage = g_stlan. "BOM用途
lt_materialr-alternative_bom = lv_stlal. "可选BOM
* lt_materialr-lot_size_from = ls_head-losvn. "从批量
* lt_materialr-lot_size_to = ls_head-losvn. "到批量
append lt_materialr.
data:l_object_id type cs_object_id.
data:l_tabix type sy-tabix.
data:l_tabic type char10.
data:lv_posnr type sposn.
data:lv_i type i.
data:lv_n type n length 4.
clear :lv_posnr,lv_i,lv_n.
lv_i = 10.
* Details of the items of the variants
loop at gt_stpo_api03 into data(ls_item).
clear:l_tabix,
l_tabic,
l_object_id.
l_tabix = sy-tabix.
move l_tabix to l_tabic.
concatenate 'SIMPLE' l_tabic into l_object_id.
condense l_object_id no-gaps.
lv_n = lv_i.
lv_posnr = lv_n.
clear lt_items.
lt_items-bom_group_identification = 'BAPI_SMP_COL1'.
lt_items-object_type = 'ITM'.
lt_items-object_id = l_object_id.
lt_items-item_no = lv_posnr. "行号
lt_items-item_cat = ls_item-item_categ. "类别
lt_items-sort_string = ls_item-sortstring. "排序字符串
lt_items-component = ls_item-component. "组件物料
lt_items-item_text1 = ls_item-item_text1. "项目文本1
lt_items-item_text2 = ls_item-item_text2. "项目文本2
lt_items-comp_qty = ls_item-comp_qty. "组件数量 (BTCI)
lt_items-comp_unit = ls_item-comp_unit. "组件计量单位
lt_items-ltxt_lang = sy-langu.
lt_items-valid_from_date = gw_ztpp021-datuv. "有效起始日期
lt_items-mat_provision = ls_item-mat_provis. "物料供应标识
* lt_items-opr_scrap = ls_item-avoau. "工序废品
* lt_items-spproctype = ls_item-itsob. "特殊获取类
* lt_items-iss_st_loc = ls_item-lgort. "库存地点
* lt_items-alt_item_group = ls_item-alpgr. "替代组
* lt_items-alt_item_strategy = ls_item-alpst. "替代策咯
* lt_items-alt_item_prio = ls_item-alprf. "优先级
* lt_items-usage_prob = ls_item-ewahr. "使用可能性
append lt_items.
clear lt_itemassig.
lt_itemassig-bom_group_identification = 'BAPI_SMP_COL1'.
lt_itemassig-sub_object_type = 'ITM'.
lt_itemassig-sub_object_id = l_object_id."'SIMPLE1'.
lt_itemassig-super_object_type = 'BOM'.
lt_itemassig-super_object_id = 'SIMPLE1'.
lt_itemassig-valid_from_date = gw_ztpp021-datuv.
lt_itemassig-function = 'NEW'.
append lt_itemassig.
clear ls_item.
lv_i = lv_i + 10.
endloop.
* 调用BAPI,创建BOM。
call function 'BAPI_MATERIAL_BOM_GROUP_CREATE'
exporting
* testrun = ' '
all_error = 'X'
tables
bomgroup = lt_bomgroup
variants = lt_variants
items = lt_items
materialrelations = lt_materialr
itemassignments = lt_itemassig
return = lt_return.
read table lt_return with key type = 'E'.
if sy-subrc = 0. "出错
call function 'BAPI_TRANSACTION_ROLLBACK'.
gw_ztpp021-resultstatus = 'E'.
gw_ztpp021-resultmsg = lt_return-message.
else. "成功
gw_ztpp021-resultstatus = 'S'.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
endif.
需要注意的是:传"可选的BOM"值时一样需要补足前导0,即传值"2"时,要加前导0,传入"02"。
OVER……