*&---------------------------------------------------------------------*
*& 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.
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.
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.
" 8. 显示 ALV
go_alv->display( ).
ENDFORM.