ABAP OOALV 学习笔记

目录

一、OOALV开发步骤

定义数据对象

定义事件处理类

初始化与显示

数据处理与交互

二、避坑


一、OOALV开发步骤

在进行下面的步骤之前,需要先创建一个屏幕Screen 100(SE51),然后画一个

Custom Control (自定义控件),命名为 GS_CON,然后在逻辑流中取消那两个注释,并双击创建

  1. 定义数据对象

    " 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.
  2. 定义事件处理类

    " --- 定义---
    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.
  3. 初始化与显示

    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.
  4. 数据处理与交互

    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?没写的话,用户改的数据保存不下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值