函数模块与 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.
|
创建函数模块
- 在对象导航器中打开函数组
- 上下文菜单 → 创建 → 函数模块
- 使用客户命名空间的名称(Z_ 或 Y_)
- 维护接口(导入/导出/更改/异常标签页)
- 在源代码标签页实现源代码
- 激活并测试
BAPI(业务应用编程接口)
| 属性 |
要求 |
| 命名 |
BAPI_<对象>_<方法> |
| 远程调用 |
必须是 |
| 用户对话 |
不得包含任何用户对话 |
| 异常 |
不得抛出 — 使用 RETURN 参数 |
| 参数类型 |
带有 BAPI_ 前缀的结构 |
标准 BAPI 方法
| 方法 |
用途 |
| GetList |
返回匹配条件的对象列表 |
| GetDetail |
返回单个对象的属性 |
| Create/Change/Delete |
增删改操作 |
| AddItem/RemoveItem |
子对象操作 |
BAPI 不得抛出异常。错误通过特殊的导出参数 RETURN 报告。
考试/测试模式
| 场景/关键词 |
答案 |
| “BAPI 命名规范?” |
BAPI_<对象>_<方法> |
| “BAPI 可以抛出异常吗?” |
不可以 — 使用 RETURN 参数 |
| “函数组加载几次?” |
每个主程序上下文一次 |
| “如何生成函数模块调用?” |
拖放或 Pattern 按钮 |
相关笔记