函数模块与 BAPI (★★★★)

函数模块与 BAPI (★★★★)

#abap #abap-modularization

概览表

概念 要点
函数组 函数模块的容器
函数模块 全局可复用的模块化单元
BAPI 用于业务对象的远程调用函数模块

函数组

函数组是函数模块的容器

  • 包含所有函数模块可访问的全局数据
  • 当调用组中任意函数模块时加载到程序上下文中
  • 每个主程序上下文中仅有一个实例
1
2
3
4
5
函数组
├── 全局数据(所有函数模块共享)
├── 函数模块 1
├── 函数模块 2
└── 函数模块 N

函数模块接口

1
2
3
4
5
6
7
8
9
10
CALL FUNCTION 'BC400_MOS_POWER'
EXPORTING
iv_base = pa_int1
iv_power = pa_int2
IMPORTING
ev_result = gv_result
EXCEPTIONS
power_value_too_high = 1
result_value_too_high = 2
OTHERS = 3.
参数标签页 方向 描述
IMPORTING 调用者 → 函数模块 输入数据
EXPORTING 函数模块 → 调用者 输出数据
CHANGING 双向 修改后的数据
TABLES 双向 表参数(已过时)
EXCEPTIONS 错误名称 传统异常处理
💡生成函数模块调用
使用从导航区域的拖放Pattern 按钮来生成 CALL FUNCTION 语句,避免输入错误。

异常处理

传统异常

1
2
3
4
5
6
7
8
CALL FUNCTION '...'
EXCEPTIONS
error1 = 1
OTHERS = 2.
CASE sy-subrc.
WHEN 0. " 成功
WHEN 1. " 处理 error1
ENDCASE.

基于类的异常

1
2
3
4
5
6
7
8
9
TRY.
CALL METHOD cl_class=>method
EXPORTING iv_param = lv_val
IMPORTING ev_result = lv_result.
CATCH cx_bc400_no_data.
WRITE '未找到数据'.
CATCH cx_bc400_no_auth.
WRITE '无授权'.
ENDTRY.

创建函数模块

  1. 在对象导航器中打开函数组
  2. 上下文菜单 → 创建 → 函数模块
  3. 使用客户命名空间的名称(Z_ 或 Y_)
  4. 维护接口(导入/导出/更改/异常标签页)
  5. 在源代码标签页实现源代码
  6. 激活并测试

BAPI(业务应用编程接口)

属性 要求
命名 BAPI_<对象>_<方法>
远程调用 必须是
用户对话 不得包含任何用户对话
异常 不得抛出 — 使用 RETURN 参数
参数类型 带有 BAPI_ 前缀的结构

标准 BAPI 方法

方法 用途
GetList 返回匹配条件的对象列表
GetDetail 返回单个对象的属性
Create/Change/Delete 增删改操作
AddItem/RemoveItem 子对象操作
⚠️BAPI 异常规则
BAPI 不得抛出异常。错误通过特殊的导出参数 RETURN 报告。

考试/测试模式

场景/关键词 答案
“BAPI 命名规范?” BAPI_<对象>_<方法>
“BAPI 可以抛出异常吗?” 不可以 — 使用 RETURN 参数
“函数组加载几次?” 每个主程序上下文一次
“如何生成函数模块调用?” 拖放或 Pattern 按钮

相关笔记