SAP PP工单下达自动更新组件内容

新旧物料替换期,由于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已加进列表,点击保存后即生效

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值