目录
读取批次对象信息: VB_BATCH_2_CLASS_OBJECT
根据批次对象获取特性: BAPI_OBJCL_GETDETAIL
读取批次对象信息: VB_BATCH_2_CLASS_OBJECT
根据批次对象获取特性: BAPI_OBJCL_GETDETAIL
业务说明
在实战项目上,存在外部接口业务或批导或功能程序时,需要在开发程序中调用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_MATNR | MATNR | 物料 | ||
入参 | I_CHARG | CHARG_D | 批次 | ||
入参 | I_WERKS | WERKS_D | 工厂 | ||
出参 | E_OBJEK | CUOBN | 对象 | ||
出参 | E_OBTAB | TABELLE | 表 | ||
出参 | E_KLART | KLASSENART | 分类的类型 | ||
出参 | E_CLASS | KLASSE_D | 分类 |
根据批次对象获取特性: BAPI_OBJCL_GETDETAIL
根据批次对象获取特性: BAPI_OBJCL_GETDETAIL
参数 | BAPI参数 | BAPI组件 | 字段描述 | 后台表字段 | 标记 |
入参 | OBJECTTABLE | BAPI1003_KEY-OBJECTTABLE | 对于分类的对象的数据库表名称 | ||
入参 | CLASSNUM | BAPI1003_KEY-CLASSNUM | 分类编号 | ||
入参 | CLASSTYPE | BAPI1003_KEY-CLASSTYPE | 分类的类型 | ||
入参 | KEYDATE | BAPI1003_KEY-KEYDATE | 关键日期 | ||
入参 | LANGUAGE | BAPIFIELDSCACL-BAPILANGUA | SAP 登录的语言代码 | ||
表出参 | ALLOCVALUESNUM | BAPI1003_ALLOC_VALUES_NUM | 数值型批次特性值 | ||
表出参 | ALLOCVALUESCHAR | BAPI1003_ALLOC_VALUES_CHAR | 字符型批次特性值 | ||
表出参 | ALLOCVALUESCURR | BAPI1003_ALLOC_VALUES_CURR | 货币型批次特性值 |
批次特性值更改: BAPI_OBJCL_CHANGE
批次特性值更改: BAPI_OBJCL_CHANGE
参数 | BAPI参数 | BAPI组件 | 字段描述 | 后台表字段 | 标记 |
入参 | OBJECTTABLE | BAPI1003_KEY-OBJECTTABLE | 对于分类的对象的数据库表名称 | ||
入参 | CLASSNUM | BAPI1003_KEY-CLASSNUM | 分类编号 | ||
入参 | CLASSTYPE | BAPI1003_KEY-CLASSTYPE | 分类的类型 | ||
入参 | STATUS | BAPI1003_KEY-STATUS | 分类状态 | ||
入参 | KEYDATE | BAPI1003_KEY-KEYDATE | 关键日期 | ||
入参 | OBJECTKEY_LONG | BAPI1003_KEY-OBJECT_LONG | 分类:对象字段(长度为 90,技术上需要) | ||
表入参 | ALLOCVALUESNUMNEW | BAPI1003_ALLOC_VALUES_NUM | 数值型批次特性值 | ||
表入参 | ALLOCVALUESCHARNEW | BAPI1003_ALLOC_VALUES_CHAR | 字符型批次特性值 | ||
表入参 | ALLOCVALUESCURRNEW | BAPI1003_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