SAP ABAP OOALV常用的方法

本文详述了ABAP中OOALV的实操应用,重点介绍了CL_GUI_ALV_GRID类的使用方法,包括单元格改变事件、工具栏按钮添加、用户命令响应及双击事件处理等关键操作。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

OOALV常用的方法在类 CL_GUI_ALV_GRID 中,在这里主要举例我最常用的几种方法。
1.DATA_CHANGED,单元格已经改变了,获取哪个单元格改变了。
2.TOOLBAR ,在工具栏增加按钮。
3.USER_COMMAND,按钮事件,点了什么按钮,触发什么功能。
4.DOUBLE_CLICK,双击事件。

贴上代码演示如何使用
首先ALV调用如下


    CREATE OBJECT GS_PARENT
      EXPORTING
        CONTAINER_NAME = 'ALV'. " 界面中的一个CUNSTOMER CONTROL控件 用于存放类对象。
    "使用这个控件把名称赋值给CONTAINER_NAME

******将alv植入到容器中
    CREATE OBJECT ALV_GRID
      EXPORTING
        I_PARENT = GS_PARENT.
    PERFORM PREPARE_FIELD_CATALOG CHANGING GT_FIELDCAT.
    PERFORM PREPARE_LAYOUT        CHANGING GS_LAYOUT.
    PERFORM TOOLBAR_EXCLUDING_ITEM     CHANGING IT_TOOLBAR_EXCLUDING.  "ALV按钮排除

    CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        IS_LAYOUT            = GS_LAYOUT
        I_SAVE               = 'A'
        I_DEFAULT            = 'X'
        IS_VARIANT           = GS_VARIANT
        IT_TOOLBAR_EXCLUDING = IT_TOOLBAR_EXCLUDING
      CHANGING
        IT_OUTTAB            = GT_ITEM
        IT_FIELDCATALOG      = GT_FIELDCAT.

    CREATE OBJECT EVENT_RECEIVER. "创建事件
    SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR ALV_GRID. "双击事件
    SET HANDLER EVENT_RECEIVER->HANDLE_ONF4         FOR ALV_GRID. "F4帮助事件
    SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR      FOR ALV_GRID. "ALV状态栏
    SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR ALV_GRID. "按钮事件
    SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR ALV_GRID. "修改事件
*   gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'ZBB'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
*   CALL METHOD alv_grid->register_f4_for_fields
*     EXPORTING
*       it_f4 = gt_t_f4.

    CALL METHOD ALV_GRID->REGISTER_EDIT_EVENT "注册编辑事件,否则不会触发更新事件
      EXPORTING
        I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.


    CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
      EXPORTING
        CONTROL = ALV_GRID.
    CALL METHOD CL_GUI_CFW=>FLUSH.

OO使用的参数如下

DATA: OK_CODE LIKE SY-UCOMM.


CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.

DATA: GT_FIELDCAT          TYPE LVC_T_FCAT,
      GS_LAYOUT            TYPE LVC_S_LAYO,
      GS_VARIANT           TYPE DISVARIANT,
      GT_T_F4              TYPE LVC_T_F4,
      IT_TOOLBAR_EXCLUDING TYPE UI_FUNCTIONS.

DATA: STBL TYPE LVC_S_STBL. "鼠标游标位置
DATA: ET_FILTERED TYPE LVC_T_FIDX.
DATA: GV_CODE TYPE SY-TCODE .

DATA ALV_GRID TYPE REF TO CL_GUI_ALV_GRID. "后面要用到CL_GUI_ALV_GRID类中的方法
"SET_TABLE_FIRST_DISPLAY,这个方法基于实例存在,必须
"为这个类创建一个对象。在此处声明。
DATA GS_PARENT TYPE REF TO CL_GUI_CUSTOM_CONTAINER . "定义容器
DATA GT_SELECT TYPE LVC_T_CELL . "定義選中單元格方法參數
DATA GT_SELROW TYPE LVC_T_ROW  . "定義選中行方法參數

类定义如下


CLASS LCL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.

    METHODS HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID    "定义类中的方法---双击
      IMPORTING E_ROW E_COLUMN ES_ROW_NO.                                    "
    "                                                 "
    METHODS HANDLE_ONF4 FOR EVENT ONF4 OF CL_GUI_ALV_GRID                    "定义类中的方法---F4帮助
      IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA .                        "
    "
    METHODS HANDLE_TOOLBAR      FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID         "定义类中的方法---ALV状态栏按钮
      IMPORTING E_OBJECT E_INTERACTIVE .                                     "
    "
    METHODS HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID    "定义类中的方法---按钮触发方法
      IMPORTING E_UCOMM .                                                    "
    "
    METHODS HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID    "定义类中的方法---数据被修改后方法
      IMPORTING ER_DATA_CHANGED E_ONF4 E_ONF4_BEFORE E_ONF4_AFTER E_UCOMM.   "
ENDCLASS. "LCL_EVENT_RECEIVER

类实现如下


CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.

  METHOD HANDLE_DOUBLE_CLICK.
  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK双击后触发该段代码,可接T-CODE跳转等功能

  METHOD HANDLE_ONF4.
  ENDMETHOD.                    "需在ALV中调用触发一般与filedcat中的 f4availabl 参数同用

  METHOD HANDLE_TOOLBAR.    "在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法

*    DATA: LS_TOOLBAR        TYPE STB_BUTTON.
*    CLEAR LS_TOOLBAR.
*    MOVE 3                  TO LS_TOOLBAR-BUTN_TYPE.      "分隔符
*    APPEND LS_TOOLBAR       TO E_OBJECT->MT_TOOLBAR.
*
*    CLEAR LS_TOOLBAR.
*    MOVE 'ADD'            TO LS_TOOLBAR-FUNCTION.        "功能码
*    MOVE ICON_INSERT_ROW  TO LS_TOOLBAR-ICON.            "图标
*    MOVE '插入行'         TO LS_TOOLBAR-QUICKINFO.
*    MOVE '插入行'         TO LS_TOOLBAR-TEXT.            "显示名称
*    MOVE ' '                TO LS_TOOLBAR-DISABLED.
*    APPEND LS_TOOLBAR       TO E_OBJECT->MT_TOOLBAR.
*
*    CLEAR LS_TOOLBAR.
*    MOVE 'DEL'            TO LS_TOOLBAR-FUNCTION.        "功能码
*    MOVE ICON_DELETE_ROW  TO LS_TOOLBAR-ICON.            "图标
*    MOVE '刪除行'         TO LS_TOOLBAR-QUICKINFO.
*    MOVE '刪除行'         TO LS_TOOLBAR-TEXT.            "显示名称
*    MOVE ' '                TO LS_TOOLBAR-DISABLED.
*    APPEND LS_TOOLBAR       TO E_OBJECT->MT_TOOLBAR.

  ENDMETHOD.                    "在ALV状态栏增加按钮,一般是汇总按钮

  METHOD HANDLE_USER_COMMAND.
*    CASE E_UCOMM.
*      WHEN 'ADD'.
*        APPEND INITIAL LINE TO GT_ITEM .
*      WHEN 'DEL'.
*        CALL METHOD ALV_GRID->GET_SELECTED_ROWS
*          IMPORTING
*            ET_INDEX_ROWS = GT_SELROW.
*        LOOP AT GT_SELROW INTO DATA(GS_SELROW).
*          DELETE GT_ITEM[] INDEX GS_SELROW-INDEX .
*        ENDLOOP .
*      WHEN OTHERS.
*    ENDCASE.
*    CALL METHOD ALV_GRID->REFRESH_TABLE_DISPLAY
*      EXPORTING
*        IS_STABLE = STBL.
  ENDMETHOD.                    "一般与HANDLE_TOOLBAR同用

  METHOD HANDLE_DATA_CHANGED.
  ENDMETHOD.                    "数据修改后触发,一般用在数据联动修改如数量字段修改,同时联动修改金额字段


DATA_CHANGED方法如何获取到修改的值


    DATA: lv_ref TYPE c.
    CALL METHOD alv_grid->get_selected_cells
      IMPORTING
        et_cell = gt_select.
    LOOP AT GT_SELECT INTO DATA(GS_TEM).
      READ TABLE GT_ITEM INDEX GS_TEM-ROW_ID ASSIGNING FIELD-SYMBOL(<FS_TMP>) .
      IF <FS_TMP>-zjbj <> 'X' .
        <FS_TMP>-XGBJ = 'X' .
      ENDIF.
    ENDLOOP.
    CLEAR lv_ref.
    LOOP AT er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<ls_good>).
      IF <ls_good>-FIELDNAME = 'MATNR'.

以上,欢迎交流

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值