ALV Complejo con Sentencias SAP 7.50

Hoy os mostraremos cómo montar un ALV complejo con sentencias SAP 7.50.

La base es la misma que para crear un ALV, solo que a la hora de preparar el Listado (después de la selección de datos y el tratamiento de datos) se debe de utilizar la clase CL_SALV_TABLE.

La clases por si sola es capaz de montar el catálogo de campos, la disposición de salida o alterar la botonera del Listado (añadiendo o quitando botones), controlar  los eventos…etc… podemos ver las opciones revisando los métodos  de la clase.

Una vez tengamos la tabla interna con los datos que queremos mostrar, usaremos el método Factory de la siguiente forma (donde i_alv2 es la tabla interna con los datos que queremos mostrar en el ALV):

  cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv_display)
                          CHANGING t_table = i_alv2 ).

 Con el Nuevo formato de creación de variables de SAP 7.50 “lo_alv_display” es una Variable que se creará con el mismo tipo y formato que devuelve el método por el campo “r_salv_table”, además que el objeto lo_alv_display estará se creará ya preparado con el Cátalogo de campos igual que al tipo estructura de la tabla interna I_ALV2. Se puede decir que con esa llamada el ALV está prácticamente montado y preparado para sacar la información por pantalla.

Para alterar la visualización del Listado tenemos que utilizar los métodos de la clase que necesitamos, por el nombre que tienen es bastante intuitivo:

Para modificar el layout:

  CALL METHOD lo_alv_display->GET_LAYOUT
    RECEIVING
      value = DATA(lo_layout_list).

Se crea un objeto hijo de tipo CL_SALV_MODEL_LIST con el que podemos alterar el layout.

Se pueden usar todos los métodos de la clase para alterar la visualización, añadiendo textos de cabecera, a pie de página, el estilo de la ventana y todas las opciones para un ALV normal.

Para modificar la botonera:

De la misma forma que para el layout, se crea un objeto hijo para acceder a las opciones de la botonera del ALV.

  CALL METHOD lo_alv_display->get_functions
    RECEIVING
      value = DATA(lo_functions_list).

De esta forma se crea un objeto hijo(lo_functions_list de tipo CL_SALV_FUNCTIONS_LIST) del Objeto lo_alv_display  con los métodos y parámetros necesarios para modificar la botonera:

Por ejemplo:

Para poner los botones standard de cualquier ALV por defecto

CALL METHOD lo_functions_list->set_default.

Para que sea Visible y usable el botón para descargar a  fichero Local:

CALL METHOD lo_functions_list->SET_EXPORT_LOCALFILE EXPORTING VALUE = ‘X’.

Para hacer visibles y usables todos los botones disponibles:

CALL METHOD lo_functions_list->SET_ALL EXPORTING VALUE = ‘X’.

*Estos cambios ya se harán efectivos en el ALV principal ya que el objeto lo_functions_list es hijo de lo_alv_display.

Podemos ver todas las opciones disponibles en los métodos de la clase CL_SALV_FUNCTIONS_LIST:

Todas estas opciones se pueden activar llamando al método pasándoles una X o un espacio.

De la misma forma podemos alterar todos los elementos del ALV utilizando los GETs de la clase principal:

Y así usando los métodos de las Clases HIJAS, la clase de los SORTS, de EVENTOS, de FILTRO…

Para el USER COMMAND y otros eventos típicos de los ALVs habría que hacerlo por objetos montando nuestra clase local como un en un ALV OO (Ver plantilla ALV por OBJETOS):

Objeto para la clase local:

data: gr_events type ref to lcl_handle_events.

*———————————————————————*
*       CLASS lcl_handle_events DEFINITION
*———————————————————————*
* definición de clase local para controlar los eventos de ALV HANA
*———————————————————————*
class lcl_handle_events definition.
  public section.
    methods:
      on_user_command for event added_function of cl_salv_events
        importing e_salv_function,

      on_before_salv_function for event before_salv_function of cl_salv_events
        importing e_salv_function,

      on_after_salv_function for event after_salv_function of cl_salv_events
        importing e_salv_function,

      on_double_click for event double_click of cl_salv_events_table
        importing row column,


      on_link_click for event link_click of cl_salv_events_table
        importing row column.
endclass.                    «lcl_handle_events DEFINITION

Luego en la definición de los métodos on_user_command y demás podemos implementar el código que queramos para hacer los controles necesarios que queramos como en un ALV OO.

Para poder enlazar la clase local con el ALV bastaría con usar el método GET_EVENT:

 CALL METHOD lo_alv_display->get_event
    RECEIVING
      value = DATA(lo_event).

La operativa es la misma, se acaba de crear un objeto de tipo CL_SALV_EVENTS, cuyos métodos pueden unir la el objeto del ALV con nuestra clase local  lcl_handle_events:

create object gr_events.

Con esto ya podemos unir nuestra clase local con el ALV:

*…  USER_COMMAND
  set handler gr_events->on_user_command for lo_event.
*… BEFORE_SALV_FUNCTION
  set handler gr_events->on_before_salv_function for lo_event.
*…  AFTER_SALV_FUNCTION
  set handler gr_events->on_after_salv_function for lo_event.
*…  DOUBLE_CLICK
  set handler gr_events->on_double_click for lo_event.
*…  LINK_CLICK
  set handler gr_events->on_link_click for lo_event.

Finalmente para mostrar el ALV cuando ya esté todo como queremos simplemente hay que llamar al método de la clase Principal para que lo muestre:

lo_alv_display->display( ).

Esperamos que os haya gustado este tutorial de ALV Complejo con Sentencias SAP 7.50.

Tenéis más post de ALV en el siguiente enlace.