Generación de listados
Sentencias para escribir listados en pantalla, listados interactivos e impresión.
- Manual ABAP
- 4 de 14
- Anterior
- Tipos de datos y sentencias
- Siguiente
- Pantalla de selección
Antes y ahora
Este capítulo se escribió para SAP R/3 y ABAP clásico. Aquí tienes qué ha cambiado; en cada apartado verás la comparación con código y, plegado, el texto original.
| Concepto | En el manual | Hoy | Estado |
|---|---|---|---|
| Mostrar datos | WRITE, ULINE, SKIP | ALV con CL_SALV_TABLE | Sustituido |
| Colores y formato | FORMAT COLOR, INTENSIFIED | Colores de celda y de fila del ALV | Sustituido |
| Cabeceras de página | TOP-OF-PAGE | Título y cabecera del ALV | Sustituido |
| Navegar desde el listado | HIDE y AT LINE-SELECTION | Evento de doble clic del ALV | Sustituido |
| Ordenar, filtrar, sumar, Excel | Programarlo a mano | Lo trae el ALV sin programar | Sustituido |
| Imprimir | NEW-PAGE PRINT ON | Impresión del ALV o, para documentos, formularios Adobe | Se escribe distinto |
| Informes para el navegador | — | App Fiori elements (List Report) | Se escribe distinto |
Sigue igual: los listados con WRITE siguen funcionando en SAP GUI, el spool y la transacción SP01, los listados de jobs en fondo.
4.1. Sentencias para crear el listado
Sustituido
Así se hace hoy
Los listados con WRITE funcionan, pero para informes nuevos se usa el ALV. Con CL_SALV_TABLE bastan unas pocas líneas para tener ordenación, filtros, totales y exportación a Excel:
TOP-OF-PAGE.
WRITE: / 'Pedido', 15 'Cliente', 30 'Importe'.
ULINE.
START-OF-SELECTION.
SELECT * FROM vbak INTO TABLE lt_vbak
WHERE erdat >= p_desde.
LOOP AT lt_vbak INTO ls_vbak.
WRITE: / ls_vbak-vbeln, 15 ls_vbak-kunnr,
30 ls_vbak-netwr.
ENDLOOP.SELECT FROM vbak
FIELDS vbeln, erdat, kunnr, netwr, waerk
WHERE erdat >= @p_desde
INTO TABLE @DATA(lt_pedidos).
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = lt_pedidos ).
lo_alv->get_functions( )->set_all( abap_true ).
lo_alv->get_columns( )->set_optimize( abap_true ).
lo_alv->get_display_settings( )->set_list_header( 'Pedidos de venta' ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'E'.
ENDTRY.Texto original del manual: sintaxis clásica
Generación de listados para salida de datos mediante sentencias ABAP.
WRITE [ AT ] [ / ] [ columna ] [ long ] campo [ opciones_de_formato ][ opciones_de_salida ][ AS CHECKBOX[ INPUT OFF ] ] [ AS SYMBOL] [ AS ICON ] [ AS LINE ].
Con la barra ‘/’ se salta de línea. El siguiente número (“columna”) indica la columna donde empieza a escribirse. En “long” se indica la longitud de salida del campo (que puede diferir de la suya real) para su mejor visualización. Para líneas, símbolos e iconos es obligatorio incluir en el programa el include correspondiente.
Ejemplos:ABAP WRITE caja AS CHECKBOX. "Vale 'X' si está marcado, y ' ' si no lo está. INCLUDE <symbol>. WRITE SYM_PHONE AS SYMBOL. INCLUDE <icon>. WRITE ICON_ALARM AS ICON. INCLUDE <line>. WRITE LINE_TOP_LEFT_CORNER AS LINE.
Las opciones de formato son como las de la sentencia FORMAT:
Para todos los tipo de datos:LEFT-JUSTIFIED, CENTERED, RIGHT-JUSTIFIED, UNDER campo (escribe en la línea siguiente, justo bajo el campo dado), NO-GAP(omite el blanco posterior al campo), USING EDIT MASK máscara (forma especial de presentar un campo), USING NO EDITMASK (desactiva la máscara definida en el Diccionario de Datos para ese tipo de campo), NO-ZERO (si el campo es todo ceros, los cambia por blancos).
Para campos numéricos:NO-SIGN (no escribe el signo), DECIMALS nr (nº de decimales), EXPONENT exp (sólo se define para el tipo F), ROUND redondeo (para el tipo P), CURRENCY moneda (formato de moneda. Todos los formatos están almacenados en la tabla del sistema TCURX), UNIT unidad (unidad en la cual se mide un valor; tabla T006).
Para fechas: Las posibles maneras (automáticas) de escribir una fecha son: DD/MM/AA, MM/DD/AA, DD/MM/AAAA, MM/DD/AAAA, DDMMAA, MMDDAA, AAMMDD.
ULINE [ offset ] [ (long) ].
Con ULINE a secas se dibuja una línea horizontal completa de subrayado. Puede hacerse ésta más corta. Ejemplo: ULINE /5 (50): Escribe una nueva línea (por la ‘/’) a partir de la columna 5, de 50 caracteres de ‘_’ (este número debe ir entre paréntesis).VLINE.
Dibuja una línea vertical.SKIP [ n ].
Saltan líneas (aparecen en blanco). Por defecto, con SKIP sin número salta 1 línea.SKIP TO LINE línea.
Salta a la línea indicada (la primera del texto es la 1, y están numeradas internamente). Se debe cumplir la condición: 1 <= línea <= máximo líneas por página.SET BLANK LINES ON | OFF.
Se activa o desactiva la posibilidad de escribir líneas en blanco (OFF por defecto), sin SKIP.NEW-LINE [ NO-SCROLLING | SCROLLING ].
Genera una nueva línea en el listado, acabando la anterior y moviendo el cursor. Se consigue lo mismo con ‘/’ en WRITE. NEW-PAGE y CALL SCREEN llevan implícita una NEW-LINE. Con NO-SCROLLING no se hace scroll de la línea en el informe (básico o secundarios). Esta opción se desactiva con SCROLLING.NEW-PAGE [NO-TITLE | WITH-TITLE ] [ NO-HEADING | WITH-HEADING ][ LINE-COUNT líneas ] [ LINE-SIZE columnas ].
Genera una nueva página, pero no debe estar en blanco (pues sería ignorada). Se incrementa el contador de páginas SY-PAGNO. NEW-PAGE se ejecuta automáticamente al alcanzar el nº de líneas por página, o con la sentencia RESERVE (que reserva líneas al final de la página para el evento END-OF-PAGE). El TITLE de la página es el título, fecha y número de página. El HEADING es el elemento de texto de cabecera de las tabla del listado. LINE-COUNT indica el nº de líneas de la página. LINE-SIZE indica el nº de columnas de la página.FORMAT [ COLOR color[ ON ]| COLOR OFF ][ INPUT [ ON ]| INPUT OFF ][ INTENSIFIED [ ON ]| INTENSIFIED OFF ][ INVERSE [ ON ]| INVERSE OFF ][ HOTSPOT [ ON ]| HOTSPOT OFF ][ RESET].
Esta sentencia da formato a los textos y listados que se muestran por pantalla, como colores e intensidad. Deja fijo el formato hasta un RESET (opción de FORMAT) o hasta la siguiente sentencia FORMAT, mientras que las opciones de formato de un WRITE sólo afectan a dicho WRITE.
Ejemplo:ABAP *Color predeterminado para encabezados. FORMAT COLOR COL_HEADING.DETAIL.
Equivale a la opción INTENSIFIED OFF de la sentencia FORMAT.SUMMARY.
Equivale a la opción INTENSIFIED ON de la sentencia FORMAT.POSITION col.
Posiciona el cursor en la columna especificada, para sobreescribir luego en ella con WRITE.BACK.
Pone el cursor en la primera línea de la pantalla, o bien tras las escritas por TOP-OF-PAGE o reservadas por la sentencia RESERVE.RESERVE n LINES.
Reserva espacio de n líneas al final de la página para el pie de página que escribe el END-OF-PAGE (si no se hace esto, no aparecerá el pie de página).SET LEFT SCROLL-BOUNDARY [ COLUMN col ].
Al generar un listado la posición actual del cursor (columna SY-COLNO) se deja como límite izquierdo del ‘área móvil’ (zona de la pantalla que puede tener scroll mediante barras de desplazamiento). El ancho de esta área móvil se puede modificar. En ‘col’ se puede especificar la posición del nuevo límite izquierdo de esta área, de forma que las columnas a la izquierda de ésta serán fijas, no serán desplazadas al hacer scroll horizontal.SET COUNTRY país.
La escritura en pantalla de las fechas y de cantidades monetarias sale formateada de acuerdo con lo acostumbrado en el país especificado. Se toman estos datos de la tabla T005X. Devuelve SY-SUBRC 0 si existe ese identificador de país, y 4 en otro caso.
4.2. Sentencias para listados interactivos
Sustituido
Así se hace hoy
En un ALV, la navegación desde una línea se programa con el evento DOUBLE_CLICK o con botones propios: tienes el ejemplo completo en el apartado 2.4 del capítulo anterior. No hace falta HIDE: el evento recibe el número de fila y se lee la tabla interna.
En una app Fiori elements la navegación al detalle viene sola: basta con definir la página de objeto en las anotaciones de la vista CDS.
Texto original del manual: sintaxis clásica
- HIDE f1 [, f2, … fn].
Almacena en memoria interna (“área hide”) el contenido de una línea de un listado interactivo (la línea actual, la del cursor), mientras ésta es mostrada. Se puede hacer incluso con líneas que no sean visualizadas en pantalla. Se usa en el evento AT LINE-SELECTION, que es el momento en el que el usuario hace doble clic sobre alguna línea del listado interactivo. Así, con esta sentencia se puede conocer (leer) la línea que el usuario ha elegido. Los f1 … fn son los campos que se están imprimiendo en pantalla, susceptibles de que el usuario los seleccione (los que deben “recordarse”).
HIDE debe codificarse justo después del WRITE que muestra el campo o variable a guardar en memoria, o bien el WRITE que muestra la línea correspondiente (si concretamente esa variable no se va a visualizar). El “área hide” es una tabla con tantas filas como líneas tiene el listado, y 2 campos o columnas por línea (y por campo a almacenar): variable - contenido. Aquí se guarda el valor de la variable dada, para cada línea del listado. - WINDOW STARTING AT x1 y1 ENDING AT x2 y2.
Muestra el listado secundario (detallado) en una ventana nueva aparte. (x1, y1) son las coordenadas (en (columnas, líneas), no en pixels) de la esquina superior izquierda de la ventana, y (x2, y2) son las coordenadas de la esquina inferior derecha. Se pueden crear status (menús, botones, …) específicos para las ventanas, pero entonces no aparecerá el menú estándar ni la barra de herramientas (esas funciones básicas quedarán desactivadas) salvo que se definan de nuevo. El status a crear para una ventana debe ser del tipo “ventana de diálogo”, no “lista”. Soporta todas las funciones de los listados secundarios. SET PF-STATUS status EXCLUDING código | tabla [ IMMEDIATELY ].
- Uso:Activa un nuevo status en pantalla. Un status es un conjunto de puntos de menú, botones, iconos, teclas de función … que se definen de forma específica para una(s) pantalla(s) de un programa o informe. Algunos de estos elementos existen siempre activos en todo status de forma predefinida, pero pueden desactivarse. Cada punto de menú, botón, … debe tener definido su propio código, distintos todos entre sí, para que por programa pueda saberse cuál se ha pulsado (mediante eventos como AT PF n, AT USER-COMMAND). Se pueden incluir funciones estándar, iconos, … Para la barra de menú se pueden además “incorporar normas”.
- Creación de un status, por menú: Herramientas – Workbench Abap 4 – Menu Painter – Status (o bien haciendo doble clic sobre el nombre del status a crear, una vez escrita la sentencia SET PF-STATUS). Al finalizar el diseño del status, grabarlo y activarlo. En el programa, antes de mostrar el listado, poner la sentencia SET PF-STATUS name_status (hasta 20 caracteres) para que éste aparezca en pantalla.
- Desactivación o exclusión de funciones (aparecerán en gris y no se podrán pulsar): para ello se usa la opción EXCLUDING. Tras EXCLUDING puede especificarse, o bien un código concreto, o bien una tabla en la cual en cada entrada se ha guardado uno de los códigos a desactivar (para el caso de que haya que excluir varios). Esto hace los status creados mucho más reutilizables. Con IMMEDIATELY se activa el status sólo en la pantalla actual, y tras pasar a otra vuelve a activarse el status principal.
- Uso:Activa un nuevo status en pantalla. Un status es un conjunto de puntos de menú, botones, iconos, teclas de función … que se definen de forma específica para una(s) pantalla(s) de un programa o informe. Algunos de estos elementos existen siempre activos en todo status de forma predefinida, pero pueden desactivarse. Cada punto de menú, botón, … debe tener definido su propio código, distintos todos entre sí, para que por programa pueda saberse cuál se ha pulsado (mediante eventos como AT PF n, AT USER-COMMAND). Se pueden incluir funciones estándar, iconos, … Para la barra de menú se pueden además “incorporar normas”.
- SET TITLEBAR número_de_título [ WITH g1 … g9].
Inserta un título de pantalla, para la barra de títulos de la ventana de Windows. Para crearlo, por menú: Herramientas – Workbench Abap 4 – Menu Painter – Lista Títulos. Dar el nombre del programa asociado, crear, escribir el título, grabar y activar (pues es un objeto SAP autónomo, no es un atributo interno del programa). Para que aparezca en pantalla, escribir: SET TITLEBAR número_de_título. (es un código de hasta 20 caracteres que se refiere a una línea de texto almacenado en la Lista de Títulos). Esta sentencia debe ir antes del primer WRITE que constituya el listado. Con WITH se pueden introducir hasta 9 parámetros actuales g1 ... g9, que sustituirán a los actuales &1 ... &9. - READ LINE linea [ INDEX índice ] [ FIELD VALUE f1 [ INTO g1 ] … fn [ INTO gn ] ][ OF CURRENT PAGE | OF PAGE p].
En su forma básica, lee el contenido de una línea del listado: por defecto es la actual (SY-LILLI), donde se activó el evento AT LINE-SELECTION (esta sentencia debe usarse tras seleccionar una línea); o la de número de línea indicado en el parámetro INDEX. Dicho contenido se almacena como string en el campo del sistema SY-LISEL. Además, pone ese valor en el leído en el campo f de un HIDE f, si hay. Devuelve un valor de retorno en SY-SUBRC (0 si la lectura fue correcta, 4 si hubo algún error, como que no haya línea para leer). Con FIELD-VALUE, en lugar de recorrer la línea como un string, la lee “partida” en las variables especificadas fi, o en las gi si se usa INTO. Con OF CURRENT PAGE se indica leer de la página actual, y con OF PAGE p se especifica la página donde está la línea a leer. MODIFY LINE n [ INDEX índice | OF CURRENT PAGE | OF PAGE p ] [ modifics. ].
Modifica el contenido de la línea n del listado, poniendo su contenido en el campo del sistema SY-LISEL (que también puede modificarse con asignaciones). Devuelve código de retorno 0 si la operación fue correcta, y distinto de cero en otro caso. En modificadores puede especificarse un nuevo color, nuevo formato, ...
Ejemplo:ABAP * INPUT OFF indica campo de sólo lectura MODIFY LINE 3 LINE FORMAT INPUT OFF COLOR = c.
SCROLL LIST [ parámetros ].
Realiza el scroll de parte o de todo un listado, mediante programa. Permite desplazarnos por la lista, mediante unas barras de desplazamiento. Devuelve código de retorno cero si el desplazamiento fue correcto, y distinto de cero en otro caso. Esta sentencia tiene muchas variantes, como: TO FIRST PAGE, TO LAST PAGE, TO PAGE pag, TO COLUMN col, FORWARD, BACKWARD, LEFT, RIGHT. También tiene muchos parámetros, como INDEX nº lista y LINE nº línea (todas las variantes de scroll los admiten).DESCRIBE LIST NUMBER OF LINES líneas PAGES pags [ INDEX índice ].
Esta sentencia es útil para conocer el número total de páginas del listado, número de líneas, … Con el parámetro INDEX se especifica de qué listado se leen esos datos.DESCRIBE LIST [ LINE línea ] PAGE pag [ INDEX índice ] [ opciones ].
Devuelve el número de línea y de la página (actuales) del listado dado. Las opciones pueden ser: LINE-SIZE nº cols, LINE-COUNT nº filas, ...GET CURSOR FIELD f [ OFFSET var ] [ LINE línea ] [ VALUE val ] [ LENGTH long ].
Devuelve dónde está el cursor en el listado interactivo. (Para colocar el cursor se usa SET CURSOR FIELD f [ LINE línea ] [ OFFSET pos ].) Transfiere a la variable f el nombre (no el valor) de la variable donde se posicionó el cursor en el listado. Devuelve 0 en SY-SUBRC si la operación fue correcta, y distinto de cero en otro caso. Si el cursor no se posiciona en una variable, sino en una constante, variable local o literal, SY-SUBRC sigue valiendo cero, pero en la variable f se guarda SPACE (un blanco).- Parámetros: Todos usan variables de salida (para recoger información). Con OFFSET se recoge la posición del cursor en un campo concreto. Con LINE se obtiene la línea donde se posicionó el cursor, con VALUE el valor de ese campo, y con LENGTH la longitud de salida del campo (la longitud del substring mostrado, no la longitud de la definición del mismo).
- Uso:Esta sentencia se usa si el cursor queda dentro del área visible del listado (normalmente éste será mayor que lo que cabe en pantalla). Si no, no tiene efecto (se debería usar antes SCROLL LIST para mover el área de visualización). El cursor puede posicionarse en líneas WRITE y SKIP, pero no sobre ULINE’s.
Ejemplos (otras variaciones de la sentencia):
ABAP SET CURSOR col line. " no tiene 'FIELD' SET CURSOR LINE line [ OFFSET col ]. " col: nº columna a posicionarse
- Parámetros: Todos usan variables de salida (para recoger información). Con OFFSET se recoge la posición del cursor en un campo concreto. Con LINE se obtiene la línea donde se posicionó el cursor, con VALUE el valor de ese campo, y con LENGTH la longitud de salida del campo (la longitud del substring mostrado, no la longitud de la definición del mismo).
- GET CURSOR LINE f [ OFFSET variable ] [ VALUE val ] [ LENGTH long ].
Devuelve la posición del cursor, en pantallas o listados. Se obtiene el número de línea en la que se posicionó el cursor, para prevenir la selección de líneas no válidas del listado. Los parámetros son como en la sentencia GET CURSOR FIELD. - SET USER-COMMAND código.
Sólo para listados interactivos. Se usa para forzar la ejecución de un comando, definido en un menú o status, sin que el usuario lo desencadene. Mueve dicho código al campo SY-UCOMM.
4.3. Sentencias para impresión en papel
Se escribe distinto
Así se hace hoy
El ALV se puede imprimir y enviar al spool sin programar nada. Para documentos con diseño (facturas, pedidos, albaranes) se usan formularios:
| Necesitas… | Usa |
|---|---|
| Imprimir o guardar el listado | Botón de impresión del ALV o ejecución en fondo con spool |
| Un documento con diseño | Formularios Adobe (ver Adobe Forms) |
| Mantener formularios antiguos | SAPscript o Smartforms (ver comparativa) |
Texto original del manual: sintaxis clásica
- NEW-PAGE PRINT
- SET MARGIN
- PRINT-CONTROL
- SUBMIT report TO SAP-SPOOL [ parámetros de impresión ].
Ejecuta el report indicado y envía su listado al spool de impresión (con nº de copias, nº de lista, título, autorización, ...). Para acceso al spool de la impresora se puede ir por el menú: Sistema – Servicios – Control de impresión.