目录
一、OOALV开发步骤
在进行下面的步骤之前,需要先创建一个屏幕Screen 100(SE51),然后画一个
Custom Control (自定义控件),命名为 GS_CON,然后在逻辑流中取消那两个注释,并双击创建
-
定义数据对象
" 1. 业务数据表 (你的数据仓库) DATA: gt_outtab TYPE TABLE OF <你的结构或表名>. " 2. 核心对象 (标准套件) DATA: go_container TYPE REF TO cl_gui_custom_container, " 容器 go_grid TYPE REF TO cl_gui_alv_grid. " 表格 " 3. 配置对象 DATA: gt_fcat TYPE lvc_t_fcat, " 字段目录 (列配置) gs_layout TYPE lvc_s_layo. " 布局设置 (斑马纹等) " 4. 事件接收器 (你的自定义管家) DATA: go_event_receiver TYPE REF TO lcl_event_receiver. -
定义事件处理类
" --- 定义--- CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. " 监听 1: 工具栏加载事件 (用来加按钮) METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object. " 监听 2: 用户命令事件 (用来处理按钮点击) METHODS: handle_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. ENDCLASS. " --- 实现--- CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_toolbar. " 调用 FORM 保持代码整洁 PERFORM fm_add_toolbar_buttons USING e_object. ENDMETHOD. METHOD handle_command. " 调用 FORM 处理逻辑 PERFORM fm_process_user_command USING e_ucomm. ENDMETHOD. ENDCLASS. -
初始化与显示
MODULE init_alv OUTPUT. IF go_container IS INITIAL. " ---------------------------------------------------------- " A. 创建容器 (绑定屏幕上的物理控件) " ---------------------------------------------------------- CREATE OBJECT go_container EXPORTING container_name = '<屏幕上画的控件名_如CONT_0100>'. " ---------------------------------------------------------- " B. 创建表格 (放入容器中) " ---------------------------------------------------------- CREATE OBJECT go_grid EXPORTING i_parent = go_container. " ---------------------------------------------------------- " C. 准备配置 (字段目录 & 布局) " ---------------------------------------------------------- PERFORM prepare_field_catalog. " 设置列名、可编辑等 PERFORM prepare_layout. " 设置斑马纹、列宽自适应 " ---------------------------------------------------------- " D. ★★★ 注册事件 (最关键的一步) ★★★ " ---------------------------------------------------------- CREATE OBJECT go_event_receiver. SET HANDLER go_event_receiver->handle_toolbar FOR go_grid. SET HANDLER go_event_receiver->handle_command FOR go_grid. " ---------------------------------------------------------- " E. 首次显示 (渲染表格) " ---------------------------------------------------------- CALL METHOD go_grid->set_table_for_first_display EXPORTING is_layout = gs_layout CHANGING it_outtab = gt_outtab " 传入你的数据表 it_fieldcatalog = gt_fcat. " 传入列配置 " ---------------------------------------------------------- " F. 注册编辑回车事件 (如果表格可编辑) " ---------------------------------------------------------- CALL METHOD go_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter. ELSE. " ---------------------------------------------------------- " G. 非首次运行:直接刷新数据 " ---------------------------------------------------------- CALL METHOD go_grid->refresh_table_display. ENDIF. ENDMODULE. -
数据处理与交互
MODULE user_command INPUT. CASE ok_code. WHEN 'SAVE'. " 点击屏幕上方的标准保存按钮 " ---------------------------------------------------------- " A. 数据同步 (Sync) - 必做! " ---------------------------------------------------------- " 将屏幕上用户输入的最新内容,抓取回 gt_outtab 内表 CALL METHOD go_grid->check_changed_data. " ---------------------------------------------------------- " B. 逻辑校验 (Validate) " ---------------------------------------------------------- " 检查必输项、逻辑冲突等 PERFORM check_data_validity. " ---------------------------------------------------------- " C. 数据库操作 (Persist) " ---------------------------------------------------------- " 将 gt_outtab 的数据写入数据库 PERFORM save_to_database. ENDCASE. ENDMODULE.
二、避坑
-
容器名字对了吗?
代码里 EXPORTING container_name = 'XXX' 的名字,必须和 SE80 屏幕里画的那个框框名字完全一致(且大写)。否则程序会 Dump 或不显示。
-
Handler 绑定了吗?
有没有写 SET HANDLER ... FOR go_grid?没写的话,你写的 Class 只是摆设,按钮点了没反应。
-
数据同步了吗?
在保存逻辑 (PAI) 里,第一行是不是 check_changed_data?没写的话,用户改的数据保存不下来。
2428

被折叠的 条评论
为什么被折叠?



