ABAP 写入批次特征值以及更新批次特征值

需求

SAP启用了批次,需要在特征值中写入物料类型,区分该物料批次是用于研发的亦或是量产的,关于研发和量产标识我是坐在采购订单行项目增强中了,这里就不多赘述了,参考https://www.cnblogs.com/pnj-owowa/p/16998901.html即可,这里主要写批次特征值的写入以及更新。

函数说明

VB_BATCH_2_CLASS_OBJECT:获取物料批次对应的类等相关信息
BAPI_OBJCL_GETDETAIL:依据上一个函数的反馈返回值获取特性以及特性值
BAPI_OBJCL_CHANGE:更新以及创建特征值,查询了很多资料,都是用这个函数来更新的,其实也可以用来创建,后面会说明。

使用前提

因为我是在采购收货的时候写入特征值,因此必须在该物料成功生成收货物料凭证以及批次后,当然物料启用分类模块也是必须的,不然物料的首个批次需要去msc2n里手动进行批次分类的创建,只有这样才可以去进行特征值的写入以及更新。

函数使用

VB_BATCH_2_CLASS_OBJECT

      CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
        EXPORTING
          i_matnr = gs_data-matnr  " 物料号
          i_charg = gs_data-charg  " 物料批次
          i_werks = gs_data-werks  " 工厂
        IMPORTING
          e_objek = e_objek
          e_obtab = e_obtab
          e_klart = e_klart
          e_class = e_class.

BAPI_OBJCL_GETDETAIL

      CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
        EXPORTING
          objectkey_long  = e_objek  "这里的参数要注意,如果你的物料号在系统里是40位的,就要用带long的参数,不然是会有问题
          objecttable     = e_obtab
          classtype       = e_klart
          classnum        = e_class
        TABLES
          allocvaluesnum  = lt_allocvaluesnum
          allocvalueschar = lt_allocvalueschar
          allocvaluescurr = lt_allocvaluescurr
          return          = lt_return2.

BAPI_OBJCL_CHANGE

接着第二个函数的代码

    READ TABLE lt_return2 INTO ls_return2 INDEX 1.
      "说明没有特征值 需要手动添加,这里因为知道是哪一个 因此写死 这里就是创建
      IF ls_return2-type = 'I'.  
        CLEAR ls_allocvalueschar.
        ls_allocvalueschar-charact = 'ZMM_MATERIAL_TYPE'.  "自己创建的批次类下的属性
        ls_allocvalueschar-charact_descr = '物料类型'.      " 描述
        ls_allocvalueschar-value_char = gs_data-zzmstat.   " 特征值
        ls_allocvalueschar-value_neutral = gs_data-zzmstat.  " 特征值
        ls_allocvalueschar-value_char_long = gs_data-zzmstat.  " 特征值
        ls_allocvalueschar-value_neutral_long = gs_data-zzmstat.  " 特征值
        APPEND ls_allocvalueschar TO lt_allocvalueschar.

      ELSEIF ls_return2-type = 'S'.
        "说明有特征值,那么需要判断一下这个特征值是否是我们需要的 如果是 修改 ,如果不是 新增一行
        CLEAR ls_allocvalueschar.
        READ TABLE lt_allocvalueschar ASSIGNING FIELD-SYMBOL(<fs_allocvalueschar>) WITH KEY charact = 'ZMM_MATERIAL_TYPE'. "判断如果是我需要的特征值,那么就要进行修改
        IF sy-subrc EQ 0.
          <fs_allocvalueschar>-value_char = gs_data-zzmstat.     " 修改的特征值
          <fs_allocvalueschar>-value_neutral = gs_data-zzmstat.  " 修改的特征值
          <fs_allocvalueschar>-value_char_long = gs_data-zzmstat.  " 修改的特征值
          <fs_allocvalueschar>-value_neutral_long = gs_data-zzmstat.  " 修改的特征值
        ELSE.
          ls_allocvalueschar-charact = 'ZMM_MATERIAL_TYPE'.  " 同上面的创建
          ls_allocvalueschar-charact_descr = '物料类型'.
          ls_allocvalueschar-value_char = gs_data-zzmstat.
          ls_allocvalueschar-value_neutral = gs_data-zzmstat.
          ls_allocvalueschar-value_char_long = gs_data-zzmstat.
          ls_allocvalueschar-value_neutral_long = gs_data-zzmstat.
          APPEND ls_allocvalueschar TO lt_allocvalueschar.
        ENDIF.
      ENDIF.

      IF ls_return2-type = 'S' OR ls_return2-type = 'I'.
        CALL FUNCTION 'BAPI_OBJCL_CHANGE'  " 进行修改或者新增
          EXPORTING
            objectkey_long     = e_objek  "这里的参数要注意,如果你的物料号在系统里是40位的,就要用带long的参数,不然是会有问题
            objecttable        = e_obtab
            classnum           = e_class
            classtype          = e_klart
            status             = '1'
            keydate            = sy-datum
          TABLES
            allocvaluesnumnew  = lt_allocvaluesnum
            allocvaluescharnew = lt_allocvalueschar
            allocvaluescurrnew = lt_allocvaluescurr
            return             = lt_return2.

查看结果

在收货完成后查看msc3n对应的分类特征值就可以查看到写入的数据

posted @ 2023-01-10 09:58  otowa  阅读(4608)  评论(0)    收藏  举报