新旧物料替换期,由于BOM已经更新为了新料号,标准工单创建时就不会带出旧料号。此时旧料还存在库存未消耗完成,用户又懒不想手工调整工单组件,所以有了这个需求,即工单下达时自动替换/更改/新增工单组件。
注:触发该增强执行后不要改动工单数量,因为数量变更会导致系统刷新组件用量,这样会导致替代料组件的用量异常。
debug发现
1.CO01/CO02屏幕按钮是由函数FUNCTION_PROCESSING处理
2.下达事件码为FREI,代码路径为COFORM00-release_order,确定下达后CAUFVD-FLG_FREI会标记为abap_true
3.组件数据值表为(SAPLCOBC)RESB_BT[]
4.组件界面table control受表ITAB值影响,ITAB在函数CO_IT_OBJ_ITAB_CREATE完成数据采集,ITAB值表为(SAPLCOIT)ITAB[]
5.工单数量变更时,组件需求量计算位置为屏幕115–pai–header_update–(LCOKO1F1P)comp_quantity_update。
测试用例
FUNCTION zppenhanc001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(CAUFVD_IMP) TYPE CAUFVD OPTIONAL
*"----------------------------------------------------------------------
********增强位置COFORM00--RELEASE_ORDER--3979行CO_COM_RELEASE_ORDER之后********
TYPES BEGIN OF ty_resb.
INCLUDE STRUCTURE resbb.
TYPES:
indold LIKE sy-tabix,
no_req_upd LIKE sy-datar.
TYPES END OF ty_resb.
TYPES tty_resb TYPE TABLE OF ty_resb.
TYPES tty_itab TYPE TABLE OF sfc_itab.
TYPES: BEGIN OF ty_jsto_buf . "Statusobjekte
INCLUDE STRUCTURE jsto_upd.
TYPES: mod,
wf_collected.
TYPES: END OF ty_jsto_buf.
TYPES tty_jsto_buf TYPE TABLE OF ty_jsto_buf.
FIELD-SYMBOLS:<fs_itab> TYPE tty_itab,
<fs_resb> TYPE tty_resb,
<fs_jsto> TYPE tty_jsto_buf.
DATA:ls_itab TYPE sfc_itab,
ls_resb_add TYPE ty_resb,
lt_resb_add TYPE tty_resb.
CONSTANTS:cv_itab_source TYPE string VALUE '(SAPLCOIT)ITAB[]',
cv_resb_source TYPE string VALUE '(SAPLCOBC)RESB_BT[]',
cv_jsto_source TYPE string VALUE '(SAPLBSVA)JSTO_BUF[]'.
DATA:lv_current_rspos TYPE resb-rspos.
DATA:cl_ecnmaterial TYPE REF TO zcl_ecnmaterial,
lt_matdata TYPE zcl_ecnmaterial=>tty_newmat,
lt_relation TYPE zcl_ecnmaterial=>tty_relation,
lt_statistics TYPE zcl_ecnmaterial=>tty_statistics.
DATA:lv_objnr_index TYPE n LENGTH 10,
lv_objnr TYPE resb-objnr,
lv_resb_exc TYPE p LENGTH 12 DECIMALS 0,
lv_stock_exc TYPE p LENGTH 12 DECIMALS 0,
lv_subtract_qty TYPE menge_d.
STATICS sv_running_mark TYPE abap_bool.
CHECK caufvd_imp-flg_frei EQ abap_true AND sv_running_mark EQ abap_false.
CLEAR:lt_resb_add.
sv_running_mark = abap_true.
CREATE OBJECT cl_ecnmaterial.
ASSIGN (cv_itab_source) TO <fs_itab>.
ASSIGN (cv_resb_source) TO <fs_resb>.
ASSIGN (cv_jsto_source) TO <fs_jsto>.
SELECT DISTINCT
werks,
matnr,
baugr
FROM @<fs_resb> AS it1
WHERE dumps = ''
AND xloek = ''
INTO CORRESPONDING FIELDS OF TABLE @lt_matdata.
IF sy-subrc = 0.
cl_ecnmaterial->relation( EXPORTING t_matdata = lt_matdata IMPORTING et_relation = lt_relation ).
cl_ecnmaterial->statistics( ).
ENDIF.
CHECK lt_relation IS NOT INITIAL.
SELECT MAX( rspos )
FROM @<fs_resb> AS it1
INTO @lv_current_rspos.
SELECT MAX( objnr )
FROM @<fs_resb> AS it1
WHERE vbkz = 'I'
INTO @lv_objnr.
IF sy-subrc = 0.
lv_objnr_index = lv_objnr+2(10).
ENDIF.
SELECT aufst,
aufwg,
baust,
bauwg,
CAST( MAX( posnr ) AS NUMC ) AS posnr
FROM @<fs_resb> AS it1
GROUP BY aufst,
aufwg,
baust,
bauwg
INTO TABLE @DATA(lt_level).
LOOP AT <fs_resb> ASSIGNING FIELD-SYMBOL(<fs_resb_line>).
READ TABLE lt_relation INTO DATA(ls_relation) WITH KEY werks = <fs_resb_line>-werks matnr = <fs_resb_line>-matnr baugr = <fs_resb_line>-baugr.
IF sy-subrc = 0.
READ TABLE <fs_itab> ASSIGNING FIELD-SYMBOL(<fs_itab_line>) WITH KEY rspos = <fs_resb_line>-rspos.
LOOP AT ls_relation-relation INTO DATA(ls_relation_line).
READ TABLE cl_ecnmaterial->t_statistics ASSIGNING FIELD-SYMBOL(<fs_statistics>) WITH KEY werks = ls_relation_line-werks matnr = ls_relation_line-bismt.
IF sy-subrc = 0 AND <fs_statistics>-syqty > 0.
lv_stock_exc = <fs_statistics>-syqty DIV ls_relation_line-olderfmg.
lv_resb_exc = <fs_resb_line>-bdmng DIV ls_relation_line-newerfmg.
IF lv_stock_exc EQ 0 OR lv_resb_exc EQ 0.
CONTINUE.
ENDIF.
IF lv_stock_exc >= lv_resb_exc AND ( lv_resb_exc * ls_relation_line-newerfmg = <fs_resb_line>-bdmng ).
<fs_resb_line>-matnr = ls_relation_line-bismt.
<fs_resb_line>-vbkz = 'U'.
<fs_resb_line>-bdmng = lv_resb_exc * ls_relation_line-olderfmg.
<fs_resb_line>-erfmg = lv_resb_exc * ls_relation_line-olderfmg.
<fs_resb_line>-flmng = lv_resb_exc * ls_relation_line-olderfmg.
<fs_resb_line>-meins = <fs_statistics>-meins.
<fs_resb_line>-erfme = <fs_statistics>-meins.
<fs_resb_line>-esmng = <fs_resb_line>-esmng * ls_relation_line-olderfmg / ls_relation_line-newerfmg.
<fs_itab_line>-matnr = <fs_resb_line>-matnr.
SUBTRACT <fs_resb_line>-bdmng FROM <fs_statistics>-syqty.
EXIT.
ELSE.
CLEAR:ls_itab,ls_resb_add.
ADD 1 TO lv_current_rspos.
MOVE-CORRESPONDING <fs_resb_line> TO ls_resb_add.
READ TABLE lt_level ASSIGNING FIELD-SYMBOL(<fs_level>) WITH KEY aufst = ls_resb_add-aufst
aufwg = ls_resb_add-aufwg
baust = ls_resb_add-baust
bauwg = ls_resb_add-bauwg.
ADD 10 TO <fs_level>-posnr.
ls_resb_add-rspos = lv_current_rspos.
ls_resb_add-matnr = ls_relation_line-bismt.
ls_resb_add-posnr = <fs_level>-posnr.
IF lv_stock_exc >= lv_resb_exc.
ls_resb_add-bdmng = lv_resb_exc * ls_relation_line-olderfmg.
lv_subtract_qty = lv_resb_exc * ls_relation_line-newerfmg.
ELSE.
ls_resb_add-bdmng = lv_stock_exc * ls_relation_line-olderfmg.
lv_subtract_qty = lv_stock_exc * ls_relation_line-newerfmg.
ENDIF.
ls_resb_add-erfmg = ls_resb_add-bdmng.
ls_resb_add-flmng = ls_resb_add-bdmng.
ls_resb_add-esmng = ls_resb_add-esmng * ls_relation_line-olderfmg / ls_relation_line-newerfmg.
ADD 1 TO lv_objnr_index.
ls_resb_add-objnr = |TM{ lv_objnr_index }OK|."lv_current_rspos.
ls_resb_add-indold = ls_resb_add-rspos.
ls_resb_add-vbkz = 'I'.
ls_resb_add-meins = <fs_statistics>-meins.
ls_resb_add-erfme = <fs_statistics>-meins.
***组件屏幕显示及维护操作生效
MOVE-CORRESPONDING <fs_itab_line> TO ls_itab.
ls_itab-rspos = ls_resb_add-rspos.
ls_itab-matnr = ls_resb_add-matnr.
ls_itab-index_plmz = ls_itab-rspos.
ls_itab-objnr = ls_resb_add-objnr."ls_itab-rspos.
ls_itab-xposn = ls_resb_add-posnr.
ls_itab-posnr = ls_resb_add-posnr.
***工单更改数量自动计算组件需求数量
APPEND INITIAL LINE TO <fs_jsto> ASSIGNING FIELD-SYMBOL(<fs_jsto_line>).
<fs_jsto_line>-mandt = sy-mandt.
<fs_jsto_line>-objnr = ls_itab-objnr.
<fs_jsto_line>-obtyp = 'OKP'.
<fs_jsto_line>-chgkz = 'X'.
<fs_jsto_line>-mod = 'I'.
SUBTRACT lv_subtract_qty FROM <fs_resb_line>-bdmng.
SUBTRACT lv_subtract_qty FROM <fs_resb_line>-erfmg.
SUBTRACT lv_subtract_qty FROM <fs_resb_line>-flmng.
<fs_statistics>-syqty = 0.
APPEND ls_resb_add TO lt_resb_add.
APPEND ls_itab TO <fs_itab>.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
CLEAR:ls_relation,ls_itab.
ENDLOOP.
APPEND LINES OF lt_resb_add TO <fs_resb>.
**必须排序,否则CO_IT_ITAB_MAT_READ_WITH_INDEX读取数据会异常
SORT <fs_itab>.
ENDFUNCTION.
结果展示
下达前
点击下达
以上可见新增组件3206010273已加进列表,点击保存后即生效