BAPI_BATCH_CHANGE:修改批次的特征值

90 篇文章 0 订阅
2 篇文章 0 订阅

BAPI_BATCH_CHANGE:修改批次的特征值

现在有一个需求是要修改批次里面的某一个特征值,所以需要使用到BAPI_BATCH_CHANGE这个BAPI,除此之外,还有VB_BATCH_2_CLASS_OBJECT函数和BAPI_OBJCL_GETDETAIL。
特别注意

  • 注意函数VB_BATCH_2_CLASS_OBJECTi_matnr参数,注意前导0的问题。因为这个前导0,我的批次的类还取不到,哭了,后面发现两个系统的物料一个是有前导0,一个是没有的,所以要注意。
  • 注意BAPI函数BAPI_OBJCL_GETDETAILobjectkey_long参数,不使用objectkey

实现步骤

定义变量

DATA e_objek TYPE cuobn.
DATA e_obtab TYPE tabelle.
DATA e_klart TYPE klassenart.
DATA e_class TYPE klasse_d.
DATA allocvaluesnum   TYPE STANDARD TABLE OF bapi1003_alloc_values_num.   "分配 BAPI - NUMDATETIME 类型的值
DATA allocvalueschar  TYPE STANDARD TABLE OF bapi1003_alloc_values_char.  "分配 BAPI - CHARBOOL 类型的值
DATA allocvaluescurr  TYPE STANDARD TABLE OF bapi1003_alloc_values_curr.  "分配 BAPI - CURR 类型值
DATA return           TYPE STANDARD TABLE OF bapiret2.

DATA: lt_numnew TYPE TABLE OF bapi1003_alloc_values_num,
      lt_charnew TYPE TABLE OF bapi1003_alloc_values_char,
      lt_currnew TYPE TABLE OF bapi1003_alloc_values_curr,
      lt_returnnew TYPE TABLE OF bapiret2.

DATA: ls_char TYPE bapi1003_alloc_values_char,
      ls_return TYPE bapiret2.

获取对象/类等

函数名称:VB_BATCH_2_CLASS_OBJECT

CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
  EXPORTING
    i_matnr       = 'EWM_RAW_01'  "物料
    i_charg       = '2022061302'  "批次
    i_werks       = '1710'    "工厂
 IMPORTING
   e_objek       = e_objek
   e_obtab       = e_obtab
   e_klart       = e_klart
   e_class       = e_class
          .

获取已维护特性值

BAPI名称:BAPI_OBJCL_GETDETAIL

CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
  EXPORTING
   "objectkey               = e_objek  "如果是物料是40位的,选这个会报错,要选OBJECTKEY_LONG
    objecttable            = e_obtab  "对于分类的对象的数据库表名称
    classnum               = e_class  "分类编号
    classtype              = e_klart  "分类的类型
    "keydate                = sy-datum
*   UNVALUATED_CHARS       = ' '
*   LANGUAGE               = SY-LANGU
    objectkey_long         = e_objek   "关键字字段
* IMPORTING
*   STATUS                 = STATUS
*   STANDARDCLASS          = STANDARDCLASS
  TABLES
    allocvaluesnum         = allocvaluesnum
    allocvalueschar        = allocvalueschar
    allocvaluescurr        = allocvaluescurr
    return                 = return
          .

新特性值更新

BAPI名称:BAPI_BATCH_CHANGE

lt_numnew[] = allocvaluesnum.
lt_charnew[] = allocvalueschar.
lt_currnew[] = allocvaluescurr.
lt_returnnew[] = return.

IF lt_charnew[] IS NOT INITIAL.
  LOOP AT lt_charnew INTO ls_char.
    ls_char-value_char = '1'.         "特征值
    ls_char-value_neutral = '1'.      "特征值
    ls_char-value_char_long = '1'.    "特征值
    ls_char-value_neutral_long = '1'. "特征值
    MODIFY lt_charnew FROM ls_char.
  ENDLOOP.
ELSE.
  ls_char-charact = 'Z_SW_DW_BA'.   "特征名
  ls_char-value_char = '1'.         "特征值
  ls_char-value_neutral = '1'.      "特征值
  ls_char-value_char_long = '1'.    "特征值
  ls_char-value_neutral_long = '1'. "特征值
  APPEND ls_char TO lt_charnew[].
ENDIF.

"--> 新特性值更新
CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
*   OBJECTKEY                = OBJECTKEY
    objecttable              = e_obtab
    classnum                 = e_class
    classtype                = e_klart
*   STATUS                   = '1'
*   STANDARDCLASS            = STANDARDCLASS
*   CHANGENUMBER             = CHANGENUMBER
*   KEYDATE                  = SY-DATUM
*   NO_DEFAULT_VALUES        = ' '
*   KEEP_SAME_DEFAULTS       = ' '
   objectkey_long           = e_objek
* IMPORTING
*   CLASSIF_STATUS           = CLASSIF_STATUS
  TABLES
    allocvaluesnumnew        = lt_numnew
    allocvaluescharnew       = lt_charnew
    allocvaluescurrnew       = lt_currnew
    return                   = lt_returnnew
          .

LOOP AT return INTO ls_return WHERE type = 'E' OR type = 'A'.
  WRITE: ls_return-message.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  EXIT.
ENDLOOP.

IF sy-subrc <> 0.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF.

注意事项

在这里插入图片描述

常见的错误:Object xxx does not exist

注:在S/4之前的系统,物料编码是18位长度,可以直接使用参数objectkey接收Object key的值,特性的值是可以被正确读取出来的。
但是在S/4系统,物料编码是40位,若还是使用objectkey接收Object Key的值,则会出现如上的错误。
所以在S/4系统,应该改用参数objectkey_long。

最终效果

在这里插入图片描述

字段介绍

在这里插入图片描述

正式测试-310测试环境(HS)

特性值数据内表介绍

在这里插入图片描述
事务代码MSC3N的界面如下:
在这里插入图片描述

运行效果

原始的值记录:
在这里插入图片描述
在这里插入图片描述

现在修改成功,原来的值修改成了VENDOR002

在这里插入图片描述

完整代码

 "-------------- 测试 获取对象和类 LHY20240422  --------------
  DATA e_objek TYPE cuobn.
  DATA e_obtab TYPE tabelle.
  DATA e_klart TYPE klassenart.
  DATA e_class TYPE klasse_d.


  CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
    EXPORTING
      i_matnr = '000000100000008374'  "物料号,一定要注意前导0!!!,否则获取类e_class不成功,在自己购买的测试系统的测试物料是没有前导0的
      i_charg = '2404220002'  "批次号
      i_werks = '1100'
    IMPORTING
      e_objek = e_objek
      e_obtab = e_obtab
      e_klart = e_klart
      e_class = e_class.

  DATA allocvaluesnum   TYPE STANDARD TABLE OF bapi1003_alloc_values_num.   "NUMDATETIME 类型的特征值
  DATA allocvalueschar  TYPE STANDARD TABLE OF bapi1003_alloc_values_char.  "CHARBOOL 类型的特征值
  DATA allocvaluescurr  TYPE STANDARD TABLE OF bapi1003_alloc_values_curr.  "CURR 类型特征值
  DATA return           TYPE STANDARD TABLE OF bapiret2.

  DATA: lt_numnew    TYPE TABLE OF bapi1003_alloc_values_num,
        lt_charnew   TYPE TABLE OF bapi1003_alloc_values_char,
        lt_currnew   TYPE TABLE OF bapi1003_alloc_values_curr,
        lt_returnnew TYPE TABLE OF bapiret2.

  DATA: ls_char   TYPE bapi1003_alloc_values_char,
        ls_return TYPE bapiret2.

  "-------------- 测试 获取已维护特性值--------------
  CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
    EXPORTING
*     OBJECTKEY       = e_objek
      objecttable     = e_obtab
      classnum        = e_class
      classtype       = e_klart
*     KEYDATE         = SY-DATUM
*     UNVALUATED_CHARS       = ' '
*     LANGUAGE        = SY-LANGU
      objectkey_long  = e_objek  "如果是物料是40位的,选这个会报错(类型不匹配),要选OBJECTKEY_LONG
*   IMPORTING
*     STATUS          =
*     STANDARDCLASS   =
    TABLES
      allocvaluesnum  = allocvaluesnum
      allocvalueschar = allocvalueschar
      allocvaluescurr = allocvaluescurr
      return          = return.

  lt_numnew[] = allocvaluesnum.
  lt_charnew[] = allocvalueschar.
  lt_currnew[] = allocvaluescurr.
  lt_returnnew[] = return.

  READ TABLE lt_charnew INTO ls_char WITH KEY charact = 'ZMM015'.
  IF sy-subrc <> 0."不存在ZMM015特征,可以创建
    ls_char-charact = 'ZMM015'.
    ls_char-value_char = 'VENDOR001'.         "特征值
    ls_char-value_neutral = 'VENDOR001'.      "特征值
    ls_char-value_char_long = 'VENDOR001'.    "特征值
    ls_char-value_neutral_long = 'VENDOR001'. "特征值
    APPEND ls_char TO lt_charnew.
  ELSE. "如果已经存在,可以修改其特征值
    ls_char-value_char = 'VENDOR002'.         "特征值
    ls_char-value_neutral = 'VENDOR002'.      "特征值
    ls_char-value_char_long = 'VENDOR002'.    "特征值
    ls_char-value_neutral_long = 'VENDOR002'. "特征值
    MODIFY lt_charnew FROM ls_char INDEX sy-tabix.
  ENDIF.

  "----------------  测试 新特性值更新--------------
  CALL FUNCTION 'BAPI_OBJCL_CHANGE'
    EXPORTING
*     OBJECTKEY          =
      objecttable        = e_obtab
      classnum           = e_class
      classtype          = e_klart
*     STATUS             = '1'
*     STANDARDCLASS      =
*     CHANGENUMBER       =
*     KEYDATE            = SY-DATUM
*     NO_DEFAULT_VALUES  = ' '
*     KEEP_SAME_DEFAULTS = ' '
      objectkey_long     = e_objek
*   IMPORTING
*     CLASSIF_STATUS     =
    TABLES
      allocvaluesnumnew  = lt_numnew
      allocvaluescharnew = lt_charnew
      allocvaluescurrnew = lt_currnew
      return             = lt_returnnew.

  LOOP AT return INTO ls_return WHERE type = 'E' OR type = 'A'.
    WRITE: ls_return-message.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    EXIT.
  ENDLOOP.

  IF sy-subrc <> 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值