我的需求是修改物料的数据,具体需求是改原料和辅料的标准价格。百度之后确定用这个BAPI。
BAPI_MATERIAL_SAVEDATA
价格类型是V的物料,在MM02里,是允许直接修改标准价格的,但是有个前提是不能存在标准成本评估。
这个BAPI的参数的截图,我放在文末了,图1-图3。接下来着重说一下这次使用的过程中遇到的坑。
第一个目标,看能不能实现和在MM03里一致,实现修改一个存在标准成本评估的物料时候,会返回一个和MM02里一样的提示。
第一步处理导入参数中的HEADDATA,结构如图4。
我要修改的是物料主数据的“成本2”里的数据,gs_headdata-matrial里填物料号,没的说,其他参数是干嘛的,不知道就先不填。
第二步处理导入参数中的VALUATIONDATA和VALUATIONDATAX。
VALUATIONDATA里的数据,我是用BAPI_MATERIAL_GET_ALL函数获取的。在这个步骤中,遇到了第一个坑。BAPI_MATERIAL_GET_ALL方法的导入参数里,我填了MATERIAL和PLANT,即物料号和工厂。但执行结果中并没有导出VALUATIONDATA。再去琢磨导入参数,注意到导入参数里有两个VAL开头的参数。其中VAL_AREA,看长文本里的链接,叫评估范围。这个参数指的是什么比较坑。其实,它对应的是工厂。不是什么评估类,也不是评估类别。
看到这个参数的中文翻译,评估范围。我想当然的写了一句gs_headdata-FORECAST_VIEW = ‘X'.,想当然的认为了评估、预测说的应该是一回事儿。这是遇到的第二个坑。最终发现,和成本2页签对应的参数是gs_headdata-COST_VIEW,它的简短描述是成本视图。
BAPI_MATERIAL_GET_ALL的导出参数VALUATIONDATA的结构,和BAPI_MATERIAL_SAVEDATA的导入参数VALUATIONDATA的结构,是不一样的。要注意结构的转换。我是把BAPI_MATERIAL_GET_ALL的导出参数VALUATIONDATA的实参取了个名字叫gs_VALUATIONDATA_from,把BAPI_MATERIAL_SAVEDATA的导入参数VALUATIONDATA的的实参取名叫gs_VALUATIONDATA_to。
用MOVE-CORRESPONDING gs_valuationdata_from TO gs_valuationdata_to.把数据复制过来。
gs_valuationdata_to-std_price = STPRS.
gs_valuationdatax-std_price = 'X'.
指定要改的字段。可不可以不指定gs_valuationdatax-std_price,不可以,不写它不知道更新哪个字段。
回顾一下我都处理了什么。指定了gs_headdata,处理哪个物料,哪个视图;指定了gs_valuationdata_to,视图里各个值都是多少。获得到全部的,修改我想要变更的;指定了gs_valuationdatax,说明我要修改的是哪个值。具体代码如图0-1。
图0-1跑个测试的数据试了一下,提示我“使用数据VALUATIONDATA和复选框结构VALUATIONDATAX的关键字段不同”,去网上看了一下网友们都怎么搞的,发现还要去指定gs_valuationdatax-val_area = werks.。
关于gs_headdata-cost_view = 'X'.的应用。这一条是意外收获。一直顾虑的“存在标准成本评估”的问题。原本想在执行过一次BAPI_MATERIAL_SAVEDATA之后,判断返回值,再去删除标准成本评估,再重新执行BAPI_MATERIAL_SAVEDATA。意见收获是,只要写上gs_headdata-cost_view = 'X'.,不论有没有标准成本评估,都可以更新标准价格。方便,只是不知道会不会有什么后遗问题。出问题再说吧。欢迎不论是之前这么处理过这个问题的,之后参照我这方便处理了这个问题的,凡是遇到过问题的老哥,联系我沟通、分享经验。以下是全部代码。
FUNCTION zcof001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(MATNR) TYPE MATNR
*" VALUE(WERKS) TYPE WERKS_D
*" VALUE(STPRS) TYPE STPRS
*" EXPORTING
*" VALUE(RETURN) TYPE BAPIRET2
*" TABLES
*" RETURNMESSAGES STRUCTURE BAPI_MATRETURN2 OPTIONAL
*"----------------------------------------------------------------------
DATA: gs_clientdata LIKE bapi_mara_ga,
gs_plantdata LIKE bapi_marc_ga,
gs_forecastparameters LIKE bapi_mpop_ga,
gs_planningdata LIKE bapi_mpgd_ga,
gs_storagelocationdata LIKE bapi_mard_ga,
gs_valuationdata_from LIKE bapi_mbew_ga, " 我需要这个表
gs_valuationdata_to LIKE bapi_mbew,
gs_valuationdatax LIKE bapi_mbewx,
gs_headdata LIKE bapimathead.
CALL FUNCTION 'BAPI_MATERIAL_GET_ALL'
EXPORTING
material = matnr
val_area = werks
IMPORTING
valuationdata = gs_valuationdata_from.
MOVE-CORRESPONDING gs_valuationdata_from TO gs_valuationdata_to.
gs_headdata-material = matnr.
gs_headdata-cost_view = 'X'.
gs_valuationdatax-val_area = werks.
gs_valuationdata_to-std_price = stprs.
gs_valuationdatax-std_price = 'X'.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = gs_headdata
valuationdata = gs_valuationdata_to
valuationdatax = gs_valuationdatax
IMPORTING
return = return
TABLES
returnmessages = returnmessages.
ENDFUNCTION.
图1 BAPI_MATERIAL_SAVEDATA 导入参数 图2 BAPI_MATERIAL_SAVEDATA导出参数 图3 BAPI_MATERIAL_SAVEDATA 表参数 图4 导入参数 HEADDATA 的结构