sap abap alv grid de dos maneras

5
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ámetrocontainer-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.

Upload: eiservasquez

Post on 01-Oct-2015

250 views

Category:

Documents


14 download

DESCRIPTION

Como efectuar un ALV grid de 2 formas faciles

TRANSCRIPT

CL_GUI_ALV_GRID versus CL_SALV_TABLETenemosdos opciones diferentes para construir ALV:

1. La antigua ALV Object Method, basada en la clase globalcl_gui_alv_grid,y2. la nueva ALV Object Model, basada en la clasecl_salv_table.

Bien, en este artculo 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 sera 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 referenciaa la clase contenedorcl_gui_custom_container.

2. Instanciamos un objeto de la clase contenedor.

3.Enlazamosel objeto/instanciaal rea reservada en la pantallamediante el parmetrocontainer-namede la instancia recin creada.

4. Declaramos una variable de referencia a la clasecl_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 parmetroi_parent.

6.Pasamos los datospara mostrar en pantalla en las casillas del ALV. Los datos se pasan con una tabla interna almtodo de la clase alv:set_table_for_first_display.

7. Opcionalmente, indicamos el catlogo de campos para los campos del ALV, asignando una tabla, estructura o vista en el parmetroi_structure_name.

8. Opcionalmente, podemos indicar el layout para especificar la conformacin del ALV.

Bien, estos son los pasos mnimos 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 quisiramos visualizar este ALV enpantalla completa, entonces no reservaramos un area de control en la pantalla y no crearamos un control contenedor, en cambio, tendramos que asignar un valor esttico a la parmetro exporti_parent, de la siguiente manera: i_parent = cl_gui_custom_container => screen0.

Tambin tendramos 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 mtodos manejadores de eventos2. Definimos en la clase, el mtodo 'manejador' por el evento que necesitemos (por ejemplo, para el doble-clic)3. Implementamos el mtodo de la clase ( en este caso, lo que queremos que sucede cuando el usuario pulse doble clic)4. Registramos el mtodo 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 HANDLERreceptor_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, tendramos que seguir los siguientes pasos:

1. Tenemos que definir una variable de referencia de tipo de la clasecl_salv_table.2. Definimos una tabla interna para mostrar los datos.3. A continuacin, cargamos la tabla interna con los datos que queremos mostrar.4. Creamos la instancia del ALV llamando almtodo esttico FACTORY de la clase cl_salv_table(en lugar del CREATE OBJECT).

En dicho mtodo slo son obligatorios 2 parmetros: 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 sentenciadisplay.(Este tipo de ALV no necesita catlogo de campos, y contiene una serie de mtodos 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( ).