SAP BAPI教程 – 如何在ABAP中创建BAPI
⚡ 智能摘要
BAPI SAP ABAP 是一种标准化的、支持 RFC 的业务对象方法,它允许外部应用程序访问 R/3 流程和数据。本页解释了标准化的 BAPI,以及如何在 SWO1 中创建、测试、发布 BAPI,以及如何从 ABAP 调用 BAPI。

什么是 BAPI?
业务应用程序编程接口 (BAPI) 是标准化的编程接口(方法),使外部应用程序能够访问 R/3 系统中的业务流程和数据。
他们 提供稳定、标准化的方法 实现R/3系统与外部应用程序、遗留系统和附加组件的无缝集成。
BAPI 定义在 BOR(业务对象存储库) 作为方法 SAP 执行特定业务功能的业务对象类型。它们以如下方式实现: RFC 启用功能 模块是在 ABAP 工作台的函数生成器中创建的。
一些 BAPI 和方法提供了基本功能,可用于大多数 SAP 业务对象。这些被称为 标准化 BAPI。
标准化 BAPI 列表:
- 用于读取数据的 BAPI - GetList()、GetDetail()、GetStatus()、ExistenceCheck()
- 用于创建或更改数据的 BAPI-Create()、Change()、Delete() 和 Undelete(),
- 用于批量处理的 BAPI -ChangeMultiple()、CreateMultiple()、DeleteMultiple()。
BAPI的优势
BAPI 比基于屏幕的技术更受欢迎,因为它是一个有文档记录、已发布的接口。 SAP 在不同版本中保持稳定。这带来了诸多实际好处。
- 稳定的界面: 已发布的 BAPI 的签名在升级时不会改变,因此调用程序可以继续工作。
- 业务逻辑重用: BAPI 运行与事务相同的验证,因此通过它添加的数据保持一致。
- 远程功能已启用: 由于 BAPI 是支持 RFC 的函数模块,因此可以从其他模块调用它。 SAP 系统,一个 Java 或者 .NET 程序,或者 Web 服务。
- 无需屏幕依赖: 与批量输入录制不同,BAPI 在屏幕布局更改时不会中断。
明确了概念及其优点之后,下一节将逐步构建 BAPI。
如何创建 BAPI
步骤1) 转到事务 swo1(工具->业务框架-> BAPI 开发->业务对象生成器)。根据创建 BAPI 的功能需求选择业务对象。
步骤2) 以更改模式打开业务对象。然后选择实用程序->API 方法->添加方法。然后输入功能模块的名称并选择继续。
步骤3) 在下一个对话框中,需要指定以下信息:
- 方法:为该方法建议一个合适的名称,
- 文本:输入 BAPI 的描述,
- 单选按钮:对话框, Sync同步的,与实例无关的。BAPI 通常以同步方式实现。
步骤4) 要创建该方法,请在下一个对话框中选择“是”。
步骤5) 程序生成并执行后,在刚刚创建的方法中检查程序。这样,一个BAPI就创建好了。
测试 BAPI
您可以通过以下方式测试 BAPI 测试与验证 业务对象构建器中业务对象的单独方法。(或者可以使用事务“SWUD”来测试该方法)。
发布和冻结 BAPI
- 要发布BAPI,首先要发布功能模块(使用事务se37)。
- 在业务对象生成器中将方法的状态设置为“已发布”(使用事务 SWo1 - 编辑->更改状态->已发布。)
您还可以使用 BAPI Explorer(事务代码 BAPI)全面查看 BAPI
如何在ABAP中调用BAPI
BAPI 的调用方式与任何启用 RFC 的函数模块相同。需要注意的是,BAPI 本身不会发出 COMMIT WORK 指令,因此调用者必须使用 BAPI_TRANSACTION_COMMIT 确认更改,或者使用 BAPI_TRANSACTION_ROLLBACK 放弃更改。以下示例使用标准 BAPI 创建销售订单。
DATA: ls_header TYPE bapisdhd1, lt_items TYPE STANDARD TABLE OF bapisditm, lt_return TYPE STANDARD TABLE OF bapiret2, lv_order TYPE vbeln. * Fill the header and item structures, then call the BAPI CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2' EXPORTING order_header_in = ls_header IMPORTING salesdocument = lv_order TABLES order_items_in = lt_items return = lt_return. * A BAPI does not commit on its own - decide based on the return table READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF.
⚠️警告: 提交之前,务必检查 RETURN 表中是否存在 E 或 A 类型的消息。在发生错误后调用 BAPI_TRANSACTION_COMMIT 会保存不完整的文档,这是 BAPI 中最常见的错误之一。
BAPI 对阵 BDC 对阵 RFC
一个 BAPI,一个 BDC的,而普通的 RFC 也将数据移入 SAP但它们在稳定性以及可重复利用的材料方面有所不同。下表对它们进行了比较。
| 标准 | 商业应用程序接口 | BDC的 | RFC(自定义) |
|---|---|---|---|
| 接口 | 业务对象的已发布方法 | 交易的屏幕顺序 | 任何自定义功能模块 |
| 升级稳定性 | 已发布 BAPI 的保证 | 屏幕变化时会中断 | 取决于开发者 |
| 远程启用 | 是 | 没有 | 是 |
| 业务验证 | 完整,与交易相同 | 完整版,运行实际屏幕。 | 只有开发者编写的代码。 |
| 最适合 | 稳定的集成和接口 | 加载不存在 BAPI 的地方 | 定制点对点服务 |
经验法则是,只要有已发布的 BAPI,就使用已发布的 BAPI;如果没有,就回退到 BDC;并将自定义 RFC 保留给定制服务。





