viernes, 5 de marzo de 2010

CL_GUI_ALV_GRID versus CL_SALV_TABLE

Tenemos dos opciones diferentes para construir ALV:

1. La antigua ALV Object Method, basada en la clase global cl_gui_alv_grid, y
2. la nueva ALV Object Model, basada en la clase cl_salv_table .

Bien, en este artículo resumiré los pasos para crear ambos ALV, y así podremos ver las similitudes y diferencias entre ambos ALV.

Comenzamos con el antiguo:

CL_GUI_ALV_GRID

En este caso el proceso para generar un ALV paso a paso sería el siguiente:

Paso previo: Reservar un área de la pantalla (usando el Screen Painter) con un contenedor, el contenedor lo dibujaremos con el Custom Control Area.

1. En nuestro programa, declaramos una variable de referencia a la clase contenedor cl_gui_custom_container.

2. Instanciamos un objeto de la clase contenedor.

3. Enlazamos el objeto/instancia al área reservada en la pantalla mediante el parámetro container-name de la instancia recién creada.

4. Declaramos una variable de referencia a la clase cl_gui_alv_grid.

5. Creamos un instancia de la clase anterior y se hace referencia al objeto container creado en el paso 2. Para ello usamos el parámetro i_parent.

6. Pasamos los datos para mostrar en pantalla en las casillas del ALV. Los datos se pasan con una tabla interna al método de la clase alv: set_table_for_first_display.

7. Opcionalmente, indicamos el catálogo de campos para los campos del ALV, asignando una tabla, estructura o vista en el parámetro i_structure_name.

8. Opcionalmente, podemos indicar el layout para especificar la conformación del ALV.

Bien, estos son los pasos mínimos necesarios para crear el ALV, aquí podemos ver un ejemplo:

DATA:
t_mara TYPE TABLE OF mara,
mi_layout TYPE lvs_s_layo,
mi_alv_grid TYPE REF TO cl_gui_alv_grid,
mi_contenedor TYPE REF TO cl_gui_custom_container.

IF mi_contenedor IS NOT BOUND.
CREATE OBJECT mi_contenedor
EXPORTING
container_name ='nombre_contenedor_screen_painter'.
CREATE OBJECT mi_alv_grid
EXPORTING
i_parent = mi_contedor.
ENDIF.

CALL METHOD mi_alv_grid -> set_table_for_first_display
EXPORTING
i_structure_name = 'MARA'
is_layout = mi_layout
CHANGING
it_outtab = t_mara.

Si quisiéramos visualizar este ALV en pantalla completa, entonces no reservaríamos un area de control en la pantalla y no crearíamos un control contenedor, en cambio, tendríamos que asignar un valor estático a la parámetro export i_parent, de la siguiente manera:
i_parent = cl_gui_custom_container => screen0.

También tendríamos que manejar los eventos, como por ejemplo un double-click, print_top_of_list, etc., la clase cl_gui_alv_grid tiene 32 eventos.
Para manejar los eventos, seguimos los siguientes pasos:

1. Creamos una clase local para incluir los métodos manejadores de eventos
2. Definimos en la clase, el método 'manejador' por el evento que necesitemos (por ejemplo, para el doble-clic)
3. Implementamos el método de la clase ( en este caso, lo que queremos que sucede cuando el usuario pulse doble clic)
4. Registramos el método manejador a la instancia/objeto de nuestro ALV, usando SET HANDLER.

Veamos un ejemplo:
CLASS lcl_receptor_eventos DEFINITION.
PUBLIC SECTION.
METHODS:
metodo_doble_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
ENDCLASS.

CLASS lcl_receptor_eventos IMPLEMENTATION.
METHOD metodo_doble_click.

READ TABLE t_mara INDEX e_row-index INTO s_mara.

ENDMETHOD.

ENDCLASS.

DATA:
mi_alv TYPE REF TO cl_gui_alv_grid,
receptor_eventos TYPE REF TO lcl_receptor_eventos.

CREATE OBJECT receptor_eventos.
SET HANDLER receptor_eventos -> metodo_doble_click FOR mi_alv.



Ahora, vamos a hacer un ALV de los nuevos (ALV Object Model), basados en la clase:

CL_SALV_TABLE

En este caso, tendríamos que seguir los siguientes pasos:

1. Tenemos que definir una variable de referencia de tipo de la clase cl_salv_table.
2. Definimos una tabla interna para mostrar los datos.
3. A continuación, cargamos la tabla interna con los datos que queremos mostrar.
4. Creamos la instancia del ALV llamando al método estático FACTORY de la clase cl_salv_table (en lugar del CREATE OBJECT).

En dicho método sólo son obligatorios 2 parámetros:
r_salv_table , que especifica el nombre del ALV instanciado, y,
t_table , que es la tabla interna que contendrá los datos que muestre el ALV.

5. Mostramos el ALV con la sentencia display.
(Este tipo de ALV no necesita catálogo de campos, y contiene una serie de métodos para reordenar la columnas, ocultar columnas, etc.)

Veamos un ejemplo:
CLEAR: tabla_interna.
SELECT * FROM spfli
INTO CORRESPONDING FIELDS OF TABLE tabla_interna
WHERE carrid IN s_carrid.

TRY.
cl_salv_table =>factory(
IMPORTING
r_salv_table = mi_tabla
CHANGING
t_table = tabla_interna ).

ENDTRY.
mi_tabla -> display( ).











1 comentario: