目录
入参-BATCHCONTROLFIELDS-CLASS_NUM-分类编号
入参-BATCHCONTROLFIELDS-DOCLASSIFY-分类对象
入参- BATCHSTORAGELOCATION-STGE_LOC-存储地点
业务说明
在实战项目上,存在外部接口业务或批导或功能程序时,需要在开发程序中调用SAP标准业务应用程序接口,就是经常听到的BAPI。SAP给常用的业务都预定义了BAPI,所以有需要的时候,就要找到对应的BAPI。需要对BAPI的结构和字段非常熟悉,否则不能正确的使用BAPI,从而导致各种报错。为了降低测试过程中的报错,需要在写程序前,将需要调用的BAPI使用事务码SE37进行相关测试,以掌握具体的入参和出参等详细数据。
1 BAPI注意事项
批次主数据如果通过BAPI创建,不需要COMMIT就可以直接创建。
批次主数据创建-输入: BAPI_BATCH_CREATE
2 BAPI基础数据
BAPI功能:批次主数据创建
BAPI_TRANSACTION_COMMIT
对应前台事务码:MSC1N-批次创建
批次主数据后台表:
MCH1 - 批量(如果批次管理多工厂)
MCHA - 批次
3 BAPI数据结构
EXPORTING:程序将值传给函数模块的导入参数(入参)。
IMPORTING:实际参数会分配给函数模块的导出参数(出参)。
TABLE:函数模块中传递和处理多个记录的数据。
EXCEPTIONS:函数中定义的异常自动分配不同数值(异常)。
4 BAPI函数调用
批次主数据创建BAPI: BAPI_BATCH_CREATE
CALL FUNCTION 'BAPI_BATCH_CREATE'
* EXPORTING
* MATERIAL =
* BATCH =
* PLANT =
* BATCHATTRIBUTES =
* BATCHCONTROLFIELDS =
* BATCHSTORAGELOCATION =
* INTERNALNUMBERCOM =
* EXTENSION1 =
* MATERIAL_EVG =
* MATERIAL_LONG =
* IMPORTING
* BATCH =
* BATCHATTRIBUTES =
* TABLES
* RETURN =
.
5 BAPI必要数据
如何快速在BAPI中找到对应的BAPI组件并输入正确的值,就需要弄清楚每个组件的位置路径和名称 对应的前台字段或后台表字段 对应关系。
事务码MSC1N进入界面
BAPI组件和后台表字段匹配表
参数 | BAPI参数 | BAPI组件 | 字段描述 | 后台表字段 | 标记 |
入参 | MATERIAL | MATERIAL | 物料编号(18 个字符) | MCH1/MCHA/MCHB-MATNR | |
入参 | BATCH | BATCH | 批次编号 | MCH1/MCHA/MCHB-CHARG | |
入参 | PLANT | PLANT | 工厂 | MCHA/MCHB-WERKS | |
入参 | BATCHCONTROLFIELDS | CLASS_NUM | 分类编号(物料主数据批次分类代码,例如:BOTECK_RM) | MCH1-CLASS | |
入参 | BATCHCONTROLFIELDS | DOCLASSIFY | 分类对象(赋值参数'X') | ||
入参 | BATCHSTORAGELOCATION | STGE_LOC | 存储地点 | MCHB-LGORT |
SE38调用BAPI采购发票冲销
*&---------------------------------------------------------------------*
*& Report ZMM_BOTECK_030
*&---------------------------------------------------------------------*
*& 命名规则:定义变量lv 和 定义工作区ls或gw 和 定义内表lt或gt
*&---------------------------------------------------------------------*
*& BOTECK物料凭证创建MIGO过账调用BAPI-创建批次主数据
*&---------------------------------------------------------------------*
REPORT zmm_boteck_030.
*&---------------------------------------------------------------------*
*& 定义变量和工作区和内表
*&---------------------------------------------------------------------*
DATA:lv_material TYPE bapibatchkey-material. "定义变量
DATA:lv_batch TYPE bapibatchkey-batch. "定义变量
DATA:lv_plant TYPE bapibatchkey-plant. "定义变量
DATA:lv_batchstoragelocation TYPE bapibatchstoloc-stge_loc. "定义变量
DATA:ls_batchcontrolfields TYPE bapibatchctrl. "定义工作区
DATA:lt_return TYPE TABLE OF bapiret2. "定义内表
*&---------------------------------------------------------------------*
*& 给BAPI参数对应变量赋值
*&---------------------------------------------------------------------*
lv_material = '000000006630000045'. "直接给BAPI入参赋值-物料编号(18 个字符)
lv_batch = '2501180011'. "直接给BAPI入参赋值-批次编号
lv_plant = '1087'. "直接给BAPI入参赋值-工厂
lv_batchstoragelocation = '1001'. "直接给BAPI入参赋值-存储地点
*&---------------------------------------------------------------------*
*& 给BAPI参数对应工作区赋值
*&---------------------------------------------------------------------*
ls_batchcontrolfields-class_num = 'BOTECK_RM'. "直接给BAPI入参赋值-分类编号
ls_batchcontrolfields-doclassify = 'X'. "直接给BAPI入参赋值-分类对象
*&---------------------------------------------------------------------*
*& 调用BAPI
*&---------------------------------------------------------------------*
CALL FUNCTION 'BAPI_BATCH_CREATE'
EXPORTING
material = lv_material
batch = lv_batch
plant = lv_plant
batchstoragelocation = lv_batchstoragelocation
batchcontrolfields = ls_batchcontrolfields
IMPORTING
batch = lv_batch
TABLES
return = lt_return.
*&---------------------------------------------------------------------*
*& 检查返回信息
*&---------------------------------------------------------------------*
DATA(lv_has_error) = abap_false. "初始化一个标志变量来跟踪是否有错误
IF lt_return IS NOT INITIAL. "检查 BAPI 返回的消息
LOOP AT lt_return INTO DATA(ls_return_msg). "如果有错误消息,则遍历并显示它们
IF ls_return_msg-type ='E'. "如果有错误消息,则显示它们并设置错误标志
WRITE: / '报错信息如下:', ls_return_msg-type, ls_return_msg-id, ls_return_msg-number, ls_return_msg-message.
lv_has_error = abap_true.
ELSE.
ls_return_msg-type ='S'.
WRITE: / '成功信息如下:', ls_return_msg-type, ls_return_msg-id, ls_return_msg-number, ls_return_msg-message.
ENDIF.
ENDLOOP.
ENDIF.
IF lv_has_error = abap_true.
WRITE: / '批次主数据创建失败!'.
ELSE. "如果没有错误消息,则表示发票过账成功
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WRITE: / '批次主数据创建成功!批次号:', lv_batch. "如果没有错误消息,则表示物料凭证创建成功!
WRITE: / '批次主数据创建成功!物料号:', lv_material. "如果没有错误消息,则表示物料凭证创建成功!
WRITE: / '批次主数据创建成功!工厂号:', lv_plant. "如果没有错误消息,则表示物料凭证创建成功!
WRITE: / '批次主数据创建成功!库位号:', lv_batchstoragelocation."如果没有错误消息,则表示物料凭证创建成功!
ENDIF.
备注:上面的代码亲测有效,可以直接粘贴测试使用(需要把相关参数更改为目标系统的测试数据即可,例如:采购发票号等)。
1处,点击 执行 按钮
批次主数据创建成功!批次号:2501180011
批次主数据创建成功!物料号:6630000045
批次主数据创建成功!工厂号:1087
批次主数据创建成功!库位号:1001
前台事务码MSC2N查看
6 BAPI执行测试
入参-MATERIAL-物料编号(18 个字符)
入参-BATCH-批次编号
入参-PLANT-工厂
入参-BATCHCONTROLFIELDS-CLASS_NUM-分类编号
入参-BATCHCONTROLFIELDS-DOCLASSIFY-分类对象
入参- BATCHSTORAGELOCATION-STGE_LOC-存储地点
BAPI执行
1处,点击 执行 按钮
注意:BAPI: BAPI_BATCH_CREATE创建批次主数据后,不需要BAPI: BAPI_TRANSACTION_COMMIT再次确认,可以直接将批次主数据存表。
7 前台事务码MSC3N查看
批次主数据:2501180012
批次主数据已经创建完毕!
8 后台表查看更新
批次主数据:2501180012
后台表MCH1-批量(如果批次管理多工厂)
后台表MCHA-批次
后台表MCHB-批量库存
批次主数据已经存后台表。
Done.
Created on 19th January, 2024