REPORT zalv_om01.
PARAMETERS p_layout type SLIS_VARI.
*--[ ################################################################
*--[ Clase que se encargará de tratar los datos de la Base de Datos
CLASS ZCL_ALV_DATA DEFINITION.
PUBLIC SECTION.
DATA: puv_t_data TYPE TABLE OF spfli, "<-- Aquí variará la tabla
puv_c_data type spfli.
METHODS:
constructor,
reload_data.
ENDCLASS.
CLASS ZCL_ALV_DATA IMPLEMENTATION.
METHOD constructor.
me->reload_data( ).
endmethod.
METHOD reload_data.
refresh me->puv_t_data.
SELECT carrid connid countryfr cityfrom airpfrom countryto cityto airpto distance
INTO CORRESPONDING FIELDS OF TABLE puv_t_data FROM spfli.
ENDMETHOD.
ENDCLASS.
*--[ Clase que controlará los eventos del ALV
CLASS ZCL_ALV_events DEFINITION.
PUBLIC SECTION.
*--[ Añadir aquí más eventos que sean necesarios
data: puv_cl_data type REF TO ZCL_ALV_DATA.
METHODS:
on_double_click FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column,
on_user_command FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function,
on_link_click for event LINK_CLICK of cl_salv_events_table
IMPORTING ROW COLUMN.
ENDCLASS.
CLASS ZCL_ALV_events IMPLEMENTATION.
METHOD on_link_click.
endmethod.
METHOD on_double_click.
* READ TABLE t_alv INTO wa_alv INDEX row.
* CALL FUNCTION 'xxxx'
* EXPORTING
* ebeln = wa_alv-ebeln.
BREAK-POINT.
ENDMETHOD. "on_double_click
method on_user_command.
* data: row type SALV_T_ROW,
* c_row type i.
* row = puv_selections->GET_SELECTED_ROWS( ).
BREAK-POINT.
ENDMETHOD.
ENDCLASS.
*--[ Clase que se encargará de pintar el ALV
class ZCL_ALV DEFINITION.
PUBLIC SECTION.
DATA:
puv_table TYPE REF TO cl_salv_table,
PUV_LAYOUT type ref to cl_salv_layout,
puv_sort TYPE REF TO cl_salv_sorts,
puv_functions TYPE REF TO cl_salv_functions,
puv_display TYPE REF TO cl_salv_display_settings,
puv_columns TYPE REF TO cl_salv_columns_table,
puv_column TYPE REF TO cl_salv_column_table,
puv_color TYPE lvc_s_colo,
puv_selections TYPE REF TO cl_salv_selections,
puv_aggrega TYPE REF TO cl_salv_aggregations,
puv_events TYPE REF TO cl_salv_events_table,
puv_data type REF TO ZCL_ALV_DATA.
METHODS:
constructor IMPORTING i_titulo type LVC_TITLE OPTIONAL
I_LAYOUT TYPE SLIS_VARI OPTIONAL,
alv_titulo IMPORTING i_titulo type LVC_TITLE,
alv_get_columna IMPORTING i_columna type LVC_FNAME,
alv_display,
alv_set_color,
set_evento_double_click,
set_evento_link_click,
set_evento_user_command,
alv_set_pf_status IMPORTING i_report type SYREPID
i_pfstatus type SYPFKEY.
PRIVATE SECTION.
DATA:
PUV_KEY type salv_s_layout_key,
pvv_titulo type LVC_TITLE,
puv_eventos type ref to ZCL_ALV_events.
ENDCLASS.
CLASS ZCL_ALV IMPLEMENTATION.
METHOD constructor.
if not i_titulo is INITIAL.
pvv_titulo = i_titulo.
endif.
CREATE OBJECT me->puv_eventos.
CREATE OBJECT me->puv_data.
me->PUV_EVENTOS->puv_cl_data = me->puv_data. "<-- Hacemos visibles los datos
cl_salv_table=>factory(
IMPORTING
r_salv_table = me->puv_table
CHANGING
t_table = puv_data->puv_t_data
).
me->puv_functions = me->puv_table->get_functions( ).
me->puv_display = me->puv_table->get_display_settings( ).
me->puv_columns = me->puv_table->get_columns( ).
me->puv_sort = me->puv_table->get_sorts( ).
ME->PUV_LAYOUT = ME->PUV_TABLE->get_layout( ).
me->puv_aggrega = me->puv_table->get_aggregations( ).
me->puv_selections = me->puv_table->get_selections( ).
* me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>SINGLE ).
* me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>MULTIPLE ).
* me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>CELL ).
me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>ROW_COLUMN ).
* me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>NONE ).
*RESTRICT_NONE
*RESTRICT_USER_DEPENDANT
*RESTRICT_USER_INDEPENDANT
ME->PUV_key-report = sy-repid.
ME->PUV_LAYOUT->set_key( ME->PUV_key ).
ME->PUV_LAYOUT->set_save_restriction( if_salv_c_layout=>restrict_none ).
ME->PUV_LAYOUT->set_initial_layout( I_LAYOUT ).
me->puv_events = puv_table->get_event( ).
me->puv_functions->set_all( abap_true ).
me->puv_columns->set_optimize( abap_true ).
if not pvv_titulo is INITIAL.
me->ALV_TITULO( pvv_titulo ).
endif.
endmethod.
METHOD set_evento_double_click.
SET HANDLER me->puv_eventos->on_double_click FOR me->puv_events.
ENDMETHOD.
METHOD set_evento_user_command.
SET HANDLER me->puv_eventos->on_user_command FOR me->puv_events.
ENDMETHOD.
METHOD set_evento_link_click.
SET HANDLER me->puv_eventos->on_link_click FOR me->puv_events.
ENDMETHOD.
METHOD alv_set_pf_status.
*--[ El estatus puede ser copiado de SAPLSALV_METADATA_STATUS / SALV_TABLE_STANDARD
data: lv_i_report type SYREPID,
lv_i_pfstatus type sypfkey.
lv_i_report = i_report.
lv_i_pfstatus = i_pfstatus.
TRANSLATE: lv_i_report to UPPER CASE,
lv_i_pfstatus to UPPER CASE.
me->puv_table->set_screen_status(
EXPORTING
report = lv_i_report"<- Nombre del Report
pfstatus = lv_i_pfstatus"<- Nombre del status
set_functions = me->puv_table->c_functions_all "<- Devuelve las funciones
).
endmethod.
METHOD alv_display.
me->puv_table->display( ).
ENDMETHOD.
METHOD alv_titulo.
me->puv_Display->set_list_header( i_titulo ).
me->pvv_titulo = i_titulo.
ENDMETHOD.
METHOD Alv_get_columna.
data: lv_i_columna type LVC_FNAME.
lv_i_columna = i_columna.
TRANSLATE lv_i_columna to UPPER CASE. "<-- Protegemos los dumps
me->puv_column ?= me->puv_columns->get_column( lv_i_columna ).
ENDMETHOD.
METHOD alv_set_color.
me->puv_column->set_color( me->puv_color ).
ENDMETHOD.
ENDCLASS.
*--[ FIN Clase a utilizar
*--[ ################################################################
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
PERFORM f4_layouts USING cl_salv_layout=>restrict_none CHANGING p_layout.
FORM f4_layouts USING i_restrict TYPE salv_de_layout_restriction
CHANGING c_layout TYPE disvariant-variant.
DATA: ls_layout TYPE salv_s_layout_info,
ls_key TYPE salv_s_layout_key.
ls_key-report = sy-repid.
ls_layout = cl_salv_layout_service=>f4_layouts(
s_key = ls_key
restrict = i_restrict ).
c_layout = ls_layout-layout.
ENDFORM. " F4_LAYOUTS
data: lv_zcl_alv type REF TO ZCL_ALV.
START-OF-SELECTION.
*--[
*--[ Ejemplo de utilización
*--[
CREATE OBJECT lv_zcl_alv
EXPORTING
i_titulo = 'Título'
i_layout = p_layout.
*--[ Para el tratamiento de las columnas
lv_zcl_alv->Alv_get_columna( 'MANDT' ).
lv_zcl_alv->puv_column->set_visible(' ').
lv_zcl_alv->puv_column->SET_TECHNICAL('X').
lv_zcl_alv->Alv_get_columna( 'CONNID' ).
*0 TEXT | 5 HOTSPOT | 4 LINK | 1 CHECKBOX | 2 BUTTON | 3 PULLDWONW
lv_zcl_alv->puv_column->set_cell_type( 5 ).
lv_zcl_alv->puv_column->set_output_length('15').
lv_zcl_alv->puv_color-col = '6'.
lv_zcl_alv->puv_color-int = '1'.
lv_zcl_alv->puv_color-inv = '0'.
lv_zcl_alv->alv_set_color( ).
*--[ El status puede ser copiado de SAPLSALV_METADATA_STATUS / SALV_TABLE_STANDARD
* lv_zcl_alv->alv_set_pf_status( EXPORTING i_report =
* i_pfstatus =
* ).
*--[ Para ordernar por el campo CARRID y indicar un subtotal
lv_zcl_alv->puv_sort->add_sort( columnname = 'CARRID' subtotal = abap_true ).
*--[ Para que funcione el subtotal y las sumatorias
lv_zcl_alv->puv_aggrega->add_aggregation( 'DISTANCE' ).
*--[ Para capturar eventos
lv_zcl_alv->set_evento_double_click( ).
lv_zcl_alv->set_evento_user_command( ).
lv_zcl_alv->set_evento_link_click( ).
*--[ Mostramos el ALV
lv_zcl_alv->alv_display( ).