ABAP VA01增强,调整组件数量

时间:2021-07-30
本文章向大家介绍ABAP VA01增强,调整组件数量,主要包括ABAP VA01增强,调整组件数量使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

业务背景介绍:

  VA01创建时,输入成品物料,会自动展开其销售BOM(CS03中BOM用途为5),当下面存在BOM组件有组件报废率时,在销售订单中的数量,需要加上可能报废的数量。

比如组件报废率为5(这里都是百分比的stpox-ausch),则该 销售订单行数量 =  销售订单行数量 + 销售订单行数量 * 0.05。

经过测试,最终写了个隐式增强,打开SE38 -> FV45SFST_STRUKTUR_ANLEGEN_POSI,

这里用的是浮点数算法,另外新建了个接口(接口使用固定点算法)用来计算上面的销售订单行数量。

接口参考:

 代码参考:

  IF vbak-kunnr EQ '0005000000' .
    DATA:wa_topmat TYPE cstmat.
    DATA: lt_stpox  LIKE TABLE OF stpox.
*    GET PARAMETER ID 'BOMPOSNR2' FIELD lv_bomposnr. "该物料在BOM的项目号
    READ TABLE xvbap INTO DATA(ls_xvbap) WITH KEY posnr = vbap-uepos."获取上层物料号
    IF sy-subrc EQ 0 AND ls_xvbap-pstyv EQ 'ZTAQ'.
      READ TABLE xvbep INTO DATA(ls_xvbep) WITH KEY posnr = vbap-uepos."获取上层物料号的数量
      CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' "展开BOM,获取组件报废率
        EXPORTING
          aufsw                 = 'X'
          capid                 = 'PP01' "checkb  "BOM应用
          datuv                 = sy-datum   "有效起始日
          mtnrv                 = ls_xvbap-matnr    "展开物料号
          postp                 = ' '    "项目类别(物料单)
          stlan                 = '5'    "BOM用途(销售BOM)
          stlal                 = '01' "可选的BOM
          werks                 = ls_xvbap-werks    "工厂
          emeng                 = ls_xvbep-wmeng    "数量  gsmng计划订单总数量   bdmng需求量
          mehrs                 = 'X'
        IMPORTING
          topmat                = wa_topmat
*         DSTST                 =
        TABLES
          stb                   = lt_stpox
*         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.

      READ TABLE lt_stpox INTO DATA(ls_stpox) WITH KEY posnr = xstb-posnr
                                                       idnrk = vbap-matnr.
      IF sy-subrc EQ 0.
        IF ls_stpox-ausch NE 0.
*          vbap-kwmeng = ls_stpox-mngko * ls_stpox-ausch.
*          vbap-kwmeng = vbap-kwmeng / '100'.
*          DATA: lv_formula TYPE string.
*          lv_formula = |{ ls_stpox-mngko } * { ls_stpox-ausch } / 100|.
*          CALL FUNCTION 'EVAL_FORMULA'
*            EXPORTING
*              formula          = lv_formula
*            IMPORTING
*              value            = vbap-kwmeng
*            EXCEPTIONS
*              division_by_zero = 1
*              OTHERS           = 11.
*          vbap-kwmeng = ls_stpox-mngko * vbap-kwmeng.
          CALL FUNCTION 'Z_RFC_SD_VA01'
            EXPORTING
              p_mngko  = ls_stpox-mngko
              p_ausch  = ls_stpox-ausch
            IMPORTING
              p_kwmeng = xstb-MNGLG.
          xstb-MNGKO = xstb-MNGLG.
        ENDIF.
      ENDIF.
      CLEAR ls_xvbep.

    ENDIF.
  ENDIF.
View Code

背后延申:

  经过这里

 ,进入该form,最终会进入到出口MV45AFZZ(se38可进),我在

userexit_move_field_to_vbap中试着改过vbap-kwmeng,结果更改后的数量不能再次在va01中手动调整,而且保存之后,数量也会变回未更改的状态,最终选择了上面的隐式增强。隐式增强也是执行到这里时,按F7会跳到一个function,再按F5会跳回到隐式增强处。

原文地址:https://www.cnblogs.com/chaguoguo/p/15078161.html