FORM f_routine_change .
DATA:l_line TYPE i.
DATA:
lv_meins TYPE mara-meins,
lv_maktx TYPE makt-maktx,
lv_type TYPE char1,
lv_msg TYPE char100,
ls_input TYPE ty_data,
lt_return TYPE STANDARD TABLE OF bapiret2,
ls_return TYPE bapiret2.
DATA: ls_operations TYPE cps_task_list_maint_opr,
lt_operations TYPE TABLE OF cps_task_list_maint_opr,
ls_operationsx TYPE cps_task_list_maint_opr_x,
lt_operationsx TYPE TABLE OF cps_task_list_maint_opr_x,
lt_comp TYPE TABLE OF cps_task_list_maint_com,
ls_comp TYPE cps_task_list_maint_com,
ls_compx TYPE cps_task_list_maint_com_x,
lt_compx TYPE TABLE OF cps_task_list_maint_com_x.
DATA:ls_topmat TYPE cstmat,
lt_stpox TYPE TABLE OF stpox,
lt_matcat TYPE TABLE OF cscmat.
READ TABLE gt_data INTO DATA(ls_data) WITH KEY msgty = 'E'.
IF sy-subrc = 0.
MESSAGE s001(zpublic) WITH TEXT-m17 DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SORT gt_data BY matnr werks plnal vornr.
SELECT a~matnr,
a~meins,
b~maktx
FROM mara AS a
LEFT OUTER JOIN makt AS b ON a~matnr = b~matnr AND
b~spras = @sy-langu
FOR ALL ENTRIES IN @gt_data
WHERE a~matnr = @gt_data-matnr
INTO TABLE @DATA(lt_mara).
BREAK con-huangjm.
LOOP AT gt_data INTO ls_data.
ls_input = ls_data.
ls_input-vornr = |{ ls_input-vornr ALPHA = IN }|.
CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
EXPORTING
input = ls_input-posnr
IMPORTING
output = ls_input-posnr.
l_line = l_line + 1.
DATA(l_tabix) = sy-tabix.
AT NEW plnal.
READ TABLE gt_data INTO DATA(lw_input) INDEX l_tabix.
"取工序的更新状态
SELECT a~plnnr,plnal,vornr
FROM plpo AS a
INNER JOIN plas AS b
ON a~plnnr = b~plnnr
AND a~plnty = b~plnty
AND a~plnkn = b~plnkn
AND a~zaehl = b~zaehl
WHERE a~plnnr = @lw_input-plnnr
AND b~plnal = @lw_input-plnal
* and a~plnty = @lw_input-plnty
" and a~zaehl = :iv_zaehl
AND b~loekz = ''
INTO TABLE @DATA(lt_vornr).
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01' "Application ID
datuv = sy-datum "Validity date
* emeng = "Required quantity
auskz = 'X' "scrap
aufsw = 'X' "scrap
* ALEKZ = lw_input-LOEKZ
mehrs = 'X' "Multi-level explosion
mtnrv = lw_input-matnr "Material
stlal = lw_input-stlal "Alternative BOM
stlan = lw_input-stlan "BOM usage
werks = lw_input-werks "Plant
mmory = '1' " 是否使用缓存
mdmps = 'X' " 虚拟件标识
* cuobj = lv_cuobj
IMPORTING
topmat = ls_topmat
TABLES
stb = lt_stpox
matcat = lt_matcat
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.
SELECT a~zuonr,
a~zaehl,
a~plnnr,
a~plnal,
a~stlal,
a~stlkn,
b~vornr
FROM plmz AS a
INNER JOIN plpo AS b ON b~plnnr = a~plnnr AND b~plnkn = a~plnkn
WHERE a~plnnr EQ @lw_input-plnnr
AND a~plnal EQ @lw_input-plnal
* AND a~STLNR eq @lw_input-STLNR
* AND a~STLAL eq @lw_input-STLAL
AND a~loekz NE 'X'
INTO TABLE @DATA(lt_plmz).
ENDAT.
AT END OF vornr.
READ TABLE lt_vornr INTO DATA(ls_vornr) WITH KEY plnnr = ls_input-plnnr plnal = ls_input-plnal vornr = ls_input-vornr.
IF sy-subrc = 0.
ls_operations-maintain_mode = 'M'.
ls_operations-activity = ls_input-vornr.
ls_operations-activity_old = ls_input-vornr.
* ls_operations-flag_bar_pointer = l_tabix + 1000000000.
ls_operations-flag_bar_pointer = '0000000001'.
DELETE lt_vornr INDEX sy-tabix.
ELSE.
"新增工序
ls_operations-maintain_mode = 'C'.
ls_operations-activity = ls_input-vornr.
ls_operations-activity_old = ls_input-vornr.
ENDIF.
* ls_operations-description = ls_input-ltxa1.
APPEND ls_operations TO lt_operations.
ls_operationsx-activity = 'X'.
* ls_operationsx-description = 'X'.
APPEND ls_operationsx TO lt_operationsx.
ENDAT.
BREAK con-huangjm.
CALL FUNCTION 'CONVERSION_EXIT_MATN5_INPUT'
EXPORTING
input = ls_input-idnrk
IMPORTING
output = ls_input-idnrk
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT lt_stpox INTO DATA(ls_stpox) WHERE posnr = ls_input-posnr AND idnrk = ls_input-idnrk.
READ TABLE lt_plmz INTO DATA(ls_plmz) WITH KEY plnnr = ls_input-plnnr
plnal = ls_input-plnal
stlal = ls_input-stlal
stlkn = ls_stpox-stvkn.
IF sy-subrc EQ 0.
IF ls_input-zdel IS NOT INITIAL.
ls_comp-maintain_mode = 'D'. "操作模式:C:创建,M:修改,D:删除 PS:如未分配(PLMZ表没数据)则选择C模式
ls_comp-flag_bar_pointer = '0000000001'. "操作模式序号,如不分配则报错
ls_comp-activity = ls_plmz-vornr. "操作/活动编号
ls_comp-activity_old = ls_plmz-vornr. "旧操作/活动编号 PS:如果是M模式则需要获取原编号,否则报错
READ TABLE lt_operations TRANSPORTING NO FIELDS WITH KEY activity = ls_plmz-vornr.
IF sy-subrc NE 0.
ls_operations-maintain_mode = 'M'.
ls_operations-activity = ls_plmz-vornr.
ls_operations-activity_old = ls_plmz-vornr.
* ls_operations-flag_bar_pointer = l_tabix + 1000000000.
ls_operations-flag_bar_pointer = '0000000001'.
APPEND ls_operations TO lt_operations.
ls_operationsx-activity = 'X'.
APPEND ls_operationsx TO lt_operationsx.
ENDIF.
ELSE.
ls_comp-maintain_mode = 'M'. "操作模式:C:创建,M:修改,D:删除 PS:如未分配(PLMZ表没数据)则选择C模式
ls_comp-flag_bar_pointer = '0000000001'. "操作模式序号,如不分配则报错
ls_comp-activity = ls_input-vornr. "操作/活动编号
ls_comp-activity_old = ls_plmz-vornr. "旧操作/活动编号 PS:如果是M模式则需要获取原编号,否则报错
READ TABLE lt_operations TRANSPORTING NO FIELDS WITH KEY activity = ls_plmz-vornr.
IF sy-subrc NE 0.
ls_operations-maintain_mode = 'M'.
ls_operations-activity = ls_plmz-vornr.
ls_operations-activity_old = ls_plmz-vornr.
* ls_operations-flag_bar_pointer = l_tabix + 1000000000.
ls_operations-flag_bar_pointer = '0000000001'.
APPEND ls_operations TO lt_operations.
ls_operationsx-activity = 'X'.
APPEND ls_operationsx TO lt_operationsx.
ENDIF.
ENDIF.
ELSE.
IF ls_input-zdel IS INITIAL..
ls_comp-maintain_mode = 'C'. "操作模式:C:创建,M:修改,D:删除 PS:如未分配(PLMZ表没数据)则选择C模式
ls_comp-flag_bar_pointer = '0000000001'. "操作模式序号,如不分配则报错
ls_comp-activity = ls_input-vornr. "操作/活动编号
ls_comp-activity_old = ls_input-vornr. "旧操作/活动编号 PS:如果是M模式则需要获取原编号,否则报错
ENDIF.
ENDIF.
ls_comp-alternative_bom = ls_stpox-stlal . "备选物料清单 ”stlal
ls_comp-bom_type = ls_stpox-stlty. "BOM类型 stlty
* ls_comp-material = ls_input-MATNR. " 物料号 idnrk
ls_comp-item_no = ls_stpox-posnr. "BOM项目号
* ls_comp-item_id = ls_stpox-stlkn. "项目ID stlkn BOM 项目节点号
ls_comp-item_id = ls_stpox-stvkn. "项目ID stlkn BOM 项目节点号
ls_comp-bom_no = ls_stpox-stlnr. "物料清单 stlnr
ls_comp-sequence_no = '000000'. "排序号
ls_comp-sequence_no_old = '000000'. "旧排序号
IF ls_stpox-stlty_w IS INITIAL.
ls_comp-bom_type_root = ls_stpox-stlty. "父件BOM类型
ls_comp-bom_no_root = ls_stpox-stlnr. "父件物料清单
ls_comp-alternative_bom_root = ls_stpox-stlal . "父件备选物料清单
ls_comp-path = ls_stpox-aufwg. "路径,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
ENDIF.
ls_comp-plant = ls_input-werks. "工厂
* comp_qty menge
* comp_unit meins
IF ls_stpox-dumps NE '' .
ls_comp-order_lvl = ls_stpox-aufst. "层次,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
ls_comp-order_path = ls_stpox-aufwg. "路径,仅虚拟件使用;如果有多层,建议通过BAPI:CS_BOM_EXPL_MAT_V2获取
ENDIF.
APPEND ls_comp TO lt_comp.
CLEAR ls_comp.
ls_compx-activity = abap_true.
ls_compx-plant = abap_true.
ls_compx-material = abap_true.
* ls_compx-alternative_bom = abap_true.
* ls_compx-bom_no = abap_true.
* ls_compx-item_no = abap_true.
* ls_compx-sequence_no_old = abap_true.
ls_compx-sequence_no = abap_true.
* ls_compx-maintain_mode = abap_true.
* ls_compx-flag_bar_pointer = abap_true.
ls_compx-activity = abap_true.
ls_compx-bom_type_root = abap_true.
ls_compx-bom_no_root = abap_true.
ls_compx-alternative_bom_root = abap_true.
ls_compx-order_lvl = abap_true.
ls_compx-order_path = abap_true.
* ls_compx-activity_old = abap_true.
APPEND ls_compx TO lt_compx.
CLEAR ls_compx.
ENDLOOP.
AT END OF plnal.
READ TABLE gt_data INTO DATA(lw_input2) INDEX l_tabix.
BREAK con-huangjm.
CALL FUNCTION 'CPCC_S_TASK_LIST_MAINTAIN'
EXPORTING
application = 'PP01'
bom_usage = '1' " stlan
change_no = ''
key_date = sy-datum
task_list_type = 'N'
task_list_group = ls_input-plnnr
group_counter = ls_input-plnal
material = ls_input-matnr
plant = ls_input-werks
task_maintain_mode = 'M'
TABLES
operations = lt_operations
operations_x = lt_operationsx
component_allocations = lt_comp
component_allocations_x = lt_compx
return = lt_return.
BREAK con-huangjm.
LOOP AT lt_return INTO ls_return WHERE type CA 'AEX' .
lv_type = 'E'.
CONCATENATE lv_msg '|' ls_return-message INTO lv_msg.
ENDLOOP.
IF lv_type NE 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
ENDIF.
LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE matnr = ls_input-matnr
AND werks = ls_input-werks
AND plnal = ls_input-plnal
.
IF lv_type NE 'E'.
<fs_data>-stats = '@08@'.
<fs_data>-msgty = 'S'.
<fs_data>-msg = TEXT-m18.
ELSE.
<fs_data>-stats = '@0A@'.
<fs_data>-msgty = 'E'.
<fs_data>-msg = lv_msg+1.
ENDIF.
ENDLOOP.
CLEAR :ls_operations,ls_operationsx,ls_return,ls_comp,ls_compx,lv_type,lv_msg.
REFRESH :lt_operations,lt_operationsx,lt_return,lt_comp,lt_compx .
ENDAT.
ENDLOOP.
ENDFORM.
工艺路线-BOM组件分配修改
于 2022-03-17 19:07:56 首次发布