ALV较为复杂的树行菜单制作

本文介绍如何使用ABAP编程语言定制ALV(应用逻辑组件)控件,包括按钮事件处理、工具栏定制、下拉菜单实现及数据变化响应等。通过具体代码示例,展示了如何构建和操作ALV表格。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 ABLES:ekko.
INCLUDE <icon>.
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_ekorg FOR ekko-ekorg.
SELECT-OPTIONS:s_aedat FOR ekko-aedat.
SELECTION-SCREEN END OF BLOCK blk.
DATA:it_ekko LIKE TABLE OF ekpo WITH HEADER LINE.
*ALV类变量定义
DATA: g_container  TYPE REF TO  cl_gui_custom_container. "容器类
DATA: g_grid  TYPE REF TO cl_gui_alv_grid,
      it_fieldcat TYPE lvc_t_fcat,
      it_exclude TYPE ui_functions,
      is_layout TYPE lvc_s_layo.
DATA: x_save,                          "for Parameter I_SAVE
      ls_layout TYPE disvariant.      "for parameter IS_VARIANT
*      f_title TYPE LVC_TITLE.  "ALV 的标题
CLASS lcl_alv_receiver DEFINITION DEFERRED.
DATA: g_alv_application TYPE REF TO lcl_alv_receiver. "按钮处理

TYPES:BEGIN OF it_ekko1,
     matnr LIKE ekpo-matnr,
     ebelp LIKE ekpo-ebelp,
     sn(6),
     END OF it_ekko1.
DATA: it_ekko_tmp TYPE SORTED TABLE OF it_ekko1
WITH  UNIQUE KEY matnr ebelp WITH HEADER LINE.

*类的定义
CLASS lcl_alv_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double                             "执行双击事件
        FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no,
    handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid  "TOOLBAR
            IMPORTING e_object e_interactive,
    handle_user_command      "执行toolbar的UCOMM
    FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,
    handle_menu_button     "下拉框
        FOR EVENT menu_button OF cl_gui_alv_grid
            IMPORTING e_object e_ucomm,
    handle_data_changed
       FOR EVENT data_changed OF cl_gui_alv_grid
           IMPORTING er_data_changed.
ENDCLASS.                    "lcl_event_receiver DEFINITION


*类的执行
CLASS lcl_alv_receiver IMPLEMENTATION.
*-----------------------------------------------------------------
  METHOD handle_double .
    MESSAGE i000(000) WITH e_row-index."双击 到行
    MESSAGE i000(000) WITH e_column-fieldname."双击 到列
*选择多行
*  call method g_top_right_grid->get_selected_rows
*    importing
*      et_index_rows = l_lt_rows.
  ENDMETHOD.                   "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
  METHOD handle_toolbar.
* ?2.In event handler method for event TOOLBAR: Append own functions
*   by using event parameter E_OBJECT.
*    DATA: ls_toolbar  TYPE stb_button.
*....................................................................
* E_OBJECT of event TOOLBAR is of type REF TO CL_ALV_EVENT_TOOLBAR_SET.
* This class has got one attribute, namly MT_TOOLBAR, which
* is a table of type TTB_BUTTON. One line of this table is
* defined by the Structure STB_BUTTON (see data deklaration above).
*

* A remark to the flag E_INTERACTIVE:
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*         'e_interactive' is set, if this event is raised due to
*         the call of 'set_toolbar_interactive' by the user.
*         You can distinguish this way if the event was raised
*         by yourself or by ALV
*         (e.g. in method 'refresh_table_display').
*         An application of this feature is still unknown... :-)
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
    DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&COL0'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = ''.
    DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
    DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
    DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
    DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
    DELETE e_object->mt_toolbar WHERE function = '&INFO'.
    DELETE e_object->mt_toolbar WHERE function = '&LOCAL&COPY_ROW'.
    DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.

*增加buttom
    DATA: mybutton TYPE stb_button.
    mybutton-function = 'BOBBUTTON'.
    mybutton-icon = icon_abap_local.
    mybutton-quickinfo = 'BOB button'.
    mybutton-butn_type = '1'.
    mybutton-disabled = ''.
    mybutton-text = '王洲按钮'.
    APPEND mybutton TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
*---------------user_command-----------------------------------*
  METHOD handle_user_command.
    CASE e_ucomm.
      WHEN 'MENU1'.
        MESSAGE 'BOB E_UCOMM' TYPE 'I'.
    ENDCASE.
  ENDMETHOD.                           "lcl_event_receiver
*-------------------------------------------------------------------
  METHOD handle_menu_button. " 下拉菜单
    CASE e_ucomm.
      WHEN 'BOBBUTTON'.
        CALL METHOD e_object->add_function
          EXPORTING
            fcode = 'MENU1'
            text  = '下拉框1'
            icon  = icon_alarm.
    ENDCASE.
  ENDMETHOD.                    "handle_menu_button
*-------------------------------------------------------------------
  METHOD handle_data_changed.
  ENDMETHOD.                    "handle_menu_button
ENDCLASS.               "lcl_ALV_event_receiver


 call screen '100'.

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
  MODULE initial. "创建ALV
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0100.


module INITIAL output.
  if G_CONTAINER is initial.
    perform CREATE_ALV. "创建ALV
  endif.
endmodule.                 " INITIAL  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  create_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form CREATE_ALV .
*定义ALV事件处理对象
  create object G_ALV_APPLICATION.
*创建容器对象
  create object G_CONTAINER
      exporting CONTAINER_NAME = 'MYCONTAINER'.
*构建ALV
  create object G_GRID
       exporting I_PARENT = G_CONTAINER.
**构建树初始化
  refresh:IT_FIELDCAT.
  clear:IT_FIELDCAT.
  IS_LAYOUT-SEL_MODE = 'A'.
*    x_save = 'A'.   "The user may save all types of a layout
*    x_save = 'X'. "a layout can only be saved as spanned one ('global')
*    x_save = space.           "no saving of a layout possible!
*    x_save = 'U'.    "a layout can only be saved as user specific one
  X_SAVE = 'U'.  "记录用户的操作

  clear LS_LAYOUT.
  LS_LAYOUT-REPORT = SY-REPID.
**
*构造结构
  perform SET_ALV_TAB.

  perform SER_DRODOWN.
**完成
  call method G_GRID->SET_TABLE_FOR_FIRST_DISPLAY
    exporting
      I_SAVE          = X_SAVE
      IS_VARIANT      = LS_LAYOUT
      IS_LAYOUT       = IS_LAYOUT
    changing
*      IT_SORT         = IT_SORT
      IT_FIELDCATALOG = IT_FIELDCAT
      IT_OUTTAB       = IT_EKKO[].
**设置TOOLBAR 在设置了自定义的按钮之后,必须要有  call method g_grid->set_toolbar_interactive.
  set handler G_ALV_APPLICATION->HANDLE_TOOLBAR for G_GRID.
  call method G_GRID->SET_TOOLBAR_INTERACTIVE.
*单元格双击
  set handler G_ALV_APPLICATION->HANDLE_DOUBLE for G_GRID.
*处理菜单事件
  set handler G_ALV_APPLICATION->HANDLE_USER_COMMAND for G_GRID.
*定义CONTXT菜单
  set handler G_ALV_APPLICATION->HANDLE_MENU_BUTTON for G_GRID.
  set handler G_ALV_APPLICATION->HANDLE_DATA_CHANGED for G_GRID.
**
**定义事件‘ENTER’
  call method G_GRID->REGISTER_EDIT_EVENT
    exporting
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
endform.                    " create_alv
*&---------------------------------------------------------------------*
*&      Form  set_alv_tab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form SET_ALV_TAB .
  data: WA_FIELDS type  LVC_S_FCAT.
  refresh IT_FIELDCAT.
  clear WA_FIELDS.

  WA_FIELDS-FIELDNAME = 'EBELN'.
  WA_FIELDS-COLTEXT = '采购订单号'.
  WA_FIELDS-EMPHASIZE = 'C410'.
*  wa_fields-hotspot = 'X'.
*  wa_fields-col_opt = 'A'.
  WA_FIELDS-EDIT = 'X'.
  WA_FIELDS-FIX_COLUMN = 'X'. "冻结列
  WA_FIELDS-F4AVAILABL = 'X'.
  WA_FIELDS-REF_TABLE = 'EKKO'.
  WA_FIELDS-REF_FIELD = 'EBELN'.
  append WA_FIELDS to IT_FIELDCAT.
  clear WA_FIELDS.

  WA_FIELDS-FIELDNAME = 'MATNR'.
  WA_FIELDS-COLTEXT = '商品'.
*  wa_fields-emphasize = 'C410'.
  WA_FIELDS-EDIT = 'X'.
  WA_FIELDS-COL_OPT = 'A'.
  WA_FIELDS-DRDN_FIELD = 'EBELP'.
  append WA_FIELDS to IT_FIELDCAT.
  clear WA_FIELDS.

  WA_FIELDS-FIELDNAME = 'WERKS'.
  WA_FIELDS-COLTEXT = '地点'.
*  wa_fields-emphasize = 'C410'.
  WA_FIELDS-EDIT = 'X'.
  WA_FIELDS-COL_OPT = 'A'.
  WA_FIELDS-DRDN_FIELD = 'EBELP'.
  append WA_FIELDS to IT_FIELDCAT.
  clear WA_FIELDS.

*  wa_fields-fieldname = 'EBELP'.
*  wa_fields-coltext = '行项目'.
**  wa_fields-emphasize = 'C410'.
*  wa_fields-edit = 'X'.
*  wa_fields-col_opt = 'A'.
*  APPEND wa_fields TO it_fieldcat.
*  CLEAR wa_fields.

endform.                    " set_alv_tab
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module USER_COMMAND_0100 input.
  data:OK_CODE type SY-UCOMM.
  OK_CODE = SY-UCOMM.
  case:OK_CODE.
    when 'BACK'.
      leave to screen 0.
    when 'EXIT'.
      leave program.
    when 'CANCEL'.
      leave to screen 0.
  endcase.
endmodule.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  SER_DRODOWN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form SER_DRODOWN .

  data: LT_DROPDOWN type LVC_T_DROP,
          LS_DROPDOWN like LVC_S_DROP.
  data: TEMP_IT type sorted table of IT_EKKO1 with  unique key MATNR EBELP with header line.
  select distinct MATNR EBELP into table IT_EKKO_TMP
  up to 100 rows
  from EKPO.

  TEMP_IT[] = IT_EKKO_TMP[].
  loop at TEMP_IT .
    LS_DROPDOWN-HANDLE = TEMP_IT-EBELP.
    LS_DROPDOWN-VALUE = TEMP_IT-MATNR.
    append LS_DROPDOWN to LT_DROPDOWN.
  endloop.
  call method G_GRID->SET_DROP_DOWN_TABLE
    exporting
      IT_DROP_DOWN = LT_DROPDOWN.


endform.                    " SER_DRODOWN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值