通过MD_MRP_LEVEL_CREATE_DATA实现物料MRP区域批导

目的:通过批导的方式实现物料MRP区域批导

  • 前者通过BAPI实现物料数据的修改
  • 后者主要是修改物料的MRP区域(MRP area)

BAPI_MATERIAL_SAVEDATA的参数如下:

  • HEADDATA是抬头数据
  • 其余是行项目数据,其中PLANTDATA是工厂级别的物料数据

image-20220816135522526

MD_MRP_LEVEL_CREATE_DATA导入参数如下

  • I_MATNR:物料号
  • I_WERK :工厂
  • I_MRP_AREA:MRP区域
  • I_SELFIELDS:参数复选框结构
  • I_MDMA:MRP区域数据结构
  • I_DPOP:预测相关数据的结构
  • 导出的RETURN是一个工作区结构

image-20220816135340612

我首选使用BAPI_MATERIAL_SAVEDATA 实现,结果发现根本没有MRP区域这一字段

数据定义

DATA:LS_HEADER     TYPE BAPIMATHEAD,
       LT_RETURN2    TYPE TABLE OF BAPI_MATRETURN2,
       LS_RETURN2    TYPE BAPI_MATRETURN2,
       LT_RETURN     TYPE TABLE OF BAPIRET2,
       LS_RETURN     TYPE BAPIRET2,
       LS_PLANTDATA  TYPE BAPI_MARC,
       LT_PLANTDATA  TYPE TABLE OF BAPI_MARC,
       LS_PLANTDATAX TYPE BAPI_MARCX,
       LT_PLANTDATAX TYPE TABLE OF BAPI_MARCX.
DATA:LV_MSG TYPE STRING.

具体实现

REFRESH LT_RETURN2.
    LV_MSG = ''.
    LS_HEADER-MATERIAL = GS_OUT-I_MATNR. "物料号
    LS_HEADER-MRP_VIEW = 'X'. "物料需求计划(MRP)视图
*    LS_HEADER-MATERIAL = |{ LS_HEADER-MATERIAL ALPHA = IN }|. "使用ALPHA加前导零的话会变成40位的
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'   "使用这个Function可以将物料加前导零变成18位
      EXPORTING
        INPUT  = LS_HEADER-MATERIAL
      IMPORTING
        OUTPUT = LS_HEADER-MATERIAL.

    LS_PLANTDATA-PLANT = GS_OUT-I_WERK. "工厂
    LS_PLANTDATA-MRP_TYPE = GS_OUT-DISMM. "MRP类型
    LS_PLANTDATA-MRP_CTRLER = GS_OUT-DISPO. "MRP控制员
    LS_PLANTDATA-LOTSIZEKEY = GS_OUT-DISLS. "物料计划内批量程序
    "注意LS_PLANTDATAX-PLANT的值不是'X'!!!!
    LS_PLANTDATAX-PLANT = GS_OUT-I_WERK.
    LS_PLANTDATAX-MRP_TYPE = 'X'.
    LS_PLANTDATAX-MRP_CTRLER = 'X'.
    LS_PLANTDATAX-LOTSIZEKEY = 'X'.
    APPEND LS_PLANTDATA TO LT_PLANTDATA.
    APPEND LS_PLANTDATAX TO LT_PLANTDATAX.

    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        HEADDATA       = LS_HEADER
        PLANTDATA      = LS_PLANTDATA
        PLANTDATAX     = LS_PLANTDATAX
      IMPORTING
        RETURN         = LS_RETURN
      TABLES
        RETURNMESSAGES = LT_RETURN2.
    CLEAR :LS_PLANTDATA,LS_PLANTDATAX,LS_HEADER.
    READ TABLE LT_RETURN2  TRANSPORTING NO FIELDS WITH KEY TYPE = 'E'.
    IF SY-SUBRC = 0.
      "BAPI失败回滚
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      "成功就提交并更新ALV
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
    ENDIF.

运行结果如下

image-20220816141539418

可以看见并未实现物料MRP区域的改变,应该就是没有传入MRP区域字段的原因吧

我在SAP社区看到了可以使用MD_MRP_LEVEL_CREATE_DATA可以对MRP区域进行修改

这个BAPI里可以看见有MRP区域字段,也就是 I_MRP_AREA

数据定义

DATA: LV_MATNR     TYPE MDMA-MATNR,
        LV_WERK      TYPE MDMA-WERKS,
        LV_MRPAREA   TYPE MDMA-BERID,
        LS_SELFIELDS TYPE SDIBE_MASSFIELDS,
        LS_MDMA      TYPE MDMA,
        LS_DPOP      TYPE DPOP,
        LS_RETURN    TYPE BAPIRETURN1.

具体实现

    LV_MATNR = GS_OUT-I_MATNR.
    LV_WERK = GS_OUT-I_WERK.
    LV_MRPAREA = GS_OUT-I_MRP_AREA.
    LS_SELFIELDS-XDISLS = 'X'.
    LS_SELFIELDS-XDISMM = 'X'.
    LS_SELFIELDS-XDISPO = 'X'.
    LS_MDMA-DISLS = GS_OUT-DISLS.
    LS_MDMA-DISMM = GS_OUT-DISMM.
    LS_MDMA-DISPO = GS_OUT-DISPO.
    LS_MDMA-BERID = LV_MRPAREA.
    LS_MDMA-MATNR = LV_MATNR.
*    LS_DPOP-BERID = LV_MRPAREA.
*    LS_DPOP-MATNR = LV_MATNR.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        INPUT  = LV_MATNR
      IMPORTING
        OUTPUT = LV_MATNR.
    CALL FUNCTION 'MD_MRP_LEVEL_CREATE_DATA'
      EXPORTING
        I_MATNR           = LV_MATNR
        I_WERK            = LV_WERK
        I_MRP_AREA        = LV_MRPAREA
        I_SELFIELDS       = LS_SELFIELDS
        I_MDMA            = LS_MDMA
        I_DPOP            = LS_DPOP
        I_QUEUE_FLAG      = 'X'
        I_SAVE_FLAG       = 'X'
        I_EXTERNAL_COMMIT = ' '
      IMPORTING
        E_ERROR_RETURN    = LS_RETURN.
    CLEAR: LV_MATNR, LV_WERK,LV_MRPAREA,LS_SELFIELDS,LS_MDMA,LS_DPOP.
    IF LS_RETURN-TYPE = 'E'.
      "BAPI失败回滚
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      "成功就提交并更新ALV
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
    ENDIF.

有坑!!!

注意预测数据字段I_DPOP,该字段是必填字段,但是非必要情况下定义之后不需要赋值,不然会出现如下错误:
在这里插入图片描述

注意,成功之后没有返回信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值