目录
业务说明
在实战项目上,存在外部接口业务或批导或功能程序时,需要在开发程序中调用SAP标准业务应用程序接口,就是经常听到的BAPI。SAP给常用的业务都预定义了BAPI,所以有需要的时候,就要找到对应的BAPI。需要对BAPI的结构和字段非常熟悉,否则不能正确的使用BAPI,从而导致各种报错。为了降低测试过程中的报错,需要在写程序前,将需要调用的BAPI使用事务码SE37进行相关测试,以掌握具体的入参和出参等详细数据。
1 BAPI注意事项
采购货源清单如果通过BAPI创建,需要通过下面3个BAPI才可以实现。
货源清单创建-参数输入: ME_DIRECT_INPUT_SOURCE_LIST
货源清单创建-参数确认: ME_POST_SOURCE_LIST_NEW
货源清单创建-参数过账: BAPI_TRANSACTION_COMMIT
2 BAPI基础数据
BAPI功能:采购货源清单创建
BAPI:ME_DIRECT_INPUT_SOURCE_LIST
对应前台事务码:ME01-创建货源清单
采购信息记录后台表:EORD: 采购货源清单
3 BAPI数据结构
EXPORTING:程序将值传给函数模块的导入参数(入参)。
IMPORTING:实际参数会分配给函数模块的导出参数(出参)。
TABLE:函数模块中传递和处理多个记录的数据。
EXCEPTIONS:函数中定义的异常自动分配不同数值(异常)。
4 BAPI函数调用
采购货源清单创建BAPI: ME_DIRECT_INPUT_SOURCE_LIST
CALL FUNCTION 'ME_DIRECT_INPUT_SOURCE_LIST'
EXPORTING
i_matnr =
i_werks =
* I_MT06E =
* I_NO_MATERIAL_READ =
* ACTIVITY = 'V'
* I_VORGA =
* I_LOGSY =
TABLES
t_eord =
* EXCEPTIONS
* PLANT_MISSING = 1
* MATERIAL_MISSING = 2
* OTHERS = 3
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
5 BAPI必要数据
如何快速在BAPI中找到对应的BAPI组件并输入正确的值,就需要弄清楚每个组件的位置路径和名称 对应的前台字段或后台表字段 对应关系。
事务码:ME01进入界面
1处,输入物料号:6630000070
BAPI数据路径: I_MATNR->EORD-MATNR
后台表字段和BAPI组件对应关系: EORD-MATNR <=> BAPI组件-I_MATNR
2处,输入工厂代码:1087
BAPI数据路径: I_WERKS->EORD-WERKS
后台表字段和BAPI组件对应关系: EORD-MATNR <=> BAPI组件-I_WERKS
3处,输入 有效期从 20250108
BAPI数据路径: T_EORD->VDATU
后台表字段和BAPI组件对应关系: EORD-WERKS <=> BAPI组件-VDATU
4处,输入 有效期到 20251231
BAPI数据路径: T_EORD->BDATU
后台表字段和BAPI组件对应关系: EORD-WERKS <=> BAPI组件-BDATU
5处,输入 供应商 661000021
BAPI数据路径: T_EORD->LIFNR
后台表字段和BAPI组件对应关系: EORD-LIFNR<=> BAPI组件-LIFNR
6处,输入 采购组织 BN01
BAPI数据路径: T_EORD->EKORG
后台表字段和BAPI组件对应关系: EORD-EKORG<=> BAPI组件-EKORG
可以直接通过下面这段代码直接创建采购信息记录
*&---------------------------------------------------------------------*
*& Report ZMM_BOTECK_017
*&---------------------------------------------------------------------*
*& 采购货源清单BAPI调用测试
*&---------------------------------------------------------------------*
REPORT zmm_boteck_017.
*&---------------------------------------------------------------------*
*& 定义内表和工作区和变量
*&---------------------------------------------------------------------*
DATA:lt_eord TYPE TABLE OF eordu, "定义内表lt_eord
ls_eord TYPE eordu, "定义工作区ls_eord
lv_matnr TYPE eord-matnr, "定义物料编号变量
lv_werks TYPE eord-werks. "定义物料编号变量
DATA:e_return-message TYPE string.
*&---------------------------------------------------------------------*
*& 直接给变量赋值
*&---------------------------------------------------------------------*
lv_matnr = '000000006630000070'. "物料编号变量赋值
lv_werks = '1087'. "工厂代码变量赋值
*&---------------------------------------------------------------------*
*& 给工作区直接赋值
*&---------------------------------------------------------------------*
CLEAR ls_eord.
ls_eord-matnr = '000000006630000070'. "物料编号工作区赋值
ls_eord-werks = '1087'. "工厂代码工作区赋值
ls_eord-vdatu = '20250108'. "有效期从工作区赋值
ls_eord-bdatu = '20251221'. "有效期到工作区赋值
ls_eord-lifnr = '0661000021'. "供应商工作区赋值
ls_eord-ekorg = 'BN01'. "采购组织工作区赋值
ls_eord-eortp = '0'. "货源清单类别工作区赋值,0-标准 1-寄售
ls_eord-erdat = sy-datum. "创建日期工作区赋值,sy-datum=系统日期
ls_eord-ernam = sy-uname. "创建人工作区赋值,sy-uname=系统用户ID
ls_eord-kz = 'I'. "I-新增 U-更新
*&---------------------------------------------------------------------*
*& 将工作区赋值给内表,使用APPEND语句
*&---------------------------------------------------------------------*
APPEND ls_eord TO lt_eord. "将上面工作区ls_eord内容赋值给内表lt_eord
*&---------------------------------------------------------------------*
*& 货源清单初始化
*&---------------------------------------------------------------------*
CALL FUNCTION 'ME_INITIALIZE_SOURCE_LIST'. "货源清单初始化
*&---------------------------------------------------------------------*
*& 内表lt_eord赋值之后,就可以调用货源清单BAPI写入参数了(入参)
*&---------------------------------------------------------------------* .
CALL FUNCTION 'ME_DIRECT_INPUT_SOURCE_LIST'
EXPORTING
i_matnr = lv_matnr
i_werks = lv_werks
* I_MT06E =
* I_NO_MATERIAL_READ =
* ACTIVITY = 'V'
* I_VORGA =
* I_LOGSY =
TABLES
t_eord = lt_eord
EXCEPTIONS
plant_missing = 1
material_missing = 2
error_message = 99
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO e_return-message.
RETURN.
ELSE.
*&---------------------------------------------------------------------*
*& 调用ME_POST_SOURCE_LIST_NEW
*&---------------------------------------------------------------------*
CALL FUNCTION 'ME_POST_SOURCE_LIST_NEW'
EXPORTING
i_matnr = lv_matnr
* O_MATNR =
.
*&---------------------------------------------------------------------*
*& 调用BAPI_TRANSACTION_COMMIT
*&---------------------------------------------------------------------*
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
* IMPORTING
* RETURN =
.
MESSAGE '货源清单创建成功!' TYPE 'S'.
ENDIF.
注意:以上代码亲测有效, 可以直接粘贴作为测试之用。
也可以SE37通过BAPI测试创建。
6 BAPI执行测试
入参输入:
T_EORD-KZ = ‘X'.
点击 执行 按钮,采购货源清单是不能直接被创建,需要使用到SE37的测试序列。
7 BAPI测试序列
关于SE37的测试序列,详见:SAP BAPI-SE37测试-执行-测试序列(BAPI执行完毕后数据并没有写入后台表,如何用COMMIT BAPI写入后台表?)-优快云博客
前提条件:提前把BAPI入参数据存入测试数据中,方便使用。
1处,点击 功能模块
2处,点击 执行
3处,点击 测试序列 弹窗
4处,BAPI: ME_DIRECT_INPUT_SOURCE_LIST
5处,BAPI: ME_POST_SOURCE_LIST_NEW
6处,BAPI: BAPI_TRANSACTION_COMMIT
执行第1个BAPI
按 执行 按钮
按 返回 键,回到第2个BAPI继续执行
执行第2个BAPI
按 执行 按钮
按 返回 键,回到第3个BAPI继续执行
执行第3个BAPI
按 执行 按钮
8 前台事务码ME03查看
BAPI创建后的数据已经在前台正常显示。
9 后台表EORD
BAPI创建的采购货源清单已经存后台表。
Done.
Created on 9th January, 2024