工序分配BOM组件 含虚拟键 半成品
FORM frm_assgin_bom_n USING VALUE(p_matnr)
VALUE(p_werks)
VALUE(p_stlan) TYPE stzu-stlan
VALUE(p_stlal) TYPE stko-stlal.
DATA:cs_main TYPE typ_main.
DATA:lv_mess(200).
TYPES:BEGIN OF ty_bom.
INCLUDE STRUCTURE stpox.
TYPES: vornr TYPE plpo-vornr.
TYPES:END OF ty_bom.
DATA:it_bom TYPE TABLE OF ty_bom,
is_bom TYPE ty_bom,
cs_bom TYPE ty_bom.
DATA:lv_vornr TYPE plpo-vornr.
READ TABLE gt_main INTO cs_main WITH KEY matnr = p_matnr
werks = p_werks
stlan = p_stlan
stlal = p_stlal.
IF cs_main-plnnr IS INITIAL.
MESSAGE ‘工艺路线组未填,BOM物料在工艺分配失败’ TYPE ‘S’.
EXIT.
ENDIF.
SELECT SINGLE * INTO @DATA(cs_plko) FROM plko WHERE plnnr = @cs_main-plnnr.
IF sy-subrc NE 0.
CONCATENATE ‘工艺路线’ cs_main-plnnr ‘,不存在,BOM物料在工艺分配失败’ INTO lv_mess SEPARATED BY space.
MESSAGE ‘工艺路线组未填,BOM物料在工艺分配失败’ TYPE ‘S’.
EXIT.
ELSE.
IF cs_plko-werks <> p_werks.
CONCATENATE ‘工艺路线’ cs_main-plnnr ‘,不在工厂’ p_werks ‘,BOM物料在工艺分配失败’ INTO lv_mess SEPARATED BY space.
MESSAGE ‘工艺路线组未填,BOM物料在工艺分配失败’ TYPE ‘S’.
EXIT.
ENDIF.
ENDIF.
SELECT SINGLE * INTO @DATA(cs_mapl) FROM mapl WHERE matnr = @p_matnr
AND werks = @p_werks
AND plnnr = @cs_main-plnnr.
IF sy-subrc NE 0.
CONCATENATE ‘物料’ p_matnr ‘没有分配到工艺路线’ cs_main-plnnr ‘,BOM物料在工艺分配失败’ INTO lv_mess SEPARATED BY space.
MESSAGE ‘工艺路线组未填,BOM物料在工艺分配失败’ TYPE ‘S’.
EXIT.
ENDIF.
DATA:lt_stpox TYPE TABLE OF stpox.
DATA:lt_stpox2 TYPE TABLE OF stpox.
DATA:is_stpox TYPE stpox.
DATA:cs_cstmat TYPE cstmat.
DATA:it_main TYPE TABLE OF typ_main.
DATA:is_main TYPE typ_main.
REFRESH:it_main,lt_stpox,lt_stpox2,it_bom.
APPEND LINES OF gt_main TO it_main.
DELETE it_main WHERE matnr <> p_matnr.
DELETE it_main WHERE werks <> p_werks.
DELETE it_main WHERE stlan <> p_stlan.
DELETE it_main WHERE stlal <> p_stlal.
"展机台BOM
DATA:lv_date TYPE sy-datum.
lv_date = cs_main-datuv.
DO 1000 TIMES.
CALL FUNCTION ‘CS_BOM_EXPL_MAT_V2’
EXPORTING
aufsw = ‘X’ "确定订单层次与路径(工艺路线虚拟组件分配的时候需要根据这个标识获取订单层次与路径)
capid = ‘PP01’
datuv = lv_date
emeng = 1
mdnot = ‘X’
mdmps = ‘X’ "展开虚拟件
mehrs = ‘X’ "展开多层
mtnrv = p_matnr
stlal = p_stlal
stlan = p_stlan
werks = p_werks
IMPORTING
topmat = cs_cstmat
TABLES
stb = lt_stpox
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
IF lt_stpox IS NOT INITIAL.
EXIT.
ENDIF.
ENDDO.
APPEND LINES OF lt_stpox TO lt_stpox2.
CALL FUNCTION ‘CS_X4_NODE_DETERMINATION’
EXPORTING
i_stlty_w = cs_cstmat-stlty "根据上一步CS_BOM_EXPL_MAT_V2获取的值传入进来
i_stlnr_w = cs_cstmat-stlnr "根据上一步CS_BOM_EXPL_MAT_V2获取的值传入进来
i_stlal_w = cs_cstmat-stlal "根据上一步CS_BOM_EXPL_MAT_V2获取的值传入进来
i_flg_create_nodes = ‘X’
i_flg_node_for_class = ‘X’
i_flg_check_node = ‘X’
i_flg_special_class = ‘X’
i_flg_node_for_assem = ‘X’
i_flg_calc_path2 = ‘X’
i_flg_calc_path4 = ‘X’
TABLES
stb = lt_stpox2 "根据上一步函数CS_BOM_EXPL_MAT_V2得到BOM列表信息传入赋值进来
EXCEPTIONS
wrong_initialization = 1
foreign_lock = 2
system_failure = 3
stb_inconsistent = 4
stvkn_not_initialized = 5
OTHERS = 6.
IF sy-subrc <> 0.
-
Implement suitable error handling here
ENDIF."组件分配工序号
LOOP AT lt_stpox2 INTO is_stpox.
CLEAR is_bom.
MOVE-CORRESPONDING is_stpox TO is_bom.IF is_stpox-stufe = 1. "第1阶bom
READ TABLE it_main INTO is_main WITH KEY posnr = is_stpox-posnr
idnrk = is_stpox-idnrk
menge = is_stpox-menge.
IF sy-subrc = 0.
is_bom-vornr = is_main-vornr.
lv_vornr = is_main-vornr.
ENDIF.
ELSE."虚拟键bom
is_bom-vornr = lv_vornr.
ENDIF.APPEND is_bom TO it_bom.
ENDLOOP.DATA:lt_comp TYPE TABLE OF cps_task_list_maint_com,
ls_comp TYPE cps_task_list_maint_com,
lt_compx TYPE TABLE OF cps_task_list_maint_com_x,
ls_compx TYPE cps_task_list_maint_com_x,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.READ TABLE lt_stpox2 INTO DATA(lw_stpox) WITH KEY stufe = 1.
REFRESH:lt_comp,lt_compx,lt_return.LOOP AT it_bom INTO is_bom.
CLEAR:ls_comp,ls_compx.
ls_comp-maintain_mode = ‘C’. "操作模式:C:创建,M:修改,D:删除 PS:如未分配(PLMZ表没数据)则选择C模式
ls_comp-flag_bar_pointer = is_bom-index."操作模式序号,如不分配则报错
ls_comp-activity = is_bom-vornr.
ls_comp-sequence_no = ‘000000’. "排序号
ls_comp-item_id = is_bom-stvkn."项目ID
ls_comp-bom_type = ‘M’. "BOM类型
ls_comp-bom_no = is_bom-stlnr. "物料清单
ls_comp-alternative_bom = is_bom-stlal."备选物料清单
ls_comp-item_no = is_bom-posnr."BOM项目号
ls_comp-plant = p_werks. "工厂ls_comp-order_lvl = is_bom-aufst."层次,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
ls_comp-order_path = is_bom-aufwg."路径,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
ls_comp-path = is_bom-nlink.
ls_comp-bom_no_root = lw_stpox-stlnr. "父件物料清单 -先默认第一级bom信息
ls_comp-alternative_bom_root = p_stlal. " 父件备选物料清单-先默认自己bom信息
ls_comp-bom_type_root = ‘M’. "父件BOM类型IF is_bom-stufe = 1.
ls_comp-material = p_matnr."父件BOM的物料号
ELSE.
READ TABLE lt_stpox INTO DATA(cs_stpox) WITH KEY xtlnr = is_bom-stlnr.
IF sy-subrc = 0.
ls_comp-material = cs_stpox-idnrk."父件BOM的物料号
ENDIF.
ENDIF.IF is_bom-afflg <> ‘’. "非虚拟键,半成品
ls_comp-order_lvl = cs_bom-aufst. "上一行 层次
ls_comp-order_path = cs_bom-aufwg. "上一行 路径
ls_comp-path = cs_bom-nlink. "上一行 展开BOM树中的边
ELSE.
MOVE-CORRESPONDING is_bom TO cs_bom.
ENDIF.APPEND ls_comp TO lt_comp.
ls_compx-activity = ‘X’.
ls_compx-plant = ‘X’.
ls_compx-sequence_no = ‘X’.ls_compx-plant = ‘X’.
ls_compx-material = ‘X’.ls_compx-bom_type_root = ‘X’.
ls_compx-bom_no_root = ‘X’.
ls_compx-alternative_bom_root = ‘X’.
ls_compx-order_lvl = ‘X’.
ls_compx-order_path = ‘X’.
ls_compx-path = ‘X’.APPEND ls_compx TO lt_compx.
ENDLOOP.
CALL FUNCTION ‘CPCC_S_TASK_LIST_MAINTAIN’
EXPORTING
key_date = lv_date
task_list_type = ‘N’ "任务清单类型 PLMZ-PLNTY
task_list_group = cs_plko-plnnr "组 PLMZ-PLNNR
group_counter = cs_plko-plnal "组计数器 PLMZ-PLNAL
"task_maintain_mode = ‘M’ "表头task结构操作模式
application = ‘PP01’
bom_usage = ‘1’
material = p_matnr "工艺路线父项物料号
plant = p_werks "工厂
TABLES
component_allocations = lt_comp
component_allocations_x = lt_compx
return = lt_return.LOOP AT lt_return WHERE type CA ‘EAX’.
CONCATENATE lv_mess lt_return-message INTO lv_mess SEPARATED BY space.
ENDLOOP.IF lv_mess = ‘’.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’ "导入成功
EXPORTING
wait = ‘X’.lv_mess = ‘BOM物料在工艺分配成功’.
ELSE.
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.lv_mess = ‘BOM物料在工艺分配失败,’ && lv_mess.
ENDIF.MESSAGE lv_mess TYPE ‘S’.
ENDFORM.