目的:通过批导的方式实现物料MRP区域批导
- 前者通过BAPI实现物料数据的修改
- 后者主要是修改物料的MRP区域(MRP area)
BAPI_MATERIAL_SAVEDATA的参数如下:
- HEADDATA是抬头数据
- 其余是行项目数据,其中PLANTDATA是工厂级别的物料数据
MD_MRP_LEVEL_CREATE_DATA导入参数如下
- I_MATNR:物料号
- I_WERK :工厂
- I_MRP_AREA:MRP区域
- I_SELFIELDS:参数复选框结构
- I_MDMA:MRP区域数据结构
- I_DPOP:预测相关数据的结构
- 导出的RETURN是一个工作区结构
我首选使用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.
运行结果如下
可以看见并未实现物料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,该字段是必填字段,但是非必要情况下定义之后不需要赋值,不然会出现如下错误:
注意,成功之后没有返回信息。