ALV Grid 与 BAdI

ALV Grid 与 BAdI (★★)

#abap-objects #global-class #alv-grid #badi

概览表

项目 关键点
ALV Grid Control 使用全局类 CL_GUI_ALV_GRID 显示表格数据
事件处理 处理 ALV Grid 的事件(如双击)
BAdI 基于接口的增强技术

ALV Grid Control

ALV Grid 是 SAP 提供的全局类的典型应用示例:

核心类

用途
CL_GUI_ALV_GRID ALV Grid 控件
CL_GUI_CUSTOM_CONTAINER 自定义容器

使用步骤

1
2
3
4
5
6
1. 创建屏幕 (Screen) 和容器区域
2. 创建 CL_GUI_CUSTOM_CONTAINER 实例
3. 创建 CL_GUI_ALV_GRID 实例(传入容器)
4. 准备字段目录 (Field Catalog) 和数据表
5. 调用 set_table_for_first_display( )
6. 处理交互事件(如双击)

基本代码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DATA: go_container TYPE REF TO cl_gui_custom_container,
go_grid TYPE REF TO cl_gui_alv_grid.

" PBO 模块中
IF go_container IS NOT BOUND.
CREATE OBJECT go_container
EXPORTING container_name = 'CC_ALV'.

CREATE OBJECT go_grid
EXPORTING i_parent = go_container.

go_grid->set_table_for_first_display(
EXPORTING i_structure_name = 'SFLIGHT'
CHANGING it_outtab = gt_flights ).
ENDIF.

处理 ALV 事件(双击示例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS: on_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
ENDCLASS.

CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_double_click.
" 处理双击事件
READ TABLE gt_flights INTO DATA(ls_flight) INDEX e_row-index.
MESSAGE s000(oo) WITH 'Selected:' ls_flight-carrid.
ENDMETHOD.
ENDCLASS.

" 注册事件处理
DATA: go_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT go_handler.
SET HANDLER go_handler->on_double_click FOR go_grid.

BAdI (Business Add-In) 技术

BAdI 是基于接口的增强技术:

BAdI 的核心概念

1
2
3
4
5
6
SAP定义接口 (ZIF_BADI_<name>)

├── SAP标准实现(可选)

└── 客户实现 (ZCL_BADI_IMPL)
└── 实现接口方法

BAdI 与普通接口的区别

特性 普通接口 BAdI
定义者 开发者 SAP或开发者
实现者 同一开发者 可能是不同的团队
发现机制 直接引用 通过BAdI Spot查找
多实现 一个类一个实现 可能有多个实现

使用BAdI的步骤

  1. 定义 BAdI 接口(在 Class Builder 中使用 BAdI Builder)
  2. 在程序中获取BAdI实例:GET BADI lo_badi.
  3. 调用BAdI方法:CALL BADI lo_badi->method.
  4. 创建实现类(增强实施)

考试/测试模式

场景/关键词 答案
“ALV Grid的核心类” CL_GUI_ALV_GRID
“ALV事件处理” 定义处理器类 + SET HANDLER FOR go_grid
“BAdI基于什么” 接口
“BAdI vs 普通接口” BAdI支持多实现和动态发现