MM BAPI BAPI_MATERIAL_SAVEDATA 创建或更新物料主数据的毛重 体积 等数据问题

该代码示例展示了如何使用SAP的BAPI_MATERIAL_SAVEDATA函数来更新物料的毛重、体积和体积单位。关键点在于确保ALT_UNIT和ALT_UNIT_ISO与BASE_UOM一致。程序包括数据准备、函数调用、事务处理以及错误处理,同时处理物料类型更新的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

毛重和 业务量 体积单位在 BAPI_MARM BAPI_MARMX里面 

 

 更新时注意 :ALT_UNIT 和     ALT_UNIT_ISO  要和 head里面的BASE_UOM 保持一致 

 

 链接参考:How to update VOlume and Volume Unit through BAPI_MATERIAL_SAVEDATA ? | SAP Community

FUNCTION ZMATNR_PLM2SAP.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      MATERIAL STRUCTURE  ZMAT
*"      OUTPUT_MESSAGE STRUCTURE  ZMAT_MESSAGE
*"----------------------------------------------------------------------
  "定义数据
  TABLES:mara,marc,ZLOGOFMATNRORBOM.
  data: temp_mat type matnr,            "物料
        temp_werks type werks_d,        "工厂
        temp_mtart type mtart,          "物料类型
        temp_subrc like SYST-SUBRC,     "物料类型修改成功与否
        HEADDATA  LIKE  BAPIMATHEAD,   "带有控制信息的表头段
        CLIENTDATA  LIKE  BAPI_MARA,   "客户端物料数据
        CLIENTDATAX LIKE  BAPI_MARAX,  "客户端物料数据的更新信息
        return2 type bapiret2,         "返回信息
        MESSAGETAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE,      "返回物料类型的消息
        RETURNS LIKE BAPI_MATRETURN2 OCCURS 0 WITH HEADER LINE.    "返回消息
  data:  BEGIN OF zlog,
    MATNR TYPE MATNR,
    WERKS TYPE WERKS_D,
    INTERFACENAME(60) TYPE C,
    LOGDATE TYPE DATUM,
    LOGTIME TYPE UZEIT,
    maktx type maktx,
    MEINS type MEINS,
    MBRSH type MBRSH,
    lvorm type lvorm,
    mtart type mtart,
    SPART type SPART,
    MATKL type MATKL,
    BISMT type BISMT,
    LGFSB type LGFSB,
    EORIGINNO(40) type c,
    CREATER(20) type c,
    MESSAGETYPE(1) TYPE C,
    MESSAGE(220) TYPE C,
    END OF ZLOG.

  data: matdescription like table of BAPI_MAKT WITH HEADER LINE.    "物料描述
  data:ltWV like TABLE OF BAPI_MARM WITH HEADER LINE.   " 度量单位 毛重 体积
  data:ltWVX like TABLE OF BAPI_MARMX WITH HEADER LINE.  "度量单位 毛重 体积
  data: BEGIN OF newmat_record,
        MATNR like mara-matnr,
        werks type werks_d,
        MAKTX like makt-maktx,
        MEINS like mara-meins,
        MBRSH like mara-MBRSH,
        lvorm like mara-lvorm,
        mtart like mara-mtart,
        SPART like mara-spart,
        MATKL like mara-matkl,
        BISMT type BISMT,
        LGFSB TYPE LGFSB,
        EORIGINNO(40) type c,
        creater(20) type c,
        ISUPDATE(1) type C,
        CREATEDATE type D,
        CREATETIME type T,
        UPDATEDATE type D,
        UPDATETIME type T,
     END OF newmat_record.

  LOOP at MATERIAL.
    CLEAR ltwv[].clear ltwvx[].
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input  = MATERIAL-matnr
      IMPORTING
        output = MATERIAL-matnr.

    TRANSLATE MATERIAL-matnr TO UPPER CASE.

    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        input  = MATERIAL-MEINS
      IMPORTING
        output = MATERIAL-MEINS.

    "判断必须的输入字段是否有数据
    if ( material-matnr is INITIAL ) or ( material-werks is INITIAL ).
      clear output_message.
      output_message-matnr = material-matnr.
      output_message-werks = material-werks.
      output_message-messagetype = 'E'.
      output_message-message = '物料和工厂为必填字段,请补充必填字段!'.
      append output_message.
      CONTINUE.
    endif.

    clear temp_mat.
    clear temp_mtart.
    CLEAR RETURNS.
    CLEAR RETURNS[].
    select SINGLE matnr mtart into (temp_mat,temp_mtart) from mara where matnr = material-matnr.
    if temp_mat is not initial.
*1.  更新物料
*1.1 准备输入数据

      "头数据:事实上这个数据创建后就修改不了了
      clear headdata.
      headdata-MATERIAL = material-matnr.     "物料(必填,且不可修改)
      headdata-IND_SECTOR = material-mbrsh.   "行业领域(必填,且不可修改)
      headdata-matl_type = material-mtart.    "物料类型(也必填,在这里直接修改不了,需调用创建的函数处理)
      headdata-BASIC_VIEW  = 'X'.

      "基本数据
      clear clientdata.
      clear clientdatax.

      CLIENTDATA-BASE_UOM = material-meins.
      CLIENTDATAX-BASE_UOM = 'X'.

      CLIENTDATA-DEL_FLAG = material-lvorm.
      CLIENTDATAX-DEL_FLAG = 'X'.

      CLIENTDATA-DIVISION = material-SPART.
      CLIENTDATAX-DIVISION = 'X'.

      CLIENTDATA-OLD_MAT_NO = material-BISMT.
      CLIENTDATAX-OLD_MAT_NO = 'X'.

*      由于存在物料组字段含义变更的问题,更新后会影响历史数据统计的准确性,此字段不更新到sap,新物料如果个别需更新,可以通知黄海燕更新
      CLIENTDATA-MATL_GROUP = material-MATKL.
      CLIENTDATAX-MATL_GROUP = 'X'.


      ltWv-alt_unit = material-meins.
      ltWvX-alt_unit = material-meins.

      ltWv-ALT_UNIT_ISO = material-meins.
      ltWvX-ALT_UNIT_ISO = material-meins.

      ltWv-VOLUME = material-VOLUM."体积
      ltWvX-VOLUME = 'X'.

      ltWv-VOLUMEUNIT = material-VOLEH."体积
      ltWvX-VOLUMEUNIT = 'X'.

      ltWv-GROSS_WT = material-BRGEW. "毛重
      ltWvX-GROSS_WT = 'X'.

*      ltWv-NET_WEIGHT = material-NTGEW."净重
*      ltWvx-net_weight = 'X'.

      ltWv-UNIT_OF_WT = material-GEWEI.
      ltWvX-UNIT_OF_WT = 'X'.


      APPEND ltWv.
      APPEND ltWvX.

      CLIENTDATA-net_weight = material-NTGEW."净重
      CLIENTDATAX-net_weight = 'X'.

      CLIENTDATA-UNIT_OF_WT = material-gewei."毛重
      CLIENTDATAX-UNIT_OF_WT = 'X'.

      "物料描述
      CLEAR matdescription.
      CLEAR matdescription[].
      matdescription-LANGU_ISO = 'ZH'.
      matdescription-MATL_DESC = material-maktx.
*      concatenate material-maktx material-EORIGINNO into matdescription-MATL_DESC.
      APPEND matdescription.

*1.2 执行更新物料
      CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
        EXPORTING
          headdata            = headdata
          clientdata          = clientdata
          clientdatax         = clientdatax
        IMPORTING
          return              = return2
        TABLES
          materialdescription = matdescription[]
            UNITSOFMEASURE = ltwv[]
          UNITSOFMEASUREX = ltwvX[]
          RETURNMESSAGES      = RETURNS.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      if material-lvorm <> 'X'.
        UPDATE MARA SET lvorm = '' where matnr = material-matnr.
        UPDATE MARC SET lvorm = '' where matnr = material-matnr.
        COMMIT WORK and wait.
      ENDIF.

      "单独处理更新物料类型
      if material-mtart <> temp_mtart.
        CALL FUNCTION 'ZBAPI_CHANGEMTART'
          EXPORTING
            CTU       = 'X'
            MODE      = 'N'
            UPDATE    = 'L'
            NODATA    = '/'
            MATNR_001 = material-matnr
            NMTAR_002 = material-mtart
          IMPORTING
            SUBRC     = temp_subrc
          TABLES
            MESSTAB   = MESSAGETAB.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
      endif.

*1.3 输出消息处理
      clear output_message.
      output_message-matnr = material-matnr.

      UPDATE mara SET zysj = material-zysj ZJKZYJ = material-ZJKZYJ
        WHERE matnr =  MATERIAL-matnr.

      CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
        EXPORTING
          input  = output_message-matnr
        IMPORTING
          output = output_message-matnr.

      output_message-werks = material-werks.
      output_message-messagetype = return2-type.
      output_message-message = return2-message.
      IF return2-type = 'S' .

        LOOP AT RETURNS.
          IF RETURNS-TYPE = 'E' or RETURNS-TYPE = 'A'.
            output_message-messagetype = RETURNS-type.
            output_message-message = RETURNS-message.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.
      if temp_subrc <> 0.
        if output_message-messagetype = 'S'.
          output_message-messagetype = 'E'.
          output_message-message = '物料类型更新不成功!'.
        else.
          output_message-messagetype = 'E'.
          CONCATENATE output_message-message  ',且物料类型更新不成功!' INTO output_message-message.
        endif.
      endif.

      append output_message.

* 1.4 记录传入的数据及处理结果
      ZLOG-matnr = output_message-matnr.
      ZLOG-werks = output_message-werks.
      ZLOG-messagetype = output_message-messagetype.
      ZLOG-message = output_message-message.
      ZLOG-logdate = sy-DATUM.
      ZLOG-logtime = sy-UZEIT.
      ZLOG-interfacename = 'ZMATNR_PLM2SAP'.
      ZLOG-maktx = material-maktx.
      ZLOG-MEINS = material-MEINS.
      ZLOG-MBRSH = material-MBRSH.
      ZLOG-lvorm = material-lvorm.
      ZLOG-mtart = material-mtart.
      ZLOG-SPART = material-SPART.
      ZLOG-MATKL = material-MATKL.
      ZLOG-BISMT = material-BISMT.
      ZLOG-LGFSB = material-LGFSB.
      ZLOG-EORIGINNO = material-EORIGINNO.
      ZLOG-CREATER = material-CREATER.

      insert into ZLOGOFMATNRORBOM  values ZLOG.
      commit work and wait.
      CLEAR ZLOG.

*1.5 对新添加的工厂数据进行更新,便于维护专员添加新的工厂视图
      IF output_message-messagetype = 'S'.

        clear temp_werks.
        select SINGLE werks into temp_werks from marc where matnr = material-matnr and werks = material-werks.
        if temp_werks is initial.
          clear newmat_record.
          newmat_record-matnr = material-matnr.
          newmat_record-werks = material-werks.
          newmat_record-maktx = material-maktx.
          newmat_record-MEINS  = material-MEINS.
          newmat_record-MBRSH  = material-MBRSH.
          newmat_record-lvorm  = material-lvorm.
          newmat_record-MTART  = material-MTART.
          newmat_record-SPART  = material-SPART.
          newmat_record-MATKL  = material-MATKL.
          newmat_record-BISMT = material-BISMT.
          newmat_record-lgfsb = material-lgfsb.
          newmat_record-EORIGINNO = material-EORIGINNO.
          newmat_record-creater = material-creater.
          newmat_record-isupdate = '0'.
          newmat_record-createdate = SY-DATUM.
          newmat_record-createtime = SY-UZEIT.

          insert into zmat_synchronize  values newmat_record.
          commit work and wait.
        endif.

      ENDIF.
      "修改物料日期和修改时间及其他工厂数据字段更新到新物料同步表
      update zmat_synchronize set updatedate = SY-DATUM updatetime = SY-UZEIT lgfsb = material-lgfsb where matnr = material-matnr and werks = material-werks.
      commit work and wait.

    else.
*2.  新建物料

      "判断必须的输入字段是否都有数据:物料、物料描述、单位、行业领域、物料类型、部门、物料组;
      "工厂和采购库位不必填,但是还是要提供给物料维护专员生成其他视图数据
      if ( material-matnr is INITIAL ) or ( material-maktx is INITIAL ) or ( material-meins is INITIAL )
        or ( material-mbrsh is INITIAL ) or ( material-mtart is INITIAL ) or ( material-SPART is INITIAL ) or ( material-MATKL is INITIAL ).

        clear output_message.
        output_message-matnr = material-matnr.
        output_message-werks = material-werks.
        output_message-messagetype = 'E'.
        output_message-message = '新建物料所需的数据不全,请补充必填字段!'.
        append output_message.

        CONTINUE.
      endif.

*2.1 准备输入数据

      "头数据
      clear headdata.
      headdata-MATERIAL = material-matnr.     "物料(必填,且不可修改)
      headdata-IND_SECTOR = material-mbrsh.   "行业领域(必填,且不可修改)
      headdata-matl_type = material-mtart.    "物料类型(也必填,且不可修改)

      headdata-BASIC_VIEW  = 'X'.

      "基本数据
      clear clientdata.
      if material-lvorm is not INITIAL.
        CLIENTDATA-DEL_FLAG = material-lvorm.
      else.
        CLIENTDATA-DEL_FLAG =''.
      endif.
      CLIENTDATA-MATL_GROUP = material-MATKL.
      CLIENTDATA-BASE_UOM = material-meins.
      CLIENTDATA-DIVISION = material-SPART.
      CLIENTDATA-OLD_MAT_NO = material-BISMT.
      "基本数据的更新项
      clear clientdatax.
      if material-lvorm is not INITIAL.
        CLIENTDATAX-DEL_FLAG = 'X'.
      else.
        CLIENTDATAX-DEL_FLAG =''.
      endif.
      CLIENTDATAX-MATL_GROUP = 'X'.
      CLIENTDATAX-BASE_UOM = 'X'.
      CLIENTDATAX-DIVISION = 'X'.
      CLIENTDATAX-OLD_MAT_NO = 'X'.

      ltWv-alt_unit = material-meins.
      ltWvX-alt_unit = material-meins.

      ltWv-ALT_UNIT_ISO = material-meins.
      ltWvX-ALT_UNIT_ISO = material-meins.

      ltWv-VOLUME = material-VOLUM."体积
      ltWvX-VOLUME = 'X'.

      ltWv-VOLUMEUNIT = material-VOLEH."体积
      ltWvX-VOLUMEUNIT = 'X'.

      ltWv-GROSS_WT = material-BRGEW. "毛重
      ltWvX-GROSS_WT = 'X'.

*      ltWv-NET_WEIGHT = material-NTGEW."净重
*      ltWvx-net_weight = 'X'.

      ltWv-UNIT_OF_WT = material-GEWEI.
      ltWvX-UNIT_OF_WT = 'X'.


      APPEND ltWv.
      APPEND ltWvX.

      CLIENTDATA-net_weight = material-NTGEW."净重
      CLIENTDATAX-net_weight = 'X'.

      CLIENTDATA-UNIT_OF_WT = material-gewei."毛重
      CLIENTDATAX-UNIT_OF_WT = 'X'.

      "物料描述
      CLEAR matdescription.
      CLEAR matdescription[].
      matdescription-LANGU_ISO = 'ZH'.
      matdescription-MATL_DESC = material-maktx .
*      concatenate material-maktx material-EORIGINNO into matdescription-MATL_DESC.
      APPEND matdescription.


*2.2 执行新建物料
      CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
        EXPORTING
          headdata            = headdata
          clientdata          = clientdata
          clientdatax         = clientdatax
        IMPORTING
          return              = return2
        TABLES
          materialdescription = matdescription[]
          UNITSOFMEASURE = ltwv[]
          UNITSOFMEASUREX = ltwvX[]
          RETURNMESSAGES      = RETURNS.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      UPDATE mara SET zysj = material-zysj ZJKZYJ = material-ZJKZYJ
      WHERE matnr =  MATERIAL-matnr.

*2.3 输出消息处理
      clear output_message.
      output_message-matnr = material-matnr.

      CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
        EXPORTING
          input  = output_message-matnr
        IMPORTING
          output = output_message-matnr.

      output_message-werks = material-werks.
      output_message-messagetype = return2-type.
      output_message-message = return2-message.

      IF return2-type = 'S'.
        LOOP AT RETURNS.
          IF RETURNS-TYPE = 'E' or RETURNS-TYPE = 'A'.
            output_message-messagetype = RETURNS-type.
            output_message-message = RETURNS-message.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.

      append output_message.

* 2.4 记录传入的数据及处理结果
      ZLOG-matnr = output_message-matnr.
      ZLOG-werks = output_message-werks.
      ZLOG-messagetype = output_message-messagetype.
      ZLOG-message = output_message-message.
      ZLOG-logdate = sy-DATUM.
      ZLOG-logtime = sy-UZEIT.
      ZLOG-interfacename = 'ZMATNR_PLM2SAP'.
      ZLOG-maktx = material-maktx.
      ZLOG-MEINS = material-MEINS.
      ZLOG-MBRSH = material-MBRSH.
      ZLOG-lvorm = material-lvorm.
      ZLOG-mtart = material-mtart.
      ZLOG-SPART = material-SPART.
      ZLOG-MATKL = material-MATKL.
      ZLOG-BISMT = material-BISMT.
      ZLOG-LGFSB = material-LGFSB.
      ZLOG-EORIGINNO = material-EORIGINNO.
      ZLOG-CREATER = material-CREATER.

      insert into ZLOGOFMATNRORBOM  values ZLOG.
      commit work and wait.
      CLEAR ZLOG.

*2.5 对新建的物料进行记录,便于维护专员更新各视图数据
      IF output_message-messagetype = 'S'.
        clear newmat_record.
        newmat_record-matnr = material-matnr.
        newmat_record-werks = material-werks.
        newmat_record-maktx = material-maktx.
        newmat_record-MEINS  = material-MEINS.
        newmat_record-MBRSH  = material-MBRSH.
        newmat_record-lvorm  = material-lvorm.
        newmat_record-MTART  = material-MTART.
        newmat_record-SPART  = material-SPART.
        newmat_record-MATKL  = material-MATKL.
        newmat_record-BISMT = material-BISMT.
        newmat_record-lgfsb = material-lgfsb.
        newmat_record-EORIGINNO = material-EORIGINNO.
        newmat_record-creater = material-creater.
        newmat_record-isupdate = '0'.
        newmat_record-createdate = SY-DATUM.
        newmat_record-createtime = SY-UZEIT.

        insert into zmat_synchronize  values newmat_record.
        commit work and wait.
      ENDIF.
    endif.

  ENDLOOP.

ENDFUNCTION.

### 使用 BAPI_MATERIAL_SAVEDATA 自动获取物料编码 在 SAP 中,`BAPI_MATERIAL_SAVEDATA` 是用于创建物料主数据的标准 BAPI 函数模块。通过该函数模块可以实现物料的自动化创建,并返回新创建物料编号。 以下是详细的说明以及代码示例: #### 参数传递与功能描述 当调用 `BAPI_MATERIAL_SAVEDATA` 时,需要提供必要的输入参数来定义物料属性。这些参数通常存储在一个内部表中(如 `it_y_material`),并通过程序逻辑填充[^1]。一旦成功执行此函数模块,SAP 将自动生成一个新的物料编号并将其作为输出参数的一部分返回给调用者。 需要注意的是,在某些情况下可能会遇到扩展字段未清除的问题(例如 `CT_EXTENSIONIN` 和 `CT_EXTENSIONINX`)。这可能导致错误意外行为,因此建议在每次使用前清理这些结构体中的旧值[^2]。 #### ABAP 实现示例 下面是一个简单的ABAP代码片段展示如何利用上述提到的功能完成整个过程: ```abap DATA: lv_matnr TYPE MATNR, lt_return TYPE STANDARD TABLE OF BAPIRET2. CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' EXPORTING materialheader = gs_material_header plantdata = gt_plant_data purchasingdata = gt_purchasing_data IMPORTING materialnumber = lv_matnr TABLES return = lt_return. IF sy-subrc EQ 0. WRITE:/ 'Material created successfully with number:', lv_matnr. ELSE. LOOP AT lt_return INTO DATA(ls_return). IF ls_return-type CA 'E'. WRITE:/ 'Error occurred during creation of the material:' ,ls_return-message. ENDIF. ENDLOOP. ENDIF. ``` 在此段代码里: - 我们先声明了一个变量 `lv_matnr` 来接收生成后的物料号。 - 调用了 `BAPI_MATERIAL_SAVEDATA` 并传入了几个关键的数据集 (比如头部信息, 工厂特定的信息等等)。 - 如果操作无误 (`sy-subrc=0`) 则打印出成功的消息连同新的物料号码;反之则遍历所有的返回记录寻找可能存在的任何类型的错误提示。 #### 注意事项 为了确保流程顺利运行,请务必确认所有必需的输入参数都已正确定义并且没有任何遗漏者不一致之处。另外也要记得处理好那些可选但是影响结果设置的部分,像之前提及到的一些扩展区域的内容如果不需要就应该被清空以免干扰正常业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gavin_gxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值