Simple ALV en ABAP

Les comparto una forma de hacer un ALV muy rápido que incluye varias opciones útiles.

Lo primero que tenemos que hacer es crear un reporte, en este caso lo llamaremos ZPRUEBA_ALV.

Con el reporte ya creado, hacemos un select simple como para tener datos para mostrar:

Por ejemplo:

SELECT * FROM sflight
  INTO TABLE @DATA(lt_sflight)
  UP TO 1000 ROWS.
IF sy-subrc = 0.

ENDIF.

Con lo cual nos quedaría de la siguiente forma:

Paso siguiente creamos el código que nos interesa para mostrar el ALV:

Primero declaramos los siguientes objetos:

DATA: lo_table     TYPE REF TO cl_salv_table,
      lo_functions TYPE REF TO cl_salv_functions_list,
      lo_columns   TYPE REF TO cl_salv_columns_table.

Estos objetos usan clases (las que están después de TYPE REF TO) para poder usar el ALV.

Dentro del IF que valida si encontró datos el SELECT agregamos el siguiente código:

  cl_salv_table=>factory( IMPORTING r_salv_table = lo_table
                          CHANGING t_table = lt_sflight ).

  lo_columns = lo_table->get_columns( ).
  lo_columns->set_optimize( abap_true ).
  lo_functions = lo_table->get_functions( ).
  lo_functions->set_all( ).

  lo_table->set_screen_status(
              pfstatus = 'ZSTATUS_GUI'
              report = sy-repid
              set_functions = lo_table->c_functions_all ).

  lo_table->display( ).

La clase cl_salv_table es una clase que contiene métodos relacionados a los ALV, con el método factory lo que hacemos es obtener una nueva instancia del ALV, pasando como parámetros lo_table, que es el que declaramos previamente, y los datos a mostrar (lt_sflight) que es donde guardamos el resultado del SELECT.

lo_columns = lo_table->get_columns( ). Con esta sentencia le indicamos que obtenga las columnas.

lo_columns->set_optimize( abap_true ). Con esta sentencia le indicamos que el ALV ajuste automáticamente el tamaño de las columnas.

lo_functions->set_all( ). Usamos este método para activar todas las funciones genéricas del ALV.

Con la sentencia lo_table->set_screen_status, lo que hacemos es especificarle un STATUS (que crearemos en breve).

Finalmente con el método lo_table->display( ). Mostramos el ALV.

Ahora tenemos que crear el STATUS para habilitar por ejemplo la función de bajar el ALV a una hoja de calculo (XLSX).

Para esto desde la se38 podemos hacer click en el siguiente icono para abrir el árbol de objetos:

En la ventana de objetos hacemos click derecho Create–>GUI STATUS:

Completamos la pantalla que nos aparece y le damos OK:

Nos aparecerá la siguiente pantalla:

Vamos al menu Extras–>Adjust Template:

Nos aparecerá otra ventana en donde seleccionamos “List Viewer” y le damos OK

Haciendo esto se nos completara todo lo que necesitamos, todos lo que nos resta es activar el GUI STATUS.

El código completo quedaría así:

REPORT zprueba_alv.

DATA: lo_table     TYPE REF TO cl_salv_table,
      lo_functions TYPE REF TO cl_salv_functions_list,
      lo_columns   TYPE REF TO cl_salv_columns_table.

SELECT * FROM sflight
  INTO TABLE @DATA(lt_sflight)
  UP TO 1000 ROWS.
IF sy-subrc = 0.

  cl_salv_table=>factory( IMPORTING r_salv_table = lo_table
                          CHANGING t_table = lt_sflight ).

  lo_columns = lo_table->get_columns( ).
  lo_columns->set_optimize( abap_true ).
  lo_functions = lo_table->get_functions( ).
  lo_functions->set_all( ).

  lo_table->set_screen_status(
              pfstatus = 'ZSTATUS_GUI'
              report = sy-repid
              set_functions = lo_table->c_functions_all ).

  lo_table->display( ).

ENDIF.

Finalmente si ejecutamos nuestro reporte vemos lo siguiente:

Si por ejemplo queremos bajar el listado a un archivo .XLSX, hacemos click en el siguiente botón y seleccionamos como aparece en la pantalla.

Leave a Reply