Programación de diálogo
Transacciones con pantallas propias: dynpros, module pools y la lógica de proceso PBO y PAI.
- Manual ABAP
- 14 de 14
- Anterior
- Procesos en fondo (jobs)
Antes y ahora
La programación de diálogo con dynpros sigue funcionando en SAP GUI y se sigue manteniendo, pero SAP no la evoluciona: no existe en ABAP Cloud ni funciona en el navegador o el móvil sin SAP GUI. Las aplicaciones nuevas se hacen con RAP y Fiori elements.
| Concepto | En el manual | Hoy | Estado |
|---|---|---|---|
| Aplicación | Module pool y transacción | Objeto de negocio RAP y servicio OData | Sustituido |
| Diseño de la pantalla | Screen Painter | Página generada a partir de anotaciones @UI | Sustituido |
| Validar datos | FIELD … MODULE en el PAI | Validaciones de RAP | Sustituido |
| Botones | CASE ok_code | Acciones de RAP | Sustituido |
| Campos que cambian | LOOP AT SCREEN en el PBO | Campos calculados y feature control | Sustituido |
| Bloqueos | ENQUEUE_… a mano | Bloqueo automático de RAP y borradores | Sustituido |
Sigue igual: los dynpros existentes en SAP GUI, SAP GUI for HTML para abrirlos en el navegador o en el launchpad de Fiori.
14.1. Introducción
Sustituido
Así se hace hoy
| Programación de diálogo | RAP y Fiori elements |
|---|---|
| Module pool y transacción | Objeto de negocio RAP y servicio OData |
| Pantalla diseñada en el Screen Painter | Página generada a partir de anotaciones @UI |
PBO: rellenar campos y LOOP AT SCREEN | Campos calculados y feature control |
PAI: FIELD … MODULE para validar | Validaciones de RAP |
CASE ok_code para cada botón | Acciones de RAP |
| Table control | Tabla de Fiori elements o de UI5 |
| GUI status (SE41) | Barra de herramientas generada desde las acciones |
Si mantienes dynpros, SAP GUI for HTML permite abrirlas en el navegador y añadirlas al launchpad de Fiori como un mosaico más.
Texto original del manual: sintaxis clásica
- Un diálogo no es más que una pantalla (dynpro) más un programa ABAP subyacente que actúa según las elecciones del usuario (meter datos, elegir comandos, ...) sobre la pantalla presentada. Una transacción llama al proceso de programa asociado. Por tanto, en programación de diálogo se usan diversos objetos: transacciones, dynpros y programas ABAP tipo M (module pool).
- Para crear una transacción: por menú ir a Desarrollo – Más Herramientas – Transacciones, o directamente > SE93 Y pulsar el icono de crear (una hoja en blanco). Su nombre debe empezar por Z o Y y puede tener hasta 20 caracteres. Indicar “transacción de diálogo”). Luego, en “programa”, indicar el nombre del module pool a ejecutar cuando se invoque a la transacción, así como el número de la primera dynpro a visualizar. Para cada dynpro a mostrar hay que especificarla cuál va a ser la siguiente, si existe. Si no, se debe poner 0 como dynpro siguiente.
- Las dynpro’s se crean y editan con el Screen Painter. Pueden tener botones, menús, iconos, marcos, flags, ... (eso es el “screen layout”: la disposición visual de los campos en la pantalla). Se crean y agrupan como se desee con el botón Elemento Gráfico. Yendo a Status (una vez dentro del Screen Painter) pueden verse todas las características del programa module pool. Con el botón Atributos se pueden ver los atributos del campo seleccionado. En los textos (labels) de una dynpro hay que escribir los blancos como subrayados para que se tome el texto como único. Una vez creada una pantalla o dynpro, debe activarse tras grabarla (como todo objeto SAP).
- Por detrás de la dynpro habrá eventos que se activarán si los usuarios los eligen. Hay 2 eventos que siempre existen: PBO (Process Before Output: Procesos que se ejecutan siempre antes de que se muestre la dynpro por pantalla) y PAI (Process After Input: Procesos que se ejecutan una vez que el usuario ha elegido la acción a realizar). En un diálogo, una variable o campo que cambie el usuario, queda cambiada en el programa, y viceversa.
- Un module pool es un programa ABAP tipo M. Los estándar de SAP se llaman SAPMXXXX, siendo XXXX la transacción asociada. Estos programas sólo contienen sentencias INCLUDE, como ocurre con los grupos de funciones. Al menos existirán estos 3 includes: un ‘TOP’ para las variables globales, tablas, ... un ‘O’ para los procesos PBO, y un ‘I’ para los procesos PAI. En el include ‘TOP’ hay que declarar siempre la sentencia: DATA ok_code TYPE sy-ucomm, que se usa para recoger el código del comando seleccionado por el usuario. Los otros 2 includes obligatorios son, salvo por las sentencias MODULE y ENDMODULE, programas includes normales.
- Al llamar a una transacción, se ejecutan todos los módulos que hay en el PBO (se añade OUTPUT a la sentencia MODULE), en el orden en que estén escritos. A continuación se muestra la pantalla dynpro al usuario. Cuando éste elige un comando, se ejecutan los procesos PAI correspondiente y sus módulos asociados (puede pasarse a una nueva dynpro). En este include conviene codificar siempre un módulo para poder abandonar la ejecución del diálogo cuando se desee. Debería ser el primer proceso de los PAI. Pueden usarse los mismos includes PAI y PBO para todas las pantallas en las que se haga lo mismo (así, se comparten).
14.2. Sentencias de lógica de proceso de dynpros
Sustituido
Así se hace hoy
La validación de un campo, que en un dynpro va en el PAI, en RAP es una validación del objeto de negocio. Funciona igual desde una app Fiori, desde una API o desde otro programa:
PROCESS AFTER INPUT.
FIELD gs_pedido-kunnr MODULE validar_cliente.
MODULE validar_cliente INPUT.
IF gs_pedido-kunnr IS INITIAL.
MESSAGE 'Indica el cliente' TYPE 'E'.
ENDIF.
ENDMODULE.METHOD validarCliente.
READ ENTITIES OF zi_pedido IN LOCAL MODE
ENTITY Pedido FIELDS ( Cliente ) WITH CORRESPONDING #( keys )
RESULT DATA(lt_pedidos).
LOOP AT lt_pedidos INTO DATA(ls_pedido) WHERE Cliente IS INITIAL.
APPEND VALUE #( %tky = ls_pedido-%tky ) TO failed-pedido.
APPEND VALUE #( %tky = ls_pedido-%tky
%msg = new_message_with_text(
text = 'Indica el cliente' ) )
TO reported-pedido.
ENDLOOP.
ENDMETHOD.Texto original del manual: sintaxis clásica
- Para poder procesar un módulo AT EXIT-COMMAND, ir por menú a Pasar a – Lista de funciones – tipo E. Generar y activar. En Screen Painter – Lista de elementos renombrar como OK_CODE al campo llamado OK, para que quede ya esta variable declarada, directamente. Para el resto de campos, si se declaran LIKE campos del Diccionario de Datos no será necesario codificar nada, pues todo se ‘importa’ de éste.
- Hay que usar un status (‘para dynpros’, no ‘para listas’) para poder tener activos en la pantalla los iconos por defecto. En el editor de procesos dynpro sólo puede haber ciertas sentencias, como declaraciones de módulos; no es un editor ABAP completo. Sólo se pueden usar éstas:
Sentencias PROCESS (4 tipos. Pueden existir ya procesos por defecto):
- PROCESS BEFORE OUTPUT. Evento P.B.O.
- PROCESS AFTER INPUT. Evento P.A.I.
- PROCESS ON HELP-REQUEST. Sólo se ejecuta cuando el usuario pulsa ayuda (F1).
- PROCESS ON VALUE-REQUEST. Se ejecuta al pulsarse el botón matchcode de valores posibles (F4).
- Sentencia FIELD:
FIELD campo[ VALUES ( lista_valores ) ] [ MODULE nombre_módulo] [ ON INPUT ][ ON REQUEST ].
Chequea que el valor del campo (de una dynpro) sea uno de los especificados en VALUES (van separados por comas. Los paréntesis son obligatorios). Con el parámetro MODULE se pueden enviar mensajes de error al usuario, y se procesa el módulo especificado.
Ejemplo:
FIELD sbook-carrid VALUES ('AA', 'LH', 'VS').- Bloque de proceso:
CHAIN. … ENDCHAIN.
Puede usarse en combinación con los parámetros ON CHAIN-INPUT y ON CHAIN-REQUEST de la sentencia MODULE.
Ejemplo:
CHAIN.
FIELD campo1.
FIELD campo2.
MODULE modulo1.
MODULE modulo2.
ENDCHAIN.- Llamadas condicionales a un módulo:
MODULE nombre_módulo[ AT EXIT-COMMAND ] [ ON INPUT ] [ ON *-INPUT ][ ON REQUEST ] [ ON CHAIN-INPUT ] [ ON CHAIN-REQUEST ][ AT CURSOR-SELECTION ] [ INPUT ] [ OUTPUT ].
Un módulo se compone de las sentencias declarativas de un proceso.
Parámetros:
- AT EXIT-COMMAND: Necesita código tipo E.
- FIELD … MODULE … ON INPUT: Se ejecuta sólo cuando el usuario introduzca un valor. Con ello en un PAI se evitan ejecuciones innecesarias del módulo especificado.
- FIELD … MODULE … ON *-INPUT: Se lanza cuando el valor que escribe el usuario empieza por un asterisco.
- FIELD … MODULE … ON REQUEST: Se ejecuta si el usuario pulsa el botón de valores posibles (matchcode) en el campo especificado en FIELD.
- OUTPUT: Indica que ése es el módulo que se lanza en el PBO.
- INPUT: Indica que ése es el módulo que se lanza en el PAI. No confundir con ON INPUT.
Ejemplo: Se ejecutará el módulo ‘nombre1’ sólo cuando cambia el valor de ‘a’, ‘b’ o ‘c’; mientras que el módulo ‘nombre2’ se ejecuta siempre.
CHAIN.
FIELD: a,b,c MODULE nombre1 ON CHAIN-INPUT.
MODULE nombre2.
ENDCHAIN.Sentencias útiles de module pool (no son para procesos dynpros):
- SET SCREEN n. Va a la pantalla número n.
- LEAVE SCREEN. Abandona la pantalla y los procesos asociados.
- LOOP AT SCREEN. … ENDLOOP. Bucle que recorre todos los elementos definidos en la pantalla, los cuales se almacenan en la tabla del sistema llamada SCREEN. Algunos de sus campos son: screen-name (usando un CHECK screen-name = ‘nombre’ se elige el campo a procesar), screen-input (si vale 1, se puede escribir en el campo; si vale 0, el campo es solo de salida y no se puede modificar), screen-output (indica campo de sólo salida), screen-group1 (elige el grupo especificado de campos).
MODIFY SCREEN [ parámetros ]. Dentro de un LOOP AT SCREEN, modifica ciertas características de los campos de pantalla, como por ejemplo ocultarlos, hacerlos obligatorios, no editables, … (según los parámetros elegidos). Codificar esta sentencia en el PBO, para que tenga efecto antes de mostrar la pantalla.
Ejemplo:ABAP LOOP AT SCREEN. " recorre todos los campos de la pantalla CHECK screen-name = 'campo1'. " elige este campo screen-input = 0. " El campo1 pasa a ser solo de salida (no editable) MODIFY SCREEN. " modifica el campo ENDLOOP.
- SET SCREEN n. Va a la pantalla número n.
Para seguir
- Aplicaciones nuevas: RAP y Fiori.
- Si mantienes dynpros: table control y la SE51.