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