Ir al contenido
Programación ABAP

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

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.

ConceptoEn el manualHoyEstado
AplicaciónModule pool y transacciónObjeto de negocio RAP y servicio ODataSustituido
Diseño de la pantallaScreen PainterPágina generada a partir de anotaciones @UISustituido
Validar datosFIELD … MODULE en el PAIValidaciones de RAPSustituido
BotonesCASE ok_codeAcciones de RAPSustituido
Campos que cambianLOOP AT SCREEN en el PBOCampos calculados y feature controlSustituido
BloqueosENQUEUE_… a manoBloqueo automático de RAP y borradoresSustituido

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álogoRAP y Fiori elements
Module pool y transacciónObjeto de negocio RAP y servicio OData
Pantalla diseñada en el Screen PainterPágina generada a partir de anotaciones @UI
PBO: rellenar campos y LOOP AT SCREENCampos calculados y feature control
PAI: FIELD … MODULE para validarValidaciones de RAP
CASE ok_code para cada botónAcciones de RAP
Table controlTabla 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).

PBOPROCESS BEFORE OUTPUTPantalla visibleel usuario escribe y pulsaPAIPROCESS AFTER INPUTSiguiente pantallaSET SCREEN · LEAVE TO SCREENPBO: SET PF-STATUS, rellenar campos,LOOP AT SCREEN para ocultar o bloquearPAI: FIELD … MODULE para validar,CASE ok_code para cada botón
Cada vez que el usuario pulsa una tecla, se ejecuta el PAI de la pantalla actual y después el PBO de la siguiente (que puede ser la misma).

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:

Antes
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.
Ahora
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:

ABAP
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:

ABAP
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.

ABAP
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.

Para seguir