Sie sind auf Seite 1von 19

ALV Grid Control

Pgina 1 de 19

El ABAP LIST VIEWER (ALV) est disponible desde la versin 4.5a. Con la versin 4.6c, fue renombrado a SAP LIST
VIEWER, pero se mantuvo el acrnimo ALV. El List Viewer es renderizado por el servidor de presentacin, lo cual lo hace
diferente de los reports que producimos utilizando las sentencias WRITE. Podemos usar un control contenedor en el
servidor de presentacin para producir el ALV.
Este captulo nos proporcionar un entendimiento bsico de cmo producir un control ALV Grid. Examinaremos ambas
versiones de ALV basadas en clases, y analizaremos las mayores diferencias entre ellas. Cubriremos las tcnicas para
generar ALV a pantalla completa y ALV con un contenedor. Tambin veremos cmo manejar eventos desencadenados
por el ALV, para procesarlos en el programa.

OVERVIEW A LA PROGRAMACIN ALV
La interfaz grfica de usuario (GUI) en el sistema SAP est basada en ventanas SAP GUI (screens, desde el punto de vista
tcnico del programador). Cada dilogo es implementado utilizando dynpros de programas. Antes de la versin 4.5, tan
slo podamos utilizar elementos que fueran proporcionados por el Screen Painter, como los botones. A partir de la
versin 4.5, es posible utilizar controles independientes, componentes de software binario, como es el caso del ALV Grid
Control. La comunicacin con estos controles es diferente que la comunicacin con los componentes estndar de la
dynpro. En lugar comunicarse empleando el procesador de la Screen, estos controles utilizan el Control Frameword
(CFW).
No podemos crear interfaces independientes de un control en el servidor de presentacin. Debemos proveer un control
especial conocido como contenedor. Este control contenedor es colocado en un rea reservada de la Screen, y el Grid
ALV se ubica dentro de este control contenedor. Los pasos para colocar un control en la Screen son los siguientes:
1. Reservamos un rea en la Screen para el contenedor, utilizando un elemento de screen especial: el Custom
Control. El proceso para esto similar al de reservar un rea de subscreen para una Subscreen.
2. Creamos una instancia de la clase del control contenedor, y la vinculamos al rea reservada en la Screen. El
control contenedor ahora se visualiza en el rea reservada.
3. Creamos una instancia del Control ALV Grid, y la vinculamos con la instancia del control contenedor. El control
ALV Grid es ahora visible en el contenedor.
Para reservar un rea en la Screen para el control utilizamos el editor grfico de layout del Screen Painter; hacemos clic
en el Custom Control, y dibujamos el rea para el contenedor en la Screen. Necesitamos proporcionar un nombre para
el rea de Custom Control creada, ya que ms tarde habr que vincularla con el contenedor.
Ahora necesitamos generar una instancia de un contenedor. En nuestro programa, necesitamos hacer esto antes de
mostrar la Screen en la que se va a mostrar el ALV Grid, en el servidor de presentacin. El PBO (Process Before Output)
de la Screen que contiene el rea reservada es el lugar usual para crear la instancia del contenedor. Este bloque de
evento siempre es llamado antes de que se muestre la Screen.
El proceso para crear la instancia del contenedor comienza con la declaracin de una variable por referencia. La variable
por referencia necesita referirse a la clase del contenedor, en este caso CL_GUI_CUSTOM_CONTAINER. Generamos una
instancia del control contenedor, mediante la sentencia CREATE OBJECT, para generar una instancia de la clase
ALV Grid Control

Pgina 2 de 19

CL_GUI_CUSTOM_CONTAINER. Vinculamos el contenedor que estamos creando con el rea reservada para l en la
Screen, mediante el uso del parmetro IMPORTING CONTAINER_NAME. Recomendamos utilizar cualquiera de los dos
diseos de ABAP Objects (o pinchar y arrastrar desde el nombre de la clase en el Object Navigator a nuestro cdigo,
para producir automticamente la llamada CREATE OBJECT), para insertar la sentencia CREATE OBJECT.

Ej.




DATA:
gt_sflight TYPE TABLE OF sflight,
gs_lsyout TYPE lvc_s_layo,
gr_alv_grid TYPE REF TO cl_gui_alv_grid.

IF gr_custom_contaniner IS NOT BOUND.
Creamos una instancia del contenedor
CREATE OBJECT gr_custom_container
EXPORTING
container_name = ALV_CONTAINER_01
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF SY-SUBRC NE 0.
MESSAGE a001 (z_message_class).
El contenedor no puede ser creado
Programa terminado
ENDIF.
Creamos una instancia del Control ALV
CREATE OBJECT gr_alv_grid
EXPORTING
i_parent = gr_custom_container.
ENDIF.

gs_layout-grid_title = Flights(100).

CUSTOM CONTROL
NAME = ALV_CONTAINER_01
ALV Grid Control

Pgina 3 de 19

CALL METHOD gr_alv_grid->set_table_for_first_display
EXPORTING
i_structure_name = SFLIGHT
is_layout = gs_layout
CHANGING
it_outtab = gt_sflight.

Si creamos esta instancia en el mdulo PBO, que se ejecutar tantas veces como la Screen sea procesada, necesitamos
asegurarnos que la instancia slo se genera la primera vez; slo queremos crear un contenedor, independientemente de
cuntas veces sea procesada la Screen. Si no, generaremos un nuevo objeto cada vez que la dynpro sea procesada (o
cada vez que el cdigo sea reejecutado). Podemos evitar que se crean instancias no deseadas, simplemente crendolas
slo despus de haber comprobado si la variable referencia no es vlida, mediante la condicin IS NOT BOUND.
NOTA: Preferimos usar IS NOT BOUND en lugar de la ms comn IS INITIAL, porque IS NOT
BOUND chequea si la referencia es invlida, en lugar de chequear simplemente si
est vaca. Los recursos del control que ocupan el servidor de presentacin suelen
ser liberador al finalizar el programa. Sin embargo, estos recursos pueden ser
liberados explcitamente mediante la llamada al mtodo instanciado FREE.
Una liberacin temprana del recurso invalida la variable por referencia. Si el cdigo
no crea un nuevo objeto porque todava existe un valor, la referencia invlida es
suministrada al ALV. Sin embargo, mediante el uso de IS NOT BOUND, esta referencia
es calificada como invlida, y se crea un nuevo objeto.

Debemos crear la instancia del control ALV Grid despus de crear la instancia del control contenedor, porque la
instancia del control contenedor debe existir antes de que se pueda vincular el ALV con ella. Adems, es necesario que
sea antes de que la ventana del SAP GUI sea enviada al servidor de presentacin, porque tanto el container como el ALV
Grid deben existir antes de que se muestre. Por tanto, podemos utilizar el PBO de la Screen.
Declaramos una variable por referencia tipada con la referencia a la clase CL_GUI_ALV_GRID. Proporcionaremos la
instancia referenciada de la previamente generada instancia del control contenedor, mediante el parmetro i_parent,
durante la llamada del constructor de la instancia, que se desencadena cuando llamamos a CREATE OBJECT.
Proporcionando el contenedor durante la creacin del ALV Grid, proporcionamos el vnculo entre estos objetos. Si
ocurre una excepcin cuando se crea la instancia, debemos reaccionar con un mensaje de terminacin para abortar el
programa.
Si queremos mostrar el control ALV Grid en modo de pantalla completa, que es lo ms frecuente para mostrar un
informe en el cuerpo completo de la pantalla, no reservamos un rea de control en la Screen, y no creamos un control
contenedor. En cambio, asignamos un valor esttico al parmetro de EXPORT i_parent:
CREATE OBJECT gr_alv_grid
EXPORTING
i_parent = cl_gui_custom_container=>screen0.
ALV Grid Control

Pgina 4 de 19

Como resultado de estos pasos, habremos creado un control ALV Grid como un element de Screen. Sin embargo,
solamente vemos un marco en la ventana del SAP GUI, porque los controles todava no muestran nada. Todava
necesitamos proporcionar al servidor de presentacin controles con datos para que los puedan mostrar.
El programa necesita ahora proporcionar todos los datos para mostrar y las normas que definen cmo estos datos
deben ser mostrador (a travs del uso del catlogo de campo). Debemos pasar los datos para mostrar en el ALV Grid
como una tabla interna estndar, al mtodo SET_TABLE_FOR_FIRST_DISPLAY, al cual llamamos para la instancia del ALV
Grid. El ALV Grid no hace una copia de los datos, pero en cambio maneja una referencia de la tabla interna
proporcionada. Todas las acciones de la instancia del ALV (por ejemplo, ordenar o filtrar) son realizadas por la instancia
de la tabla interna que reside en el programa llamante. Esto significa que debemos asegurarnos de que la tabla interna
tiene tanta existencia como, al menos, el ALV Grid. Dicho de otra forma, no usaremos una tabla local en una unidad
modular que no sobrevivir al control ALV Grid.
Si el usuario ordena los datos en el ALV Grid, el contenido de la tabla interna en el programa que produce la llamada es
ordenado. Por tanto, la tabla proporcionada al ALV debe ser una tabla estndar (Standard Table). Cualquier otra
interaccin del usuario solamente lee los datos. Utilizamos el mtodo de la instancia SET_TABLE_FOR_FIRST_DISPLAY
para pasar los datos mostrados en la forma de una tabla interna estndar (parmetro it_outtab), el catlogo de campos,
de nuevo en la forma de una tabla interna estndar (parmetro it_fieldcatalog), y otra informacin adicional relativa a la
presentacin o layout de los datos en el ALV Grid.
PRINCIPALES PARMETROS PARA MOSTRAR UNA TABLA ALV:
- it_outtab: Muestra los datos de una tabla interna estndar.
- it_fieldcatalog: El catlogo de campos es una tabla interna que contiene informacin acerca de las columnas
que deben ser mostradas.
- i_structure_name: Si se proporciona, permite que el ALV genere automticamente el Catlogo de campos
para todos los campos contenidos en la estructura, que debe ser un objeto procedente del Diccionario
ABAP.
- is_variant, i_save, i_default: Estos parmetros proporcionan al usuario la posibilidad de cambiar o guardar
el layout mostrado.
- is_layout: Esta estructura proporciona campos para configurar propiedades grficas del control grid, lanzar
excepciones, calcular totales, y habilita opciones especficas de interaccin.
- is_print: La estructura print contiene campos para configurar cundo la lista se puede imprimir.
- it_special_groups: Esta tabla se usa para pasar textos para grupos de campos definidos en el catlogo de
campos.
- it_toolbar_excluding: Nombres de las funciones estndar que queremos ocultar en la barra de
herramientas.
- it_filter: Proporciona la configuracin inicial para los filtrados.
- it_sort: Proporciona la configuracin inicial para el orden.
ALV Grid Control

Pgina 5 de 19

Los datos que se mostrarn en el ALV debe ser proporcionados por el parmetro it_outtab; todos los dems parmetros
son opcionales. Si proporcionamos el nombre de un tipo de estructura global (por ejemplo, una estructura, tabla o vista
del Diccionario ABAP) al parmetro i_structure_name, el catlogo de campos es automticamente generado por el ALV
Grid para los campos en esta estructura, tabla o vista. Sin embargo, cada componente en la estructura debe existir en la
tabla interna de datos como una columna. Esto muestra todas las columnas de la tabla de datos con los mismos
nombres que en la estructura proporcionada en el ALV Grid.
La mnima informacin que debemos proporcionar es los datos que se van a mostrar (it_outtab) de la tabla interna. La
forma ms simple de proporcionar informacin acerca de los datos que se mostrarn es proporcionar una estructura de
diccionario ABAP, tabla o vista, en el parmetro i_structure_name.
Podemos tener los datos de lista y la informacin adicional enviada, mediante el uso del mtodo
REFRESH_TABLE_DISPLAY. El parmetro i_sort_refresh, si lleva el valor X, especifica que slo los contenidos de los
datos sern pasados de nuevo, lo cual mantiene el filtro actual y los criterios de ordenacin. Si asignamos el valor X a
los campos ROW o COL de la estructura, utilizando el tipo LVC_S_STBL (para el parmetro IS_TABLE), las posiciones de
scroll de las filas y columnas se mantendrn durante el refresh.
NOTA: No podemos usar el mtodo REFRESH_TABLE_DISPLAY si hemos cambiado la
estructura de las filas al mostrar la tabla; en este caso, necesitamos llamar al mtodo
SET_TABLE_FOR_FIRST_DISPLAY de nuevo, para crear el catlogo de campos de
nuevo.

LAYOUT VARIANTS
Usamos los parmetros is_variant y i_save para determinar qu opciones se ofrecen a los usuarios para gestionar las
variaciones de layout. Utilizando diferentes combinaciones, podemos producir uno de los tres modos, utilizando estos
dos parmetros:
MODO RESULTADO VALORES DE LOS PARMETROS
Cambiar slo el layout actual Los usuario slo pueden cambiar el layout
actual (pueden modificar la seleccin y el
orden en que se muestran las columnas)
- is_variant: Iniciado
- i_save: espacio (valor
predeterminado)
Cargar slo layouts datos El usuario puede cambiar la variante de layout
actual, y seleccionar variantes existentes
- is_variant: contiene valores
proporcionados en la estructura
- i_save = espacio
(o is_variant iniciado y i_save
diferente de espacio)
Cargar y guardar layouts El usuario puede cambiar el layout actual,
gestionar variantes existentes y guardar
nuevas variantes
- is_variant contiene valores
proporcionados en la estructura
- i_save = X o U o A

Opciones de layout:
ALV Grid Control

Pgina 6 de 19

VALOR SIGNIFICADO
Espacio El usuario no puede guardar la variante
U El usuario slo puede guardar variantes dependientes del
usuario
X El usuario puede guardar variantes de layout creadas por
usuarios
A El usuario puede guardar variantes de layout, tanto
relativas al usuario como creadas por usuarios

Las variantes dependientes del usuario deben comenzar con una letra. Las variantes de cliente creadas por usuarios
(tambin conocidas como variantes estndar) deben comenzar con barra invertida (\, slash). Las variantes de SAP
creadas por usuarios comienzan con un dgito (0-9).
NOTA: Slo las variantes estndar pueden ser transportadas. Si el usuario tiene la
autorizacin requerida, puede transportar layouts en el gestor de layout,
seleccionando LAYOUT / TRANSPORT.

DISPLAY SETTINGS
Para cambiar el layout del ALV, proporcionamos una work area al parmetro is_layout. Esta estructura nos permite, por
ejemplo, proporcionar un ttulo, crear un patrn de cebra para las lneas u optimizar el ancho de columnas. Llenamos los
campos relevantes de la estructura como such_fields, zebra o c_with_opt. La estructura debe ser del tipo
LVC_S_LAYO.
Para ordenar los datos en un orden especfico en el control ALV Grid cuando el grid es inicialmente mostrado, debemos
proporcionar una tabla interna para el parmetro IT_SORT. Usaremos el tipoi de tabla LVC_T_SORT para declarar esta
tabla interna. En esta tabla interna, creamos un registro por cada campo que forma parte de los criterios de ordenacin.
Especificamos el nombre de la columna en el campo FIELDNAME. Si ms de un campo forma parte del criterio de
ordenacin, debemos introducir la secuencia de campos del criterio de ordenacin en el campo SPOS, o proporcionar
los campos en la correcta secuencia para el orden de ordenacin.
Para ordenar en orden ascendente, ponemos X en el campo UP.

FIELD CATALOG
Como el display de la tabla no tiene un formato fijo, para que el ALV Grid pueda mostrar los datos, debemos
proporcionar una descripcin de las columnas del ALV Grid. El catlogo de campos proporciona esta informacin, que se
utiliza para mostrar los datos cuando se crea la lista de impresin.
Como mencionbamos antes, la forma ms simple de crear un catlogo de campos es proporcionar el nombre de una
estructura del diccionario ABAP al ALV Grid en el parmetro i_structure_name. Si no podemos proporcionar todos los
detalles para todas las columnas mediante el parmetro i_structure_name, entonces proporcionamos esta informacin
ALV Grid Control

Pgina 7 de 19

al ALV Grid a travs del parmetro it_fieldcatalog. La tabla interna que proporcionamos al parmetro it_fieldcatalog
debe ser definida usando el tipo LVC_T_FCAT, que tiene el tipo de lnea LVC_S_FCAT.
Las razones ms comunes para incluir un catlogo de campos son las siguientes:
- Podemos cambiar el display de la salida, por ejemplo el ancho o la posicin de diferentes columnas.
- La tabla interna tiene columnas que no estn contenidas en la estructura del Diccionario que se implementa
mediante el parmetro i_structure_name.
Si proporcionamos el parmetro i_structure_name con una estructura de Diccionario, tabla o vista, necesitamos
proporcionar una fila en el catlogo de campos para cada columna de la tabla de datos que se mostrar, que difiera de
la subyacente estructura de Diccionario o que no est contenida en la estructura de Diccionario que proporcionamos.
Esta fila debe contener las propiedades tcnicas y otra informacin de formato para la columna.
Cuando creamos un catlogo de campos en el programa llamante, debemos asignar el nombre de la columna de la tabla
interna de datos para el display, al campo FIELDNAME.
Este campo asigna una fila en el Catlogo de campos a una columna en la tabla que contiene los datos a mostrar. Otros
campos en el field Catalog pueden ser divididos en dos grupos basados en su uso cuando se crea un catlogo de
campos:
- Los campos que referencian un tipo global en el Diccionario ABAP. Esto se aplica a los campos REF_FIELD y
REF_TABLE.
- Todos los otros campos del Catlogo de campos proporcionan valores para mostrar propiedades de la
columna.
La fila del catlogo de campos requiere que se le proporcione una mnima informacin; la mayor parte de la informacin
es opcional. Hay tres formas bsicas de ubicar datos en el catlogo (cada una de estas tres estructuras globales
referenciadas abajo puede ser tanto una tabla global como una vista):
- El campo existe en una estructura global con el mismo nombre.
- El campo existe en una estructura global con un nombre diferente.
- El campo no existe en una estructura global.
Si el campo existe con el mismo nombre en una estructura del Diccionario, tabla o vista, es suficiente con asignar el
nombre de la estructura, tabla o vista, al campo REF_TABLE. Slo es necesario aadir el nombre del campo de la
estructura al campo REF_TABLE si el nombre de la columna de la tabla de datos a mostrar es diferente del nombre del
campo de la estructura de Diccionario.
Asignando valores a los campos REF_TABLE y, si es necesario, a REF_FIELD, transferimos todas las definiciones de tipo
desde campos de la estructura especificada en el Diccionario ABAP. Para sobrescribir una definicin desde el Diccionario
ABAP, asignamos un valor a uno de los campos en REF_FIELD y REF_TABLE. Si el campo no existe en la estructura global,
no asignamos valores a los campos REF_TABLE o REF_FIELD, y en su lugar asignamos valores a otro de los campos en el
catlogo de campos.
ALV Grid Control

Pgina 8 de 19

Las columnas que requieren un manejo especial, basados en monedas o unidades de medida, se definen de manera
similar. Los campos relevantes para estas definiciones son los siguientes:
Valor aplicable a la columna completa Nombre de columna conteniendo valores para fila
CURRENCY CFIELDNAME
QUANTITY QFIELDNAME

Si la columna entera es formateada usando el mismo valor, especificamos este valor en el campo mostrado antes. Si
este campo para la columna contiene un valor, el valor especfico de fila se ignora si existe.
As, para dar formato a una columna completa para una moneda especfica, ponemos la clave de moneda en el campo
CURRENCY y, como resultado, los contenidos de CFIELDNAME son ignorados. Lo mismo ocurre con el campo cantidad.
Para dar formato a la columna completa con la misma unidad de medida, proporcionamos la unidad de medida al
campo QUANTITY. Al hacerlo, se ignoran los valores de QFIELDNAME. Si la columna entera no va a tener toda el mismo
formato, especificamos el nombre de columna en la tabla que se mostrar que contiene la clave de moneda en
CFIELDNAME, o la unidad de medida de cantidad en QFIELDNAME.

MANEJO DE EVENTOS ALV
Un objeto puede anunciar que su estado ha cambiado desencadenando un evento. Un ejemplo comn para el ALV Grid
es el doble clic: cuando el usuario hace doble clic en una celda, se desencadena el evento DOUBLE_CLICK. Podemos
programar nuestros propios manejadores de mtodos en nuestra propia clase (normalmente, una clase local), que
reaccionarn a este evento cuando sea desencadenado.
Para que un manejador de mtodo oiga el evento desencadenado y, por lo tanto, pueda reaccionar si ste ocurre,
necesitamos registrar esta instancia. Si se desencadena el evento, los mtodos registrados son ejecutados en el orden
en el que han sido registrados.
Nuestra primera tarea en el manejo de eventos de un control es identificar qu eventos pueden ser desencadenados.
Examinando la clase asociada al control (para nuestro ejemplo, CL_GUI_ALV_GRID) y viendo la pestaa EVENTS en la
lista jerrquica en el Workbench, expandiendo el nodo EVENTS, tendremos una lista de todos los eventos pblicos que
pueden ser desencadenados. La versin actual de CL_GUI_ALV_GRID tiene 32 eventos pblicos. Algunos de los
eventos ms comnmente empleados para esta clase son DOUBLE_CLICK, PRINT_TOP_OF_LIST, PRINT_TOP_OF_PAGE,
PRINT_END_OF_PAGE, PRINT_END_OF_LIST, TOOLBAR y USER_COMMAND.
Para especificar un mtodo manejador de eventos en una clase local, en la parte de definicin usaremos la adicin FOR
EVENT <nombre_evento> OF <nombre_clase>. Esta adicin especifica que este mtodo puede reaccionar al evento
<nombre_evento> de las instancias de la clase <nombre_clase>. Estructuramos los nombres de los mtodos
manejadores de eventos como sigue: ON_<nombre_evento>, donde <nombre_evento> es el nombre del evento.
Slo los parmetros formales que han sido definidos para el evento pueden ser usados en un mtodo manejador de
eventos. Los tipos de los parmetros son dados por el evento. Mientras que slo podemos incluir parmetros que han
sido definidos en el evento, no es necesario importar todos los parmetros pasados desde la sentencia RAISE EVENT.
ALV Grid Control

Pgina 9 de 19

Ej: Definicin de un mtodo manejador.
CLASS lcl_event_receiver DEFINITON.
PUBLIC SECTION.
METHODS:
handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
ENDCLASS.

Ej: Implementacin de un mtodo manejador.
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
READ TABLE gt_sflight INDEX e_row-index INTO gs_sflight.
ENDMETHOD.
ENDCLASS.

Ej: Cmo registrar un mtodo manejador.
DATA:
grid1 TYPE REF TO cl_gui_alv_grid,
event_receiver TYPE REF TO lcl_event_receiver.
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR grid1.

Para resumir el proceso:
1. Definimos una clase local.
2. Definimos el mtodo manejador usando la sintaxis correcta, e importando los parmetros que queremos usar.
3. Implementamos el mtodo manejador.
4. Registramos el mtodo manejador usando SET_HANDLER, antes de que el evento pueda ser desencadenado
(normalmente, antes de que el grid sea mostrado).

ALV OBJECT MODEL
El Modelo de Objetos ALV (ALV Object Model, ALV OM) es una nueva caracterstica disponible desde la versin SAP
Netweaver 6.40. En las versiones ms tempranas, el ALV Grid estaba basado en la clase global CL_GUI_ALV_GRID, que
ya ha sido comentada. ALV Object Model es sencillo de usar. Comentaremos los tres formatos de salida del ALV: el ALV a
pantalla completa, la lista clsica ABAP y la salida en un control contenedor como subrea en una Screen.
ALV Grid Control

Pgina 10 de 19

Debemos llamar al menos a los dos siguientes mtodos en la clase principal del ALV, CL_SALV_TABLE, para obtener la
salida de ALV deseada:
- El mtodo esttico FACTORY para instanciar un objeto de la clase principal del ALV. A este mtodo le
pasamos una tabla interna que contiene los datos que se mostrarn (la tabla que se mostrar). El tipo de
apariencia (display) (clsica, pantalla completa, en contenedor) tambin se define. Realmente no es
necesario suministrar los datos en este punto (en otras palabras, la tabla puede estar vaca). Durante el
mtodo FACTORY, se crea una referencia a la tabla actual. Sin embargo, ser necesario disponer de los datos
antes de llamar al siguiente mtodo.
- El mtodo DISPLAY, para colocar la salida del ALV en la Screen.
Usamos el mtodo FACTORY en lugar del usual CREATE OBJECT. El mtodo FACTORY es un mtodo de clase, y devuelve
una instancia ALV. La sentencia CREATE OBJECT puede ser encontrada en el propio mtodo FACTORY; ste genera la
instancia por nosotros, y devuelve la referencia, por lo que ya podemos trabajar con el ALV Grid.
Utilizamos esta instancia durante otras llamadas a mtodos, para ajustar el ALV individualmente. Si tenemos mostrados
mltiples ALVs en una Screen sencilla, cada una de ellas tendr su propia instancia de variable por referencia. Como en
el antiguo ALV, necesitamos definir una variable por referencia tipada como referencia a la clase CL_SALV_TABLE.
Adems, necesitamos una tabla interna para mostrar.
Ej:
TYPES: BEGIN OF glt_outtab,
carrid TYPE s_carr_id,
connid TYPE s_conn_id,
countryfr TYPE land1,
cityfrom TYPE s_from_cit,
airpfrom TYPE s_fromairp,
contruyto TYPE land1,
cityto TYPE s_to_city,
airpto TYPE s_toairp,
fltime TYPE s_fltime,
deptime TYPE s_dep_time,
arrtime TYPE s_arr_time,
distance TYPE s_distance,
distid TYPE s_distid,
fltype TYPE s_fltype,
period TYPE s_period,
t_color TYPE lvc_t_scol,
t_celltype TYPE salv_t_int4_column,
ENDOF glt_outtab.
glt_outtab TYPE STANDARD TABLE OF glt_outtab NON-UNIQUE DEFAULT KEY.
DATA:
gt_outtab TYPE gtt_outtab,
ALV Grid Control

Pgina 11 de 19

gs_outtab TYPE glt_outtab.

Entonces creamos la instancia del ALV, mediante la llamada al mtodo FACTORY.
Ej: Producir una lista clsica.
TRY.
CALL METHOD cl_salv_table=>factory(
EXPORTING
list_display = if_salv_c_bool_sap=>true
r_container =
container_name =
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_outtab.
CATCH cx_salv_msg INTO gr_error.
gr_str_text = gr_error->if_message~get_text( ).
MESSAGE gv_str_text TYPE E.
ENDTRY.

Ej: Producir una tabla clsica.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_outtab ).
CATCH cx_salv_msg INTO gr_error.
gr_str_text = gr_error->if_message~get_text( ).
MESSAGE gr_str_text TYPE E.
ENDTRY.

NOTA: Los parmetros opcionales del mtodo FACTORY, r_container y container_name, nos
permiten colocar el ALV dentro de un contenedor.
NOTA: Los dos ejemplos producen un ALV en pantalla completa, por no haber especificado
un contenedor.
NOTA: Los dos parmetros obligatorios son r_salv_table, que devuelve una referencia al
ALV creado, y t_table, que es la tabla interna que contiene, o contendr, los datos
que mostrar el ALV.
ALV Grid Control

Pgina 12 de 19

Para actualizar la vista del ALV, llamaremos al mtodo DISPLAY de la instancia adecuada.
NOTA: La vista de lista clsica todava es posible, porque es la nica forma de mostrar
mltiples filas para un registro.

Ej: SELECT, Crear el ALV y mostrar.
CLEAR gt_outtab.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_outtab WHERE carrid IN s_carrid.
TRY.
sl_salv_table=>factory(
IMPORTING
r_salv_table = r_table
CHANGING
t_table = gt_outtab ).
CATCH cx_salv_msg INTO gr_error.
gr_str_text = gr_error->if_message~get_text( ).
MESSAGE gv_str_text TYPE E.
ENDTRY.
gr_table->display( ).

Fijmonos que no hay catlogo de campos y no se proporciona un nombre de estructura. Si los campos referenciados en
la tabla de datos estn definidos con referencia a elementos de datos en el Diccionario ABAP, no necesitamos hacer
nada ms. En cambio, si queremos cambiar las propiedades de la apariencia del ALV, existen mtodos que nos permiten
cambiar cmo se muestra la tabla.
Podemos, por ejemplo, mostrar una columna como un icono, o cambiar la cabecera de una columna (corta, media, larga
o tooltip). Estos mtodos nos permiten reordenar columnas, especificar el orden de ordenacin, u ocultar columnas,
adems de otras cosas. La mayor ventaja de la nueva tcnica es la velocidad con la que es posible escribir un programa
para escribir un ALV. Como la informacin del campo es producida o derivada automticamente, tan slo necesitamos
programar cambios.
Para cambiar un ALV usando el ALV Object Model, necesitamos tener una vista orientada a objetos del ALV.
Simplemente, el ALV en s mismo es un objeto, y sus componentes, como columnas, funciones, ordenaciones y dems,
son tambin objetos en s mismos, pero son subobjetos del ALV. Si queremos cambiar algo relativo al ALV,
simplemente necesitamos:
- Buscar el objeto relevante responsable de la propiedad que queremos cambiar en el objeto principal (en
este caso, la instancia ALV); por ejemplo, columnas.
- Llamar al mtodo para cambiar el estado del subobjeto.

ALV Grid Control

Pgina 13 de 19

Ej: Pasos para establecer un patrn de cebra.
DATA:
lr_display TYPE REF TO cl_salv_display_settings.
lr_display = gr_table->get_display_settings( ).
lr_display->set_striped_pattern( value = if_salv_c_book_sap=>true ).

1. La referencia a la tabla ALV se utiliza para recuperar la configuracin de la vista
2. El objeto resultante se utiliza para llamar al mtodo apropiado para cambiar el atributo.
No es necesario hacer nada ms; el cambio tiene efecto inmediatamente. Para ms elementos del ALV, como columnas
y funciones, hay niveles adicionales de subobjetos. El superobjeto plural llamado columnas contiene propiedades
que se aplican a la interaccin de todas las columnas, como el orden de las columnas. El subobjeto singular, como por
ejemplo la columna AIRLINE, contiene las propiedades que slo son vlidas para esa nica columna, como el ttulo de
la columna. Los mismos dos pasos se repiten para varios niveles que necesitamos procesar; recuperar la referencia de
objeto del objeto principal, y utilizar esta referencia de objeto para llamar al mtodo que har el cambio.

ALV OBJECT MODEL METHODS: La tabla contiene los subobjetos ms utilizados, la llamada al mtodo del ALV para
recuperar el subobjeto, y la clase del subobjeto.
MTODO GET CLASE DEL OBJETO ENTREGADO DESCRIPCIN
GET_AGGREGATIONS CL_SALV_AGGREGATIONS Objetos agregados
GET_COLUMNS CL_SALV_COLUMNS_TABLE Superclase columnas
GET_DISPLAY_SETTINGS CL_SALV_DISPLAY_SETTINGS Definicin de la apariencia; por
ejemplo, ttulo, patrn de rayas,
lneas, etc
GET_EVENT CL_SALV_EVENTS_TABLE Eventos
GET_FILTERS CL_SALV_FILTERS Criterios de filtro
GET_FUNCTIONAL_SETTINGS CL_SALV_FUNCTIONAL_SETTINGS Superclase enlaces y tooltip
GET_FUNCTIONS CL_SALV_FUNCTIONS_LIST Funciones como ordenar, agregar,
etc
GET_LAYOUT CL_SALV_LAYOUT Variantes de layout de
almacenamiento, gestin, etc
GET_PRINT CL_SALV_PRINT Configuraciones de impresin
GET_SELECTIONS CL_SALV_SELECTIONS Modo de seleccin y selecciones
GET_SORTS CL_SALV_SORTS Criterios de ordenacin

Ej: Acceder al subobjeto del ALV, ocultar una columna, agregar una cabecera de columna a una nueva columna.
DATA:
lv_short TYPE scrtext_s,
ALV Grid Control

Pgina 14 de 19

lv_medium TYPE scrtext_m,
lv_long TYPE scrtext_l,
lv_tooltip TYPE lcv_tip,
lr_column TYPE REF TO cl_salv_column,
ir_columns TYPE REF TO cl_salc_columns_table.
ir_columns = gr_table->get_columns( ).
TRY.
lr_column = ir_columns->get_column( FLTYPE ).
lr_column = set_visible( if_salv_c_bool_sap=>false ).
CATCH cx_salv_not_found. #EC NO_HANDLER
ENDTRY.
TRY.
CALL METHOD ir_columns->get_column
EXPORTING
columnname = ICON_FLTYPE
RECEIVING
value = lr_column.
lv_short = Charter(h37).
lr_column->set_short_text( lv_short ).
lv_medium = Charter flight(h38).
lr_column->set_medium_text( lv_medium ).
lv_long = Charter flight(h39).
lr_column->set_long_text( lv_long ).
lv_tooltip = Charter flight(h40).
lr_column->set_tooltip( lv_tooltip ).
CATCH cx_salv_not_found. #EC NO_HANDLER
ENDTRY.

La clase ms alta en la jerarqua de clases del ALV Object Model es la clase CL_SALV_TABLE. En la subordinacin de
clases del ALV, la convencin de nombres nos puede ayudar a identificar el nivel del objeto; si el nombre es plural (por
ejemplo, CL_SALV_COLUMNS_TABLE), se refiere a las propiedades de un grupo de elementos ALV. Si el nombre es
singular (por ejemplo, CL_SALV_COLUMN_TABLE), estamos tratando con las propiedades de un elemento simple.
Existen mtodos GET para subobjetos de segundo nivel (subobjetos del objeto ALV). Esto no se aplica al objeto ALV,
pero s a los subobjetos, como por ejemplo, el objeto que contiene todas las columnas del ALV (clase
CL_SALV_COLUMNS_TABLE).
MTODOS PARA LAS SUBCLASES Y OBJETOS QUE ENTREGAN:
CLASE MTODO GET TIPO DE OBJETO QUE
DEVUELVE
DESCRIPCIN
CL_SALV_AGGREGATIONS GET_AGGREGATION CL_SALV_AGGREGATION Una agregacin individual
CL_SALV_COLUMNS_TABLE GET_COLUMN CL_SALV_COLUMN_TABLE Una columna individual
ALV Grid Control

Pgina 15 de 19

CL_SALV_FILTERS GET_FILTER CL_SALV_FILTER Un criterio de filtro individual
CL_SALV_FUNCTIONAL_SETTINGS GET_HYPERLINKS CL_SALV_HYPERLINKS Superclase para todos los
vnculos
CL_SALV_FUNCTIONAL_SETTINGS GET_TOOLTIPS CL_SALV_TOOLTIPS Superclase para todos los
tooltips
CL_SALV_FUNCTIONS_LIST GET_FUNCTIONS CL_SALV_FUNCTION Una funcin inidividual
CL_SALV_SORTS GET_SORTS CL_SALV_SORTS Un criterio de ordenacin
individual
El proceso usado para colocar el ALV Grid en un contenedor en la Screen sigue los mismos pasos que la antigua versin
del Control ALV Grid, pero proporciona la instancia del contenedor al FACTORY.
Ej:
IF gr_container_2100 IS NOT BOUND.
CREATE OBJECT gr_container_2100
EXPORTING
container_name = CONTAINER_2100.
TRY.
cl_salv_tabl=>factory(
EXPORTING
r_container = gr_container_2100
container_name = CONTAINER_2100
IMPORTING
r_salv_table = gr_table_2100
CHANGING
t_table =gt_outtable_2100 ).
CATCH cx_salv_msg.
ENDTRY.
PERFORM register_events_2100 USING gr_table_2100.
gr_table_2100->display( ).
ENDIF.
Como la rutina est en cdigo que es reejecutado, el cdigo se coloca en un check para ver si el contenedor ya existe. Si
el contenedor no existe, se crea un contenedor. Una vez creado el contenedor, se llama al mtodo FACTORY, pasndole
el nombre del contenedor y la referencia del contenedor creado (actualmente, slo la referencia es necesaria). Se
registran los eventos, y se muestra el ALV. Para proporcionar una distincin entre mltiples contenedores, asignamos un
nmero nico a las diferentes partes (en este caso, el nmero de Screen).
En los ejemplos se han omitido llamadas a subrutinas para modificar los atributos tcnicos de la tabla mostrada.
Recomendamos ubicar estos cambios al ALV (a veces bastante largos) en subrutinas u otras unidades de modularizacin,
para proporcionar claridad. Especialmente en el caso de la programacin de dynpros, donde debemos proporcionar
diferentes contenedores, y deberamos de ser capaces de poder reutilizar estas unidades de modularizacin.
ALV Grid Control

Pgina 16 de 19

Esto nos lleva al PERFORM que permanece antes de la vista actual. De nuevo, este proceso es similar en ambas clases de
ALV (y otros tipos de manejadores de eventos).
Ej: Definicin e implementacin de una clase local para manejar eventos (o, al menos, aquellos que este programa est
interesado en procesar), desde la clase de eventos ALV. El ejemplo abarca el doble clic y el clic. Cuando se desencadena
el evento, nuestra clase local llama a una subrutina para procesar el evento.
CLASS lcl_handle_events_2100 DEFINITION.
PUBLIC SECTION.
METHODS:
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.
CLASS lcl_handle_events_2100 IMPLEMENTATION.
METHOD on_double_click.
PERFORM double_click_2100 USING row column.
ENDMETHOD.
METHOD on_link_click.
PERFORM link_click_2100 USING row column.
ENDMETHOD.
ENDCLASS.
Una vez creado el objeto referencia o nuestro ALV, y antes de mostrar la tabla, necesitamos actualizar el registro de
eventos. Tal como el antiguo ALV (u otro tipo de procesamiento de eventos), tenemos que hacer que el mtodo
manejador de la instancia escuche el evento manejador de la instancia escuche el evento desencadenado. Para hacer
esto, necesitamos registrar esta instancia con el objeto que puede desencadenar el evento (produciendo de forma
efectiva una lista de escuchadores).
Ej:
FORM register_events_2100 USING p_gr_table TYPE REF TO cl_salv_table.
DATA lr_events TYPE REF TO cl_salv_events_table.
IF gr_events_2100 IS NOT BOUND.
CREATE OBJECT gr_events_2100.
ENDIF.
lr_events = p_gr_table->get_event( ).
SET HANDLER gr_events_2100->on_double_click FOR lr_events.
SET HANDLER gr_events_2100->on_link_click FOR lr_events.
ENDFORM.
Al contrario que en la versin antigua de ALV, en la que no es necesario crear un objeto para la clase de evento, porque
los eventos pertenecen a la clase ALV, creamos un objeto de la clase de eventos (CL_SALV_EVENTS_TABLE) si no
ALV Grid Control

Pgina 17 de 19

tenemos una referencia vlida, y establecemos los manejadores para los dos eventos que estamos interesados en
procesar.

TERMINOLOGA IMPORTANTE
Ahora necesitamos conocer qu es un Catlogo de campos, y cmo producir uno par aun ALV. Tambin debemos
comprender el proceso para producir un ALV en pantalla completa y en un contenedor, en ambas versiones del ALV.
Tambin debemos comprender los eventos referidos al ALV. Necesitamos comprender cmo escribir un mtodo
manejador, cmo registrar el mtodo manejador, y dnde identificar qu eventos pueden ser desencadenados.

EVENTOS PARA EL ALV OBJECT MODEL: Eventos para CL_SALV_EVENTS_TABLE
Clase CL_SALV_EVENTS_TABLE
- Eventos heredados:
IF_SALV_EVENTS_FUNCTIONS (ALV: Eventos o funciones)
ADDED_FUNCTION: Control tras la ejecucin de una funcin definida por la aplicacin.
AFTER_SALV_FUNCTION: Control tras la ejecucin de una funcin de un ALV genrico.
BEFORE_SALV_FUNCTION: Control antes de la ejecucin de una funcin de un ALV genrico.
IF_SALV_EVENTS_LIST (ALV: Eventos para listas)
END_OF_PAGE: Control al tiempo end-of-page (list processing)
TOP_OF_PAGE: Control al tiempo top-of-page (list processing)
- IF_SALV-EVENTS_ACTION_TABLE (ALV: Eventos para secuencias de listas)
DOUBLE_CLICK: Control tras doble clic
LINK_CLICK: Control tras clic en un punto de acceso o botn

EVENTOS PARA EL ALV GRID CONTROL: Eventos para CL_ALV_GRID
Clase CL_ALV_GRID
AFTER REFRESH: Tras el refresh dela lista
AFTER_USER_COMMAND: Tras comando de usuario
ALV Grid Control

Pgina 18 de 19

BEFORE_USER_COMMAND: Antes de comando de usuario
BUTTON_CLICK: Clic en botn
CLICK_COL_HEADER: Clic en cabecera de columna
CLICK_ROW_COL: Clic en celda
CONTEXT_MENU: Men contextual
CONTEXT_MENU_REQUEST: Men contextual
CONTEXT_MENU_SELECTED: Seleccin de una entrada de un men contextual
DATA_CHANGED: Los datos han cambiado
DATA_CHANGED_FINISHED: Los datos de salida se han actualizado
DBLCLICK_ROW_COL: Doble clic en la celda
DELAYED_CALLBACK: Callback atrasado
DELAYED_CHANGED_SELECTION: La seleccin ha sido modificada
DELAYED_CHANGED_SEL_CALLBACK: El evento es desencadenado si el usuario selecciona
una fila o columna que no ha sido seleccionada antes. El control ALV Grid desencadena este
evento con un pequeo retraso (delay) de 1,5 segundos.
DELAYED_MOVE_CURRENT_CELL: EL foco de la celda ha sido movido
DOUBLE_CLICK: Doble clic
DOUBLE_CLICK_COL_SEPARATOR: Doble clic en un separador de columna
END_OF_LIST: Final de lista
F1: Se pulsa f1
HOTSPOT_CLICK: Se ha seleccionado un punto de acceso
LEFT_CLICK_DESIGN: Se pulsa el botn izquierdo del ratn sobre un control en modo diseo
LEFT_CLICK_RUN: Se ha pulsado el botn izquierdo del ratn sobre un control en modo de
ejecucin
MENU_BUTTON: Botn de men
MOVE_CONTROL: Se ha movido un control
ONDRAG: Para la fuente de pinchar y arrastrar
ONDROP: Para el destino de pinchar y arrastrar
ALV Grid Control

Pgina 19 de 19

ONDROPCOMPLETE: Para el destino de pinchar y arrastrar, completado
ONDROPGETFLAVOR: Mltiples posibilidades para una operacin de pinchar y arrastrar
ONF1: Al solicitar ayuda
ONF4: Al solicitar ayuda
PRINT_END_OF_LIST: Final de lista de ALV en modo de impresin
PRINT_END_OF_PAGE: Final de pgina en list processing en modo de impresin
PRINT_TOP_OF_LIST: Comienzo de lista de un ALV clsico en modo de impresin
PRINT_TOP_OF_PAGE: Comienzo de pgina en list processing en modo de impresin
RIGHT_CLICK: Clic con el botn derecho sobre un control
SIZE_CONTROL: Cambiado el tamao de un control
SUBTOTAL_TEXT: Editar el texto de los subtotales
TOOLBAR: Barra de herramientas
TOOLBAR_BUTTON_CLICK: Seleccionado un botn de la barra de herramientas
TOOLBAR_MENU_SELECTED: Seleccionada una entrada de men en la barra de
herramientas
TOP_OF_PAGE: Comienzo de pgina
TOTAL_CLICK_ROW_COL: Clic en la lnea de totales
USER_COMMAND: Comando de usuario

Das könnte Ihnen auch gefallen