说一说BAPI_MATERIAL_SAVEDATA的使用过程

我的需求是修改物料的数据,具体需求是改原料和辅料的标准价格。百度之后确定用这个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。

说一说BAPI_MATERIAL_SAVEDATA的使用过程_第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.
说一说BAPI_MATERIAL_SAVEDATA的使用过程_第2张图片 图1 BAPI_MATERIAL_SAVEDATA 导入参数 说一说BAPI_MATERIAL_SAVEDATA的使用过程_第3张图片 图2 BAPI_MATERIAL_SAVEDATA导出参数 说一说BAPI_MATERIAL_SAVEDATA的使用过程_第4张图片 图3 BAPI_MATERIAL_SAVEDATA 表参数 说一说BAPI_MATERIAL_SAVEDATA的使用过程_第5张图片 图4 导入参数 HEADDATA 的结构

 

 

 

 

你可能感兴趣的:(abap,sap)