SAP BAPI-MM模块-批次特性更新-BAPI_OBJCL_CHANGE-SE37函数测试(事务码MSC2N & 后台表MCH1 MCHA)超级干货系列

目录

业务说明

1 BAPI注意事项

2 BAPI基础数据

3 BAPI数据结构

4 BAPI函数调用

5 BAPI必要数据

事务码MSC2N进入界面

BAPI组件和后台表字段匹配表

读取批次对象信息: VB_BATCH_2_CLASS_OBJECT

根据批次对象获取特性: BAPI_OBJCL_GETDETAIL 

批次特性值更改: BAPI_OBJCL_CHANGE 

SE38调用BAPI批次特性值更新

前台事务码MSC3N查看

6 BAPI执行测试

读取批次对象信息: VB_BATCH_2_CLASS_OBJECT

BAPI执行

根据批次对象获取特性: BAPI_OBJCL_GETDETAIL

BAPI执行

批次特性值更改: BAPI_OBJCL_CHANGE

BAPI执行


业务说明

在实战项目上,存在外部接口业务或批导或功能程序时,需要在开发程序中调用SAP标准业务应用程序接口,就是经常听到的BAPI。SAP给常用的业务都预定义了BAPI,所以有需要的时候,就要找到对应的BAPI。需要对BAPI的结构和字段非常熟悉,否则不能正确的使用BAPI,从而导致各种报错。为了降低测试过程中的报错,需要在写程序前,将需要调用的BAPI使用事务码SE37进行相关测试,以掌握具体的入参和出参等详细数据。

1 BAPI注意事项

批次特性通过BAPI更新,需要通过下面4个BAPI可以实现。

读取批次对象信息: VB_BATCH_2_CLASS_OBJECT

根据批次对象获取特性: BAPI_OBJCL_GETDETAIL

批次特性值更改: BAPI_OBJCL_CHANGE

批次特性值更新-确认: BAPI_TRANSACTION_COMMIT

2 BAPI基础数据

BAPI功能:批次特性值更新

BAPI_OBJCL_CHANGE

对应前台事务码:MSC2N-更新批次特性值

批次特性值后台表:

INOB-对象

CABN-特征

KLAH-类表头数据

KSML-类的特性

AUSP-类的特性

3 BAPI数据结构

EXPORTING:程序将值传给函数模块的导入参数(入参)。
IMPORTING:实际参数会分配给函数模块的导出参数(出参)。
TABLE:函数模块中传递和处理多个记录的数据。
EXCEPTIONS:函数中定义的异常自动分配不同数值(异常)。

4 BAPI函数调用

批次特性值更新BAPI: BAPI_OBJCL_CHANGE

CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
*   OBJECTKEY                =
    objecttable              =
    classnum                 =
    classtype                =
*   STATUS                   = '1'
*   STANDARDCLASS            =
*   CHANGENUMBER             =
*   KEYDATE                  = SY-DATUM
*   NO_DEFAULT_VALUES        = ' '
*   KEEP_SAME_DEFAULTS       = ' '
*   OBJECTKEY_LONG           =
* IMPORTING
*   CLASSIF_STATUS           =
  TABLES
    allocvaluesnumnew        =
    allocvaluescharnew       =
    allocvaluescurrnew       =
    return                   =
          .

5 BAPI必要数据

如何快速在BAPI中找到对应的BAPI组件并输入正确的值,就需要弄清楚每个组件的位置路径和名称 对应的前台字段或后台表字段 对应关系。

事务码MSC2N进入界面

BAPI组件和后台表字段匹配表

读取批次对象信息: VB_BATCH_2_CLASS_OBJECT

参数BAPI参数BAPI组件字段描述后台表字段标记
入参I_MATNRMATNR物料
入参I_CHARGCHARG_D批次
入参I_WERKSWERKS_D工厂
出参E_OBJEKCUOBN对象
出参E_OBTABTABELLE
出参E_KLARTKLASSENART分类的类型
出参E_CLASSKLASSE_D分类

根据批次对象获取特性: BAPI_OBJCL_GETDETAIL

根据批次对象获取特性: BAPI_OBJCL_GETDETAIL 

参数BAPI参数BAPI组件字段描述后台表字段标记
入参OBJECTTABLEBAPI1003_KEY-OBJECTTABLE对于分类的对象的数据库表名称
入参CLASSNUMBAPI1003_KEY-CLASSNUM分类编号
入参CLASSTYPEBAPI1003_KEY-CLASSTYPE分类的类型
入参KEYDATEBAPI1003_KEY-KEYDATE关键日期
入参LANGUAGEBAPIFIELDSCACL-BAPILANGUASAP 登录的语言代码
表出参ALLOCVALUESNUMBAPI1003_ALLOC_VALUES_NUM数值型批次特性值
表出参ALLOCVALUESCHARBAPI1003_ALLOC_VALUES_CHAR字符型批次特性值
表出参ALLOCVALUESCURRBAPI1003_ALLOC_VALUES_CURR货币型批次特性值

批次特性值更改: BAPI_OBJCL_CHANGE

批次特性值更改: BAPI_OBJCL_CHANGE 

参数BAPI参数BAPI组件字段描述后台表字段标记
入参 OBJECTTABLEBAPI1003_KEY-OBJECTTABLE对于分类的对象的数据库表名称
入参 CLASSNUMBAPI1003_KEY-CLASSNUM分类编号
入参 CLASSTYPEBAPI1003_KEY-CLASSTYPE分类的类型
入参 STATUSBAPI1003_KEY-STATUS分类状态
入参 KEYDATEBAPI1003_KEY-KEYDATE关键日期
入参 OBJECTKEY_LONGBAPI1003_KEY-OBJECT_LONG分类:对象字段(长度为 90,技术上需要)
表入参 ALLOCVALUESNUMNEWBAPI1003_ALLOC_VALUES_NUM数值型批次特性值
表入参 ALLOCVALUESCHARNEWBAPI1003_ALLOC_VALUES_CHAR字符型批次特性值
表入参 ALLOCVALUESCURRNEWBAPI1003_ALLOC_VALUES_CURR货币型批次特性值

SE38调用BAPI批次特性值更新

*&---------------------------------------------------------------------*
*& Report ZMM_BOTECK_031
*&---------------------------------------------------------------------*
*& 命名规则:定义变量lv 和 定义工作区ls或gw 和 定义内表lt或gt
*&---------------------------------------------------------------------*
*& BOTECK物料凭证创建MIGO过账调用BAPI-批次特性值更新
*&---------------------------------------------------------------------*
REPORT zmm_boteck_031.

*&---------------------------------------------------------------------*
*& 定义变量和工作区和内表
*&---------------------------------------------------------------------*

DATA:lv_matnr               TYPE matnr.                         "定义变量
DATA:lv_chart               TYPE charg_d.                       "定义变量
DATA:lv_werks               TYPE werks_d.                       "定义变量
DATA:lv_objek               TYPE cuobn.                         "定义变量
DATA:lv_obtab               TYPE tabelle.                       "定义变量
DATA:lv_klart               TYPE klassenart.                    "定义变量
DATA:lv_class               TYPE klasse_d.                      "定义变量
DATA:lv_objek1              TYPE cuobn.                         "定义变量
DATA:lv_obtab1              TYPE tabelle.                       "定义变量
DATA:lv_klart1              TYPE klassenart.                    "定义变量
DATA:lv_class1              TYPE klasse_d.                      "定义变量
DATA:lv_objek2              TYPE cuobn.                         "定义变量
DATA:lv_obtab2              TYPE tabelle.                       "定义变量
DATA:lv_klart2              TYPE klassenart.                    "定义变量
DATA:lv_class2              TYPE klasse_d.                      "定义变量
DATA:lv_classif_status      TYPE bapi1003_key-status.           "定义变量

DATA:ls_allocvaluesnum      TYPE bapi1003_alloc_values_num.               "定义工作区
DATA:lt_allocvaluesnum      TYPE TABLE OF bapi1003_alloc_values_num.      "定义内表
DATA:ls_allocvalueschar     TYPE bapi1003_alloc_values_char.              "定义工作区
DATA:lt_allocvalueschar     TYPE TABLE OF bapi1003_alloc_values_char.     "定义内表
DATA:ls_allocvaluescurr     TYPE bapi1003_alloc_values_curr.              "定义工作区
DATA:lt_allocvaluescurr     TYPE TABLE OF bapi1003_alloc_values_curr.      "定义内表

DATA:ls_allocvaluesnumnew   TYPE bapi1003_alloc_values_num.               "定义工作区
DATA:lt_allocvaluesnumnew   TYPE TABLE OF bapi1003_alloc_values_num.      "定义内表
DATA:ls_allocvaluescharnew  TYPE bapi1003_alloc_values_char.              "定义工作区
DATA:lt_allocvaluescharnew  TYPE TABLE OF bapi1003_alloc_values_char.     "定义内表
DATA:ls_allocvaluescurrnew  TYPE bapi1003_alloc_values_curr.              "定义工作区
DATA:lt_allocvaluescurrnew  TYPE TABLE OF bapi1003_alloc_values_curr.     "定义内表

DATA:lt_return              TYPE TABLE OF bapiret2.                        "定义内表
DATA:ls_returnnew           TYPE bapiret2.                                "定义内表
DATA:lt_returnnew           TYPE TABLE OF bapiret2.                       "定义内表


*&---------------------------------------------------------------------*
*& 给BAPI参数对应变量赋值
*&---------------------------------------------------------------------*

lv_matnr           = '000000006630000045'.  "直接给BAPI入参赋值-物料号(字段C18)
lv_chart           = '2501180012'.          "直接给BAPI入参赋值-批号
lv_werks           = '1087'.                "直接给BAPI入参赋值-工厂

*&---------------------------------------------------------------------*
*& 调用BAPI
*&---------------------------------------------------------------------*

CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
  EXPORTING
    i_matnr = lv_matnr
    i_charg = lv_chart
    i_werks = lv_werks
  IMPORTING
    e_objek = lv_objek
    e_obtab = lv_obtab
    e_klart = lv_klart
    e_class = lv_class.

WRITE:/'1、调用第1个BAPI-VB_BATCH_2_CLASS_OBJECT成功:'.
WRITE:/'lv_obtab输出:',lv_obtab.
WRITE:/'lv_klart输出:',lv_klart.
WRITE:/'lv_class输出:',lv_class.
WRITE:/'lv_objek输出:',lv_objek.
ULINE.

IF sy-subrc = 0.  "如果上一步BAPI执行成功,执行下一个BAPI调用
  WRITE:/'执行成功!'.
ENDIF.
ULINE.

*BOTECK批次特性值更新*
*lv_objek 000000006630000045                      2501180012
*lv_obtab MCH1
*lv_klart 023
*lv_class BOTECK_RM

lv_obtab1 = lv_obtab.
lv_class1 = lv_class.
lv_klart1 = lv_klart.
lv_objek1 = lv_objek.

WRITE:/'2、调用第2个BAPI前入参数据显示:'.
WRITE:/'lv_obtab1输出:',lv_obtab1.
WRITE:/'lv_klart1输出:',lv_klart1.
WRITE:/'lv_class1输出:',lv_class1.
WRITE:/'lv_objek1输出:',lv_objek1.
ULINE.

*BOTECK批次特性值更新*
*lv_objek1 000000006630000045                      2501180012
*lv_obtab1 MCH1
*lv_klart1 023
*lv_class1 BOTECK_RM

IF sy-subrc = 0.  "如果上一步BAPI执行成功,执行下一个BAPI调用
  WRITE:/'执行成功!'.
ENDIF.

ULINE.

*&---------------------------------------------------------------------*
*& 调用BAPI
*&---------------------------------------------------------------------*

CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
  EXPORTING
    objecttable     = lv_obtab1 "从VB_BATCH_2_CLASS_OBJECT出参lv_obtab(后台表MCH1)赋值
    classnum        = lv_class1 "从VB_BATCH_2_CLASS_OBJECT出参lv_class(批次分类BOTECK_RM)赋值
    classtype       = lv_klart1 "从VB_BATCH_2_CLASS_OBJECT出参lv_klart(批次类023)赋值
    objectkey_long  = lv_objek1 "从VB_BATCH_2_CLASS_OBJECT出参lv_objek(物料号+批次号)赋值
  TABLES
    allocvaluesnum  = lt_allocvaluesnum    "批次特性相关内表-数值型特征值
    allocvalueschar = lt_allocvalueschar   "批次特性相关内表-字符型特征值
    allocvaluescurr = lt_allocvaluescurr   "批次特性相关内表-货币型特征值
    return          = lt_return.

LOOP AT lt_allocvalueschar INTO ls_allocvalueschar.
  WRITE:/'ls_allocvalueschar-charact            输出:', ls_allocvalueschar-charact.
  WRITE:/'ls_allocvalueschar-value_char         输出:', ls_allocvalueschar-value_char.
  WRITE:/'ls_allocvalueschar-value_neutral      输出:', ls_allocvalueschar-value_neutral.
  WRITE:/'ls_allocvalueschar-value_char_long    输出:', ls_allocvalueschar-value_char_long.
  WRITE:/'ls_allocvalueschar-value_neutral_long 输出:', ls_allocvalueschar-value_neutral_long.
ENDLOOP.
ULINE.

*&---------------------------------------------------------------------*
*& 从上个BAPI赋值给下个BAPI
*&---------------------------------------------------------------------*

lt_allocvaluesnumnew[]  = lt_allocvaluesnum.
lt_allocvaluescharnew[] = lt_allocvalueschar.
lt_allocvaluescurrnew[] = lt_allocvaluescurr.

READ TABLE lt_allocvaluescharnew INTO ls_allocvaluescharnew WITH KEY charact = 'BOTECK_BATCH_GGXH'.

ls_allocvaluescharnew-charact            = 'BOTECK_BATCH_GGXH'.
ls_allocvaluescharnew-value_char         = '新批次特性值'.
ls_allocvaluescharnew-value_neutral      = '新批次特性值'.
ls_allocvaluescharnew-value_char_long    = '新批次特性值'.
ls_allocvaluescharnew-value_neutral_long = '新批次特性值'.
APPEND ls_allocvaluescharnew TO lt_allocvaluescharnew.

lv_obtab2 = lv_obtab1.
lv_class2 = lv_class1.
lv_klart2 = lv_klart1.
lv_objek2 = lv_objek1.

WRITE:/'2、调用第2个BAPI前入参数据显示:'.
WRITE:/'lv_obtab2输出:',lv_obtab2.
WRITE:/'lv_klart2输出:',lv_klart2.
WRITE:/'lv_class2输出:',lv_class2.
WRITE:/'lv_objek2输出:',lv_objek2.
ULINE.

LOOP AT lt_allocvaluescharnew INTO ls_allocvaluescharnew.
  WRITE:/'ls_allocvaluescharnew-charact             输出:', ls_allocvaluescharnew-charact.
  WRITE:/'ls_allocvaluescharnew-value_char          输出:', ls_allocvaluescharnew-value_char.
  WRITE:/'ls_allocvaluescharnew-value_neutral       输出:', ls_allocvaluescharnew-value_neutral.
  WRITE:/'ls_allocvaluescharnew-value_char_long     输出:', ls_allocvaluescharnew-value_char_long.
  WRITE:/'ls_allocvaluescharnew-value_neutral_long  输出:', ls_allocvaluescharnew-value_neutral_long.
ENDLOOP.
ULINE.

*&---------------------------------------------------------------------*
*& 调用BAPI
*&---------------------------------------------------------------------*

CALL FUNCTION 'BAPI_OBJCL_CHANGE'
EXPORTING
  objecttable        = lv_obtab2          "从VB_BATCH_2_CLASS_OBJECT出参lv_obtab(后台表MCH1)赋值
  classnum           = lv_class2          "从VB_BATCH_2_CLASS_OBJECT出参lv_class(批次分类BOTECK_RM)赋值
  classtype          = lv_klart2          "从VB_BATCH_2_CLASS_OBJECT出参lv_klart(批次类023)赋值
  objectkey_long     = lv_objek2          "从VB_BATCH_2_CLASS_OBJECT出参lv_objek(物料号+批次号)赋值
*    IMPORTING
* classif_status     = lv_classif_status
TABLES
  allocvaluesnumnew  = lt_allocvaluesnumnew
  allocvaluescharnew = lt_allocvaluescharnew
  allocvaluescurrnew = lt_allocvaluescurrnew
  return             = lt_returnnew.

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

IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  EXPORTING
    wait = 'X'.
WRITE:/'最后一个BAPI执行成功!'.
ENDIF.
ULINE.

备注:上面的代码亲测有效,可以直接粘贴测试使用(需要把相关参数更改为目标系统的测试数据即可,例如:批次号等)。

1处,点击 执行 按钮

ls_allocvaluescharnew-charact                     输出:BOTECK_BATCH_GGXH
ls_allocvaluescharnew-value_char               输出:1新批次特性值1
ls_allocvaluescharnew-value_neutral           输出:1新批次特性值1
ls_allocvaluescharnew-value_char_long      输出:1新批次特性值1
ls_allocvaluescharnew-value_neutral_long  输出:1新批次特性值1

前台事务码MSC3N查看

6 BAPI执行测试

读取批次对象信息: VB_BATCH_2_CLASS_OBJECT

BAPI执行

1处,点击 执行 按钮 

根据批次对象获取特性: BAPI_OBJCL_GETDETAIL

BAPI执行

1处,点击 执行 按钮 

批次特性值更改: BAPI_OBJCL_CHANGE

BAPI执行

1处,点击 执行 按钮 

Done.

Created on 23rd January, 2025

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值