OO SALV可以不创建屏幕就生成grid报表,但是不提供编辑的功能,但是可以通过分配容器来调用cl_gui_alv_grid修改成编辑模式。
REPORT ztestlian_salv.
TYPE-POOLS: slis.
TYPES:BEGIN OF ts_spfli.
INCLUDE TYPE spfli.
TYPES: t_color TYPE lvc_t_scol,
END OF ts_spfli.
DATA: lt_spfli TYPE TABLE OF ts_spfli,
ls_spfli LIKE LINE OF lt_spfli.
DATA: a_oref TYPE REF TO cx_salv_msg.
DATA: lo_table TYPE REF TO cl_salv_table,
lo_functions TYPE REF TO cl_salv_functions_list.
*----------------------------------------------------------------------*
* CLASS cl_handle DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_handle DEFINITION.
PUBLIC SECTION.
METHODS: handle_hotspot_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column.
ENDCLASS. "cl_handle DEFINITION
*----------------------------------------------------------------------*
* CLASS cl_handle IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_handle IMPLEMENTATION.
METHOD handle_hotspot_click.
READ TABLE lt_spfli INTO ls_spfli INDEX row.
MESSAGE i000(ys) WITH 'Hotspot in line' row.
ENDMETHOD. "handle_hotspot_click
ENDCLASS. "cl_handle IMPLEMENTATION
DATA: lo_handle TYPE REF TO cl_handle.
START-OF-SELECTION.
SELECT * FROM spfli UP TO 10 ROWS INTO CORRESPONDING FIELDS OF TABLE lt_spfli.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = lo_table " Basis Class Simple ALV Tables
CHANGING
t_table = lt_spfli ).
lo_functions = lo_table->get_functions( ).
lo_functions->set_default( abap_true ).
* lo_table->set_screen_status(
* EXPORTING
* report = sy-repid " ABAP Program: Current Main Program
* pfstatus = 'SALV_STANDARD'" Screens, Current GUI Status
* set_functions = lo_table->c_functions_all ).
DATA: lo_layout TYPE REF TO cl_salv_layout,
lf_variant TYPE slis_vari,
ls_key TYPE salv_s_layout_key.
lo_layout = lo_table->get_layout( ).
ls_key-report = sy-repid.
lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
lf_variant = 'DEFAULT'.
lo_layout->set_initial_layout( value = lf_variant ).
******************top_of_page***********************
DATA: lo_header TYPE REF TO cl_salv_form_layout_grid,
lo_h_label TYPE REF TO cl_salv_form_label,
lo_h_flow TYPE REF TO cl_salv_form_layout_flow.
CREATE OBJECT lo_header.
lo_h_label = lo_header->create_label( row = 1 column = 1 ).
lo_h_label->set_text( 'Header in Bold' ).
lo_h_flow = lo_header->create_flow( row = 2 column = 1 ).
lo_h_flow->create_text( text = 'This is text of flow' ).
lo_h_flow = lo_header->create_flow( row = 3 column = 1 ).
lo_h_flow->create_text( text = 'Number of records is the output' ).
lo_h_flow = lo_header->create_flow( row = 3 column = 2 ).
lo_h_flow->create_text( text = '10' ).
lo_table->set_top_of_list( lo_header ).
lo_table->set_top_of_list_print( lo_header ).
******************top_of_page***********************
******************end_of_page***********************
DATA: lo_footer TYPE REF TO cl_salv_form_layout_grid,
lo_f_label TYPE REF TO cl_salv_form_label,
lo_f_flow TYPE REF TO cl_salv_form_layout_flow.
CREATE OBJECT lo_footer.
lo_f_label = lo_footer->create_label( row = 1 column = 1 ).
lo_f_label->set_text( 'Footer .. here it goes' ).
lo_f_flow = lo_footer->create_flow( row = 2 column = 1 ).
lo_f_flow->create_text( text = 'This is text of flow in footer' ).
lo_f_flow = lo_footer->create_flow( row = 3 column = 1 ).
lo_f_flow->create_text( text = 'Footer number' ).
lo_f_flow = lo_footer->create_flow( row = 3 column = 2 ).
lo_f_flow->create_text( text = '1' ).
lo_table->set_end_of_list( lo_footer ).
lo_table->set_end_of_list_print( lo_footer ).
******************end_of_page***********************
******************全局控制***********************
DATA: lo_set TYPE REF TO cl_salv_display_settings.
lo_set = lo_table->get_display_settings( ).
lo_set->set_striped_pattern( value = cl_salv_display_settings=>true ). "alv的斑馬格顯示
lo_set->set_list_header( 'ALV Header' ).
******************全局控制***********************
******************設置fieldcat的名稱以及自動優化列寬***********************
DATA: lo_columns TYPE REF TO cl_salv_columns,
lo_column TYPE REF TO cl_salv_column_table.
lo_columns = lo_table->get_columns( ).
lo_columns->set_optimize( abap_true ).
DEFINE set_head_text.
lo_column ?= lo_columns->get_column( &1 ).
lo_column->set_short_text( &2 ).
lo_column->set_medium_text( &3 ).
lo_column->set_long_text( &4 ).
END-OF-DEFINITION.
set_head_text 'CARRID' 'TEST1' 'TEST1' 'TEST1'.
******************設置fieldcat的名稱以及自動優化列寬***********************
******************設置hotspot事件***********************
DATA: lr_column TYPE REF TO cl_salv_columns_table.
lr_column = lo_table->get_columns( ).
lo_column ?= lr_column->get_column( 'CARRID' ).
lo_column->set_cell_type( EXPORTING value = if_salv_c_cell_type=>hotspot ).
DATA:lo_events TYPE REF TO cl_salv_events_table.
lo_events = lo_table->get_event( ).
IF lo_handle IS INITIAL.
CREATE OBJECT lo_handle.
ENDIF.
IF lo_handle IS NOT INITIAL.
SET HANDLER lo_handle->handle_hotspot_click FOR lo_events.
ENDIF.
******************設置hotspot事件***********************
******************顏色的設定***********************
DATA: ls_s_color TYPE lvc_s_scol,
lt_s_color TYPE lvc_t_scol.
LOOP AT lt_spfli INTO ls_spfli.
IF sy-tabix = 5.
ls_s_color-fname = 'CONNID'.
ls_s_color-color-col = 7.
ls_s_color-color-int = 1.
ls_s_color-color-inv = 1.
APPEND ls_s_color TO lt_s_color.
ls_spfli-t_color = lt_s_color.
CLEAR:lt_s_color,ls_s_color.
MODIFY lt_spfli FROM ls_spfli.
ENDIF.
IF sy-tabix = 8.
ls_s_color-color-col = 7.
ls_s_color-color-int = 1.
ls_s_color-color-inv = 1.
APPEND ls_s_color TO lt_s_color.
ls_spfli-t_color = lt_s_color.
CLEAR:lt_s_color,ls_s_color.
MODIFY lt_spfli FROM ls_spfli.
ENDIF.
ENDLOOP.
DATA:ls_color TYPE lvc_s_colo.
lo_column ?= lr_column->get_column( columnname = 'CITYTO' ).
ls_color-col = 7.
lo_column->set_color( ls_color ).
lr_column->set_color_column( 'T_COLOR' ).
******************顏色的設定***********************
******************隱藏的設定***********************
DATA: lo_column2 TYPE REF TO cl_salv_column.
lo_column2 = lo_columns->get_column( 'ARRTIME' ).
lo_column2->set_visible( value = if_salv_c_bool_sap=>false ).
******************隱藏的設定***********************
******************數字的合計,平均***********************
DATA: lo_aggrs type ref to cl_salv_aggregations.
lo_aggrs = lo_table->get_aggregations( ).
lo_aggrs->add_aggregation(
EXPORTING
columnname = 'DISTANCE' " ALV Control: Field Name of Internal Table Field
aggregation = if_salv_c_aggregation=>total ).
lo_aggrs->set_aggregation_before_items( ' ' ).
******************數字的合計,平均***********************
******************數字的排序和小計***********************
data: lo_sort type ref to cl_salv_sorts.
lo_sort = lo_table->get_sorts( ).
lo_sort->add_sort(
EXPORTING
columnname = 'CARRID'" ALV Control: Field Name of Internal Table Field
subtotal = IF_SALV_C_BOOL_SAP=>true ).
******************數字的排序和小計***********************
lo_table->display( ).
CATCH cx_salv_msg INTO a_oref.
ENDTRY.