W Pub: ABAP Rut ALV Demo OM

  1. REPORT zalv_om01.
  2.  
  3.  
  4. PARAMETERS p_layout type SLIS_VARI.
  5.  
  6. *--[ ################################################################
  7. *--[ Clase que se encargará de tratar los datos de la Base de Datos
  8. CLASS ZCL_ALV_DATA DEFINITION.
  9.  
  10.   PUBLIC SECTION.
  11.     DATA: puv_t_data TYPE TABLE OF spfli,   "<-- Aquí variará la tabla
  12.           puv_c_data type spfli.
  13.     METHODS:
  14.        constructor,
  15.        reload_data.
  16.  
  17. ENDCLASS.
  18.  
  19. CLASS ZCL_ALV_DATA IMPLEMENTATION.
  20.  
  21.   METHOD constructor.
  22.     me->reload_data( ).
  23.   endmethod.
  24.  
  25.   METHOD reload_data.
  26.     refresh me->puv_t_data.
  27.     SELECT carrid connid countryfr cityfrom airpfrom countryto cityto airpto distance
  28.     INTO CORRESPONDING FIELDS OF TABLE puv_t_data FROM spfli.
  29.   ENDMETHOD.
  30.  
  31. ENDCLASS.
  32.  
  33. *--[ Clase que controlará los eventos del ALV
  34. CLASS ZCL_ALV_events DEFINITION.
  35.   PUBLIC SECTION.
  36. *--[ A&ntilde;adir aquí más eventos que sean necesarios
  37.     data: puv_cl_data type REF TO ZCL_ALV_DATA.
  38.     METHODS:
  39.       on_double_click FOR EVENT double_click OF cl_salv_events_table
  40.         IMPORTING row column,
  41.       on_user_command FOR EVENT added_function OF cl_salv_events_table
  42.              IMPORTING e_salv_function,
  43.       on_link_click for event LINK_CLICK of cl_salv_events_table
  44.            IMPORTING  ROW       COLUMN.
  45. ENDCLASS.
  46.  
  47. CLASS ZCL_ALV_events IMPLEMENTATION.
  48.  
  49.   METHOD on_link_click.
  50.   endmethod.
  51.  
  52.   METHOD on_double_click.
  53. *    READ TABLE t_alv INTO wa_alv INDEX row.
  54. *    CALL FUNCTION 'xxxx'
  55. *      EXPORTING
  56. *        ebeln = wa_alv-ebeln.
  57.     BREAK-POINT.
  58.   ENDMETHOD.                    "on_double_click
  59.  
  60.   method on_user_command.
  61. *    data: row type SALV_T_ROW,
  62. *      c_row type i.
  63. *    row = puv_selections->GET_SELECTED_ROWS( ).
  64.     BREAK-POINT.
  65.   ENDMETHOD.
  66. ENDCLASS.
  67.  
  68. *--[ Clase que se encargará de pintar el ALV
  69. class ZCL_ALV DEFINITION.
  70.  
  71.   PUBLIC SECTION.
  72.     DATA:
  73.       puv_table      TYPE REF TO cl_salv_table,
  74.       PUV_LAYOUT     type ref to cl_salv_layout,
  75.       puv_sort       TYPE REF TO cl_salv_sorts,
  76.       puv_functions  TYPE REF TO cl_salv_functions,
  77.       puv_display    TYPE REF TO cl_salv_display_settings,
  78.       puv_columns    TYPE REF TO cl_salv_columns_table,
  79.       puv_column     TYPE REF TO cl_salv_column_table,
  80.       puv_color      TYPE lvc_s_colo,
  81.       puv_selections TYPE REF TO cl_salv_selections,
  82.       puv_aggrega    TYPE REF TO cl_salv_aggregations,
  83.       puv_events     TYPE REF TO cl_salv_events_table,
  84.       puv_data       type REF TO ZCL_ALV_DATA.
  85.  
  86.     METHODS:
  87.        constructor IMPORTING i_titulo type LVC_TITLE OPTIONAL
  88.                              I_LAYOUT TYPE SLIS_VARI OPTIONAL,
  89.        alv_titulo IMPORTING i_titulo type LVC_TITLE,
  90.        alv_get_columna IMPORTING i_columna type LVC_FNAME,
  91.        alv_display,
  92.        alv_set_color,
  93.        set_evento_double_click,
  94.        set_evento_link_click,
  95.        set_evento_user_command,
  96.        alv_set_pf_status IMPORTING i_report type SYREPID
  97.                                      i_pfstatus type SYPFKEY.
  98.   PRIVATE SECTION.
  99.     DATA:
  100.        PUV_KEY type salv_s_layout_key,
  101.        pvv_titulo  type LVC_TITLE,
  102.        puv_eventos type ref to ZCL_ALV_events.
  103.  
  104. ENDCLASS.
  105.  
  106. CLASS ZCL_ALV IMPLEMENTATION.
  107.  
  108.   METHOD constructor.
  109.     if not i_titulo is INITIAL.
  110.       pvv_titulo = i_titulo.
  111.     endif.
  112.     CREATE OBJECT me->puv_eventos.
  113.     CREATE OBJECT me->puv_data.
  114.  
  115.     me->PUV_EVENTOS->puv_cl_data = me->puv_data. "<-- Hacemos visibles los datos
  116.  
  117.     cl_salv_table=>factory(
  118.     IMPORTING
  119.        r_salv_table = me->puv_table
  120.     CHANGING
  121.        t_table = puv_data->puv_t_data
  122.     ).
  123.     me->puv_functions  = me->puv_table->get_functions( ).
  124.     me->puv_display    = me->puv_table->get_display_settings( ).
  125.     me->puv_columns    = me->puv_table->get_columns( ).
  126.     me->puv_sort       = me->puv_table->get_sorts( ).
  127.     ME->PUV_LAYOUT     = ME->PUV_TABLE->get_layout( ).
  128.     me->puv_aggrega    = me->puv_table->get_aggregations( ).
  129.     me->puv_selections = me->puv_table->get_selections( ).
  130. *    me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>SINGLE ).
  131. *    me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>MULTIPLE ).
  132. *    me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>CELL ).
  133.     me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>ROW_COLUMN ).
  134. *    me->puv_selections->set_selection_mode( if_salv_c_selection_mode=>NONE ).
  135. *RESTRICT_NONE
  136. *RESTRICT_USER_DEPENDANT
  137. *RESTRICT_USER_INDEPENDANT
  138.     ME->PUV_key-report = sy-repid.
  139.     ME->PUV_LAYOUT->set_key( ME->PUV_key ).
  140.     ME->PUV_LAYOUT->set_save_restriction( if_salv_c_layout=>restrict_none ).
  141.     ME->PUV_LAYOUT->set_initial_layout( I_LAYOUT ).
  142.     me->puv_events = puv_table->get_event( ).
  143.  
  144.     me->puv_functions->set_all( abap_true ).
  145.     me->puv_columns->set_optimize( abap_true ).
  146.  
  147.     if not pvv_titulo is INITIAL.
  148.       me->ALV_TITULO( pvv_titulo ).
  149.     endif.
  150.   endmethod.
  151.  
  152.   METHOD set_evento_double_click.
  153.     SET HANDLER me->puv_eventos->on_double_click FOR me->puv_events.
  154.   ENDMETHOD.
  155.  
  156.   METHOD set_evento_user_command.
  157.     SET HANDLER me->puv_eventos->on_user_command FOR me->puv_events.
  158.   ENDMETHOD.
  159.  
  160.   METHOD set_evento_link_click.
  161.     SET HANDLER me->puv_eventos->on_link_click FOR me->puv_events.
  162.   ENDMETHOD.
  163.  
  164.   METHOD alv_set_pf_status.
  165. *--[ El estatus puede ser copiado de SAPLSALV_METADATA_STATUS / SALV_TABLE_STANDARD
  166.     data: lv_i_report type SYREPID,
  167.           lv_i_pfstatus type sypfkey.
  168.  
  169.     lv_i_report = i_report.
  170.     lv_i_pfstatus = i_pfstatus.
  171.  
  172.     TRANSLATE: lv_i_report to UPPER CASE,
  173.                lv_i_pfstatus to UPPER CASE.
  174.     me->puv_table->set_screen_status(
  175.                     EXPORTING
  176.                        report        = lv_i_report"<- Nombre del Report
  177.                        pfstatus      = lv_i_pfstatus"<- Nombre del status
  178.                        set_functions = me->puv_table->c_functions_all "<- Devuelve las funciones
  179.     ).
  180.   endmethod.
  181.  
  182.   METHOD alv_display.
  183.     me->puv_table->display( ).
  184.   ENDMETHOD.
  185.  
  186.   METHOD alv_titulo.
  187.     me->puv_Display->set_list_header( i_titulo ).
  188.     me->pvv_titulo = i_titulo.
  189.   ENDMETHOD.
  190.  
  191.   METHOD Alv_get_columna.
  192.     data: lv_i_columna type LVC_FNAME.
  193.     lv_i_columna = i_columna.
  194.     TRANSLATE lv_i_columna to UPPER CASE.  "<-- Protegemos los dumps
  195.     me->puv_column ?= me->puv_columns->get_column( lv_i_columna ).
  196.   ENDMETHOD.
  197.  
  198.   METHOD alv_set_color.
  199.     me->puv_column->set_color( me->puv_color ).
  200.   ENDMETHOD.
  201.  
  202. ENDCLASS.
  203. *--[ FIN Clase a utilizar
  204. *--[ ################################################################
  205.  
  206. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
  207.   PERFORM f4_layouts USING cl_salv_layout=>restrict_none CHANGING p_layout.
  208.  
  209. FORM f4_layouts USING i_restrict TYPE salv_de_layout_restriction
  210.                 CHANGING c_layout TYPE disvariant-variant.
  211.   DATA: ls_layout TYPE salv_s_layout_info,
  212.         ls_key    TYPE salv_s_layout_key.
  213.   ls_key-report = sy-repid.
  214.   ls_layout = cl_salv_layout_service=>f4_layouts(
  215.                           s_key    = ls_key
  216.                           restrict = i_restrict ).
  217.   c_layout = ls_layout-layout.
  218. ENDFORM.                    " F4_LAYOUTS  
  219.  
  220. data: lv_zcl_alv type REF TO ZCL_ALV.
  221.  
  222. START-OF-SELECTION.
  223. *--[
  224. *--[ Ejemplo de utilización
  225. *--[
  226.   CREATE OBJECT lv_zcl_alv
  227.     EXPORTING
  228.       i_titulo = 'Título'
  229.       i_layout = p_layout.
  230.  
  231. *--[ Para el tratamiento de las columnas
  232.   lv_zcl_alv->Alv_get_columna( 'MANDT' ).
  233.   lv_zcl_alv->puv_column->set_visible(' ').
  234.   lv_zcl_alv->puv_column->SET_TECHNICAL('X').
  235.  
  236.   lv_zcl_alv->Alv_get_columna( 'CONNID' ).
  237. *0 TEXT | 5 HOTSPOT | 4 LINK | 1 CHECKBOX | 2 BUTTON | 3 PULLDWONW  
  238.   lv_zcl_alv->puv_column->set_cell_type( 5 ).
  239.   lv_zcl_alv->puv_column->set_output_length('15').
  240.   lv_zcl_alv->puv_color-col = '6'.
  241.   lv_zcl_alv->puv_color-int = '1'.
  242.   lv_zcl_alv->puv_color-inv = '0'.
  243.   lv_zcl_alv->alv_set_color( ).
  244.  
  245. *--[ El status puede ser copiado de SAPLSALV_METADATA_STATUS / SALV_TABLE_STANDARD
  246. *  lv_zcl_alv->alv_set_pf_status( EXPORTING i_report =
  247. *                                          i_pfstatus =
  248. *                              ).
  249.  
  250. *--[ Para ordernar por el campo CARRID y indicar un subtotal
  251.   lv_zcl_alv->puv_sort->add_sort( columnname = 'CARRID' subtotal = abap_true ).
  252.  
  253. *--[ Para que funcione el subtotal y las sumatorias
  254.   lv_zcl_alv->puv_aggrega->add_aggregation( 'DISTANCE' ).
  255.  
  256. *--[ Para capturar eventos
  257.   lv_zcl_alv->set_evento_double_click( ).
  258.   lv_zcl_alv->set_evento_user_command( ).
  259.   lv_zcl_alv->set_evento_link_click( ).
  260.  
  261. *--[ Mostramos el ALV
  262.   lv_zcl_alv->alv_display( ).