Reportes - AprendeABAP

Anuncio
REPORTES
En ABAP se cuenta con una serie de instrucciones especialmente diseñadas para que la generación
de reportes sea más sencilla.
Existen dos formas de construir reportes en ABAP:
•
•
Reportes tipo LIST o WRITE.
Reportes tipo ALV.
Reportes tipo LIST o WRITE
Para este tipo de reportes, existen una serie de sentencias que nos permitirán construir nuestro
reporte "a mano", es decir, paso por paso, línea por línea.
Todo empieza por la sentencia WRITE, con ella podremos visualizar una variable por pantalla, su
estructura es la siguiente:
WRITE / (<offset>) (<long>) <datos a visualizar>.
Con la barra (/) indicaremos si deseamos un salto de línea o no antes de imprimir, esta barra es
opcional.
Con el (<offset>) indicaremos si queremos en que columna de la pantalla empezará la impresión.
Con el (<long>) indicaremos la longitud de los valores a utilizar; todos estos campos son
opcionales.
Ejemplo:
WRITE / (15) <variable>.
Con la sentencia ULINE, podremos imprimir una línea horizontal, ideal para la construcción de
tablas en un reporte; esta sentencia cuenta con las mismas propiedades de la sentencia WRITE
explicada arriba; en el caso de pintar líneas verticales, utilizamos la sentencia VLINE.
Para saltar una o varias líneas en la impresión, contamos con la sentencia SKIP, que por defecto,
responde al salto de una única línea, a menos que se le indique explícitamente cuantas líneas de
salto se quieren con la instrucción: SKIP <n> (n = número de líneas).
Ahora bien, si deseamos saltar a una línea específica de la pantalla, utilizaríamos la sentencia SKIP
TO LINE <n> (n = número de la línea destino).
Si el salto que queremos dar, es hacia la siguiente página, la instrucción que nos sería de utilidad
sería NEW-PAGE.
Al utilizar la sentencia WRITE, en ocasiones imprimiremos cantidades en monedas, para una
correcta impresión, completaremos con las siguientes sentencias:
WRITE <campo> CURRENCY <moneda> o WRITE <campo> CURRENCY LOCAL.
Reportes – RichardRey.com - 2
Si vamos a imprimir, por ejemplo, el código de un material, y no deseamos que aparezcan los
ceros a la izquierda del código, utilizamos la siguiente instrucción:
WRITE <variable> NO-ZERO.
Para imprimir fechas estableciendo su formato de salida, contamos con:
WRITE <fecha> DD/MM/YY.
WRITE <fecha> MM/DD/YY.
WRITE <fecha> DD/MM/YYYY.
WRITE <fecha> MM/DD/YYYY.
Atributos de pantalla y Formatos de Páginas
Dejamos atrás el WRITE para entrar en otros aspectos, como añadirle colores o estilos a ciertas
variables para diferenciarlas de otras, como por ejemplo, la cabecera de una tabla.
FORMAT NTENSIFIED ON/OFF.
FORMAT INVERSE ON/OFF.
FORMAT INPUT ON/OFF.
FORMAT COLOR <n>.
FORMAT RESET.
.
Con estas instrucciones, podemos jugar con el look y el diseño de nuestro reporte.
También hay un grupo de instrucciones destinadas a dar formato de salida a nuestro reporte.
Podemos controlar ambos extremos de una página con los eventos TOP-OF-PAGE y END-OF-PAGE;
éste último no se ejecutará si el salto de página se produce con un NEWPAGE.
Si no queremos que la cabecera del reporte sea la estándar de SAP, sino controlarla nosotros
mismos a través del evento TOP-OF-PAGE, lo que haremos es que la primera instrucción de
nuestro programa sea la siguiente:
REPORT <Zxxx> NO STANDARD PAGE HEADING.
El formato de la página del reporte se define también desde la instrucción REPORT.
REPORT <Zxxx> LINE-SIZE <n> (ancho de la línea).
REPORT <Zxxx> LINE-COUNT <n(m)> (n = líneas por páginas; m = líneas reservadas para pie de
página).
Reportes – RichardRey.com - 3
REPORT <Zxxx> PAGE-COUNT <n>. (n = número máximo de páginas).
Con la instrucción RESERVE, podemos impedir que un bloque de líneas que presentan una
coherencia juntas, se corten y se pierda la misma, para esto podemos reservar un número
determinado de líneas con la instrucción:
RESERVE <n> LINES.
Esta instrucción se debe colocar justo antes del WRITE sobre el que se quiere "reservar" ese
bloque de líneas; de no haber espacio suficiente para imprimir estas líneas, éstas se imprimirán en
la siguiente página.
Elementos de Texto.
En el entorno de desarrollo ABAP se nos permite manejar elementos de texto sin necesidad de
escribir el código en el programa.
Estos elementos de texto pueden ser títulos de reportes, cabeceras, textos de selección, entre
otros.
Para acceder a la pantalla de edición de estos textos, desde el editor ABAP, ubicamos el menú
Pasar a -> Elementos de Texto.
•
•
•
Títulos y Cabeceras: para tratar el título y cabeceras del reporte y las cabeceras de
columna que saldrán por pantalla e impresora.
Textos de Selección: para tratar las descripciones que acompañan a los parámetros de
entrada del tipo PARAMETERS o SELECT-OPTIONS.
Textos Numerados: para tratar constantes de tipo texto sin necesidad de declararlas
dentro del programa. Los nombres de estas constantes serán TEXT-nnn donde <nnn> es un
número de 3 dígitos. Además podemos mantener los textos numerados en varios idiomas.
Mensajes de Diálogo.
Son aquellos mensajes que aparecen en la línea de mensajes y que son manejables desde un
programa. Estos mensajes están agrupados en áreas de mensajes. Para indicar que área vamos a
usar en un reporte, utilizamos MESSAGE-ID en la instrucción REPORT.
REPORT <reporte> MESSAGE-ID <area>.
Para el tratamiento de las áreas de mensajes, encontramos su editor en el menú
Pasar a -> Mensajes.
Para visualizar un mensaje dentro del código utilizamos la sentencia MESSAGE Tnnn.
Donde "nnn" es el número del mensaje dentro de su respectiva área y "T" es el tipo de mensaje.
Reportes – RichardRey.com - 4
Los diferentes tipos de mensajes que permite el sistema son los siguientes:
•
•
•
•
•
A = Cancelación del proceso.
E = Error. es necesaria una corrección de los datos.
I = Información. Mensaje meramente informativo. El proceso continuará con un ENTER.
S = Confirmación; información en la pantalla siguiente.
W = Warning. Nos da un aviso, podemos cambiar los datos o pulsar ENTER para continuar.
Solo los mensajes tipo A y E interrumpirán la ejecución del programa, obligando su finalización
antes de tiempo, el resto de mensajes, permitirá continuar con la ejecución hasta el final.
Podemos acompañar los mensajes con variables como parámetros:
MESSAGE Tnnn WITH <var1> <var2>.
En su definición veremos símbolos &, éstos símbolos se podrán sustituir por variables en el código
del programa; dependiendo del tipo de mensaje permite más símbolos que otros, hasta un
máximo de 4 variables.
Ejemplo de un reporte con WRITE.
A continuación te dejo un ejemplo funcional de cómo construir un reporte tipo WRITE o LIST.
********************************************************************************
REPORT zrr.
DATA: it_flights LIKE TABLE OF mara,
wa_flights LIKE LINE OF it_flights.
START-OF-SELECTION.
SELECT * FROM mara INTO TABLE it_flights
WHERE matnr BETWEEN '000000000080003050' and '000000000080003060'.
END-OF-SELECTION.
SORT it_flights BY matnr ersda.
* Data output
PERFORM data_output.
TOP-OF-PAGE.
NEW-LINE.
WRITE: / sy-uline.
Reportes – RichardRey.com - 5
FORMAT COLOR COL_HEADING .
WRITE:
sy-vline,
AT (3) ' ',
AT (10) 'Material',
AT (1) sy-vline,
AT (15) 'Fecha',
AT (1) sy-vline,
AT (25) 'Grupo Artículos',
AT (1) sy-vline,
AT (30) 'Número Antiguo',
AT (1) sy-vline.
FORMAT COLOR OFF .
WRITE: / sy-uline.
*&---------------------------------------------------------------------*
*&
Form DATA_OUTPUT
*&---------------------------------------------------------------------*
*
List output of flight data
*----------------------------------------------------------------------*
FORM data_output.
LOOP AT it_flights INTO wa_flights.
NEW-LINE.
WRITE: sy-vline.
WRITE: AT (3) ' ' ,
AT (10) wa_flights-matnr COLOR COL_KEY,
AT (1) sy-vline,
AT (15) wa_flights-ersda COLOR COL_NORMAL ,
AT (1) sy-vline,
AT (25) wa_flights-mtart COLOR COL_NORMAL ,
AT (1) sy-vline,
AT (30) wa_flights-bismt COLOR COL_NORMAL ,
AT (1) sy-vline.
AT END OF matnr.
ULINE.
ENDAT.
ENDLOOP.
ENDFORM.
" DATA_OUTPUT
********************************************************************************
Reportes – RichardRey.com - 6
Reportes ALV
Desde la versión 4.6C; existen funcionalidades avanzadas para el desarrollo de reportes, mucho
más sencillos de construir que los reportes WRITE, y mucho más elegantes y prácticos que estos,
ya que permiten cierto dinamismo, como agrupar, totalizar columnas numéricas, añadir y quitar
columnas, guardar los cambios realizados, exportar a Excel y otros formatos, etc.
Cuando se crea un reporte utilizando funciones ALV es necesario:
•
•
•
•
Incluir en el programa la librería SLIS, que tiene definidas todas las estructuras de los
parámetros de entrada y de salida de esta función. Esta librería se importa con la
instrucción TYPE-SPOOLS: slis.
Definir correctamente el catálogo de campos.
Definir en el programa todas las subrutinas que implementarán el comportamiento de
éste ante la ejecución de determinados eventos o ante la interacción del usuario.
Pasarle los datos que deben ser mostrados en el reporte a la función utilizando tablas
internas.
Utilizando las funciones ALV, ninguna sentencia WRITE aparecerá en el programa. Se informa a la
correspondiente función de los datos que van a ser mostrados, la definición y características de
Reportes – RichardRey.com - 7
cada uno de éstos datos y de la apariencia y todo es implementado por la función. En el momento
que llamamos a una de las funciones ALV para que imprima el report, perdemos el control del
programa. Esto es, cualquier evento del programa como ‘Nueva página’, ‘Top of page’, ‘End of
page’, etc. será controlado e implementado por la función, a no ser que le indiquemos a la función
qué eventos queremos que sean implementadas en el programa.
Se llamará a la función, informándole obligatoriamente los siguientes parámetros:
•
•
•
I_CALLBACK_PROGRAM: Se informa a la función con el nombre del programa que está
llamando a dicha función.
IT_FIELDCAT: Este parámetro será una tabla interna que contiene la definición de los
campos que aparecerán en el listado.
T_OUTTAB: Nombre de la tabla interna que contiene toda la información recogida por el
programa y la cual debe ser impresa en el reporte.
Cada tipo de ALV cuenta con diferentes parámetros de entrada opcionales, pero estos 3 son
obligatorios en todos los casos.
Existen 3 tipos principales de reportes ALV, el uso de cada uno dependerá de lo se requiera en un
momento dado.
•
•
•
ALV List: permite simular el trazado de un reporte WRITE, pero con las funcionalidades y
bondades de un ALV.
ALV Grid: Permite generar una tabla gráfica, totalmente editable desde su presentación
(añadir y quitar columnas, agrupar y ordenar, totalizar valores, entre otras).
ALV Jerárquico: Es un tipo de reporte que consta de 2 cabeceras, y permite enlazar la
información de ambas partes de una manera gráficamente legible.
Cada uno de ellos tiene su propio módulo de funciones con sus respectivas estructuras, veamos un
poco como se construyen cada uno.
NOTA: Se mostrarán solo algunos de los parámetros de mayor uso de las funciones ALV, las
mismas cuentan con otros parámetros que aquí no se muestran por razones de espacio.
Reportes – RichardRey.com - 8
ALV LIST
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = g_repid
i_structure_name
= gc_structure
it_fieldcat
= gt_fieldcat_list
i_save
= gc_save
is_layout
= gs_layout
is_variant
= gs_variant
is_print
= gs_print
TABLES
t_outtab
= gt_output_value
EXCEPTIONS
program_error
= 1
OTHERS
= 2.
•
•
•
•
•
•
•
•
I_CALLBACK_PROGRAM: Recibe el nombre del programa que invoca a la función.
I_STRUCTURE_NAME: Indica la Estructura de Datos del Diccionario que se tomará como
base en la construcción del reporte.
IT_FIELDCAT: Contiene lo que en ALV se conoce como el "Catálogo de Objetos"; esto es, la
lista de campos (o columnas) que se van a listar en el reporte.
I_SAVE: En este parámetro se indicará que tipos de "layouts" se podrán "pre cargar",
(deben existir en el sistema); se le puede indicar a la función ALV tres posibles opciones;
que muestre aquellos layouts grabados como estándares ('X'); los layouts específicos de
usuarios ('U'), o todos los layouts disponibles ('A').
IS_LAYOUT: Se le puede indicar a la función que el diseño del reporte aparezca con una
serie de ajustes; (con cabecera o sin ella, con colores en las filas o columnas, entre otras).
IS_VARIANT: Este parámetro contendrá la variante de visualización (layout) que el usuario
haya seleccionado, de la lista de opciones para dicho reporte.
IS_PRINT: Esta tabla interna controla parametrizaciones de impresión, como no mostrar la
cabecera, asignar impresora, saltarse la ventana de diálogo que solicita la impresora, entre
otras.
T_OUTTAB: Esta será la tabla interna que contendrá la información que se requiere
desplegar en un reporte ALV.
La siguiente imagen es una muestra de los resultados que obtendremos para este tipo de ALV.
Reportes – RichardRey.com - 9
ALV GRID
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program
= v_repid
I_BACKGROUND_ID
= 'ALV_BACKGROUND'
i_callback_top_of_page
= l_form_cabecera
i_save
= 'A'
it_fieldcat
= gt_fieldcat
is_variant
= variante
TABLES
t_outtab
= p_output.
•
•
•
•
•
•
I_CALLBACK_PROGRAM: Recibe el nombre del programa que invoca a la función.
I_BACKGROUND_ID: Permitirá asignarle una imagen de fondo al reporte.
I_CALLBACK_TOP_OF_PAGE: Permite indicarle a la función que controlaremos la cabecera
del reporte desde nuestro programa.
I_SAVE: En este parámetro se indicará que tipos de "layouts" se podrán "pre cargar",
(deben existir en el sistema); se le puede indicar a la función ALV tres posibles opciones;
que muestre aquellos layouts grabados como estándares ('X'); los layouts específicos de
usuarios ('U'), o todos los layouts disponibles ('A').
IT_FIELDCAT: Contiene lo que en ALV se conoce como el "Catálogo de Objetos"; esto es, la
lista de campos (o columnas) que se van a listar en el reporte.
IS_VARIANT: Este parámetro contendrá la variante de visualización (layout) que el usuario
haya seleccionado, de la lista de opciones para dicho reporte.
Reportes – RichardRey.com - 10
•
T_OUTTAB: Esta será la tabla interna que contendrá la información que se requiere
desplegar en un reporte ALV.
Veamos que se obtiene con este tipo de ALV.
Reportes – RichardRey.com - 11
ALV JERÁRQUICO
Este tipo de ALV consiste en anidar dos tablas (una con la estructura de cabecera y otra con la
estructura del detalle), que permite enlazar la información de ambas tablas. Es muy útil cuando se
quiere un reporte que contenga doble cabecera; la función necesitará recibir la información en dos
tablas separadas.
CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
EXPORTING
i_callback_program
= gv_repid
i_callback_pf_status_set = slis_ev_pf_status_set
i_callback_user_command = slis_ev_user_command
is_layout
= gs_layout
it_fieldcat
= gt_fieldcat
it_sort
= gt_sortinfo
i_save
= 'A'
is_variant
= gs_variant
it_events
= gt_event
i_tabname_header
= 'IT_HEADER'
i_tabname_item
= 'ITAB'
is_keyinfo
= gs_keyinfo
is_print
= gs_print
TABLES
t_outtab_header
= IT_HEADER
t_outtab_item
= ITAB
EXCEPTIONS
program_error
= 1
OTHERS
= 2.
•
•
•
•
•
•
•
I_CALLBACK_PROGRAM: Recibe el nombre del programa que invoca a la función.
I_CALLBACK_PF_STATUS_SET: Permite indicarle a la función cual será el Status GUI (barra
de pulsadores) que queremos desplegar con el reporte.
I_CALLBACK_USER_COMMAND: Permitirá controlar los eventos que puedan ocurrir en el
reporte (pulsar un campo del listado y saltar a otra transacción, pulsar un botón añadido
en la barra de pulsadores, entre otros).
IS_LAYOUT: Se le puede indicar a la función que el diseño del reporte aparezca con una
serie de ajustes; (con cabecera o sin ella, con colores en las filas o columnas, entre otras).
IT_FIELDCAT: Contiene lo que en ALV se conoce como el "Catálogo de Objetos"; esto es, la
lista de campos (o columnas) que se van a listar en el reporte.
IT_SORT: Con esta tabla se le indicará a la función cual será el criterio de ordenamiento
con el cual se desplegará la información.
I_SAVE: En este parámetro se indicará que tipos de "layouts" se podrán "pre cargar",
(deben existir en el sistema); se le puede indicar a la función ALV tres posibles opciones;
que muestre aquellos layouts grabados como estándares ('X'); los layouts específicos de
usuarios ('U'), o todos los layouts disponibles ('A').
Reportes – RichardRey.com - 12
•
•
•
•
•
•
•
•
IS_VARIANT: Este parámetro contendrá la variante de visualización (layout) que el usuario
haya seleccionado, de la lista de opciones para dicho reporte.
IT_EVENTS: Se le indicará a la función cuales serán los eventos del sistema que controlará.
I_TABNAME_HEADER: Contendrá el nombre de la tabla de cabecera.
I_TABNAME_ITEM: Contendrá el nombre de la tabla del detalle de posiciones.
IS_KEYINFO: Esta tabla contendrá las conexiones de enlaces entre las dos tablas, como se
puede deducir, ambas tablas deberán contener el mismo campo con el mismo nombre,
para poder servir de enlace entre ambas.
IS_PRINT: Esta tabla interna controla parametrizaciones de impresión, como no mostrar la
cabecera, asignar impresora, saltarse la ventana de diálogo que solicita la impresora, entre
otras.
T_OUTTAB_HEADER: Esta será la tabla interna que contendrá la información de cabecera
del reporte, será la primera línea de desglose en la doble cabecera.
T_OUTTAB_ITEM: Esta tabla contendrá los datos a mostrarse, relativos al detalle, o lo que
es lo mismo, la información de la segunda tabla, con las posiciones del reporte.
Veamos qué tipo de reportes logramos obtener con esta función.
La tabla T_OUTTAB_HEADER contiene las líneas de color naranja, mientras que la tabla
T_OUTTAB_ITEM contendrá el desglose de líneas en fondo blanco, que corresponden a la
cabecera de color azul.
Si observamos en detalle, el desglose es el detalle de la línea naranja respectiva; dentro de la
jerarquía indicada.
Por eso se les conoce como reportes jerárquicos.
Reportes – RichardRey.com - 13
Ejemplo de ALV
Si quieres ver un ejemplo práctico y funcional sobre la construcción de un reporte ALV, revisa el
siguiente enlace, que te llevará a un trabajo realizado para un artículo en mi Blog personal.
http://richardrey.com/index.php/abap-tips/plantilla-para-construir-un-alv-2/
Con esto ya tienes diversas vías para construir reportes en un programa Z.
Richard Rey
http://aprendeabap.com
Reportes – RichardRey.com - 14
Descargar