![image]()
- 创建自定义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.