cl_salv_table 增加自定义按钮,点击弹窗,双击也弹窗

image

  1. 创建自定义GUI状态
    这是最关键的一步,通常建议在SAP标准GUI状态 STANDARD_FULLSCREEN 的基础上进行复制和修改。
    事务代码:SE41
    操作路径:
    进入 SE41,选择菜单“状态” -> “复制”。
    源状态:输入程序 SAPLKKBL,状态 STANDARD_FULLSCREEN。或从函数组 SLVC_FULLSCREEN 中复制。
    目标:输入你自己的程序名和一个新的状态名(如 ZALV_STATUS),然后保存并激活。
    自定义按钮:在刚创建的状态中,你可以添加、修改或删除工具栏按钮。为你之前的“保存”功能添加一个按钮,为其分配一个功能码(Function Code),例如 ZSAVE。

*&---------------------------------------------------------------------*
*& Report ZPCYSALV_DEMO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZPCYSALV_DEMO.

"=====================================================================
" 数据定义
"=====================================================================
TYPES: BEGIN OF ty_outtab,
         carrid    TYPE sflight-carrid,   " 航线代码
         connid    TYPE sflight-connid,   " 航班编号
         fldate    TYPE sflight-fldate,   " 航班日期
         price     TYPE sflight-price,    " 价格
         currency  TYPE sflight-currency, " 货币单位
         seatsmax  TYPE sflight-seatsmax, " 最大座位数
         seatsocc  TYPE sflight-seatsocc, " 已订座位数
       END OF ty_outtab.

DATA: gt_outtab TYPE STANDARD TABLE OF ty_outtab,
      go_alv    TYPE REF TO cl_salv_table.

"=====================================================================
" 事件处理类(双击事件)
"=====================================================================
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS on_double_click
                FOR EVENT double_click OF cl_salv_events_table
                IMPORTING row column.
    METHODS: on_user_command FOR EVENT added_function OF cl_salv_events
                                IMPORTING e_salv_function. " [reference:12]
ENDCLASS.

CLASS lcl_event_handler IMPLEMENTATION.
  METHOD on_double_click.
    DATA: ls_data TYPE ty_outtab.
    READ TABLE gt_outtab INTO ls_data INDEX row.
    IF sy-subrc = 0.
      MESSAGE |您双击了第 { row } 行,列: { column },航班: { ls_data-carrid }-{ ls_data-connid }|
             TYPE 'I'.
    ENDIF.
  ENDMETHOD.
  METHOD on_user_command.
    CASE e_salv_function.
      WHEN 'ZPCY'.  " 这个功能码必须和你在 GUI Status 中定义的一致
        MESSAGE '自定义按钮被点击了!' TYPE 'I'.
        " 在这里添加你的业务逻辑
      WHEN OTHERS.
        " 其他按钮的逻辑
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

"=====================================================================
" 主程序
"=====================================================================
START-OF-SELECTION.
  PERFORM f_get_data.
  PERFORM f_display_alv.

"---------------------------------------------------------------------
" 获取数据
"---------------------------------------------------------------------
FORM f_get_data.
  SELECT carrid connid fldate price currency seatsmax seatsocc
    UP TO 50 ROWS
    FROM sflight
    INTO CORRESPONDING FIELDS OF TABLE gt_outtab.
ENDFORM.



"---------------------------------------------------------------------
" 显示 ALV
"---------------------------------------------------------------------
FORM f_display_alv.
  DATA: lo_columns   TYPE REF TO cl_salv_columns_table,
        lo_column    TYPE REF TO cl_salv_column_table,
        lo_sorts     TYPE REF TO cl_salv_sorts,
        lo_aggr      TYPE REF TO cl_salv_aggregations,
        lo_layout    TYPE REF TO cl_salv_layout,
        lo_events    TYPE REF TO cl_salv_events_table,
        lo_handler   TYPE REF TO lcl_event_handler.

  " 1. 创建 SALV 实例
  TRY.
      CALL METHOD cl_salv_table=>factory
        IMPORTING
          r_salv_table = go_alv
        CHANGING
          t_table      = gt_outtab.
    CATCH cx_salv_msg INTO DATA(lx_msg).
      MESSAGE lx_msg->get_text( ) TYPE 'E'.
  ENDTRY.

  " 2. 设置列属性
  lo_columns = go_alv->get_columns( ).
  lo_columns->set_optimize( abap_true ).  " 列宽自适应

  " 设置各列的标题
  lo_column ?= lo_columns->get_column( 'CARRID' ).
  lo_column->set_short_text( '航线' ).
  lo_column->set_medium_text( '航线代码' ).

  lo_column ?= lo_columns->get_column( 'CONNID' ).
  lo_column->set_short_text( '航班' ).
  lo_column->set_medium_text( '航班编号' ).

  lo_column ?= lo_columns->get_column( 'PRICE' ).
  lo_column->set_short_text( '价格' ).
  lo_column->set_medium_text( '机票价格' ).

  lo_column ?= lo_columns->get_column( 'SEATSOCC' ).
  lo_column->set_short_text( '已订' ).
  lo_column->set_medium_text( '已订座位' ).

  " 3. 设置排序(按航线升序)
  lo_sorts = go_alv->get_sorts( ).
  lo_sorts->add_sort(
  EXPORTING
    columnname = 'CARRID'
    sequence   = if_salv_c_sort=>sort_up ).

  " 4. 设置聚合(价格总计、已订座位总计)
  lo_aggr = go_alv->get_aggregations( ).
  lo_aggr->add_aggregation(
    EXPORTING
      columnname  = 'PRICE'
      aggregation = if_salv_c_aggregation=>total ).
  lo_aggr->add_aggregation(
    EXPORTING
      columnname  = 'SEATSOCC'
      aggregation = if_salv_c_aggregation=>total ).

  " 5. 启用标准工具栏
  go_alv->get_functions( )->set_all( abap_true ).

  " 6. 设置布局保存
  lo_layout = go_alv->get_layout( ).
  lo_layout->set_key( VALUE salv_s_layout_key( report = sy-repid ) ).
  lo_layout->set_save_restriction( cl_salv_layout=>restrict_none ).

  " 7. 注册双击事件
  lo_events = go_alv->get_event( ).
  CREATE OBJECT lo_handler.
  SET HANDLER lo_handler->on_double_click FOR lo_events.
  SET HANDLER lo_handler->on_user_command FOR lo_events.

  go_alv->set_screen_status(
    EXPORTING
      pfstatus      = 'SALV_GUI2'      " 你刚创建的 GUI Status 名称[reference:9]
      report        = sy-repid              " 当前程序名[reference:10]
      set_functions = go_alv->c_functions_all " 启用所有标准功能[reference:11]
  ).



  " 8. 显示 ALV
  go_alv->display( ).

ENDFORM.
posted @ 2026-08-07 11:52  虚拟过客之IT老男人  阅读(3)  评论(0)    收藏  举报