SAP: ABAP Manual Básico (2.-FLUJO DEL PROGRAMA)


FLUJO DE UN PROGRAMA ABAP/4

2.1. Control interno y externo

2.2. Expresiones lógicas y operadores

2.3. Sentencias Abap/4 de eventos (CONTROL EXTERNO)

2.4. Eventos para reports interactivos

2.5. Sentencias de control de flujo (INTERNO)

2.1. Control INTERNO Y externo:

    • El flujo de un programa puede controlarse de forma interna (con las sentencias típicas de control de flujo) o externa (con eventos).
      Flujo: Base de datos lógica programa Abap/4 pantalla de selección PBO, PAI e informe básico de informe secundario

2.2. EXPRESIONES LÓGICAS Y OPERADORES:

Las expresiones lógicas típicas son de la forma:operando1 operador operando2, y devuelven un valor TRUE o FALSE. Las expresiones lógicas simples se pueden combinar con AND, OR y NOT, parentizando adecuadamente (el primer nivel no es necesario). Los tipos de operadores en Abap/4 son:

  • Para todo tipo de datos:
    EQ ó =, NE ó <> ó ><, LT ó <, LE ó <=, GT ó >, GE ó >=.
  • Para tipos alfanuméricos y numéricos:
    Se usan para comparaciones, aparte de los anteriores. CO (contiene sólo …), CN (no contiene sólo …), CA (contiene algún …), NA (no contiene algún …) , CS (contiene el string …), NS (no contiene el string …), CP (contiene el pattern …), NP (no contiene el pattern …).
  • Para bits:
    O (los bits son “1”), Z (los bits son “0”), M (los bits son “0” y “1”).
  • Operaciones lógicas especiales:
    Rango: operando1 BETWEEN operando2 ANDoperando3. Los valores límite del rango[ operando1, operando2 ] son inclusive. Esta operación lógica devuelve cierto sí y sólo sí operando2 <= operando1 <= operando3.Valor inicial: operando IS INITIAL. Para saber si el valor de operando es el inicial por defecto o no. Para números el valor inicial es 0; para caracteres y cadenas es SPACE(es un string todo en blanco, de la longitud necesaria en cada caso (en particular puede ser cero o uno). Útil para hacer comparaciones).Criterio de selección: operando IN criterio_selección. Para saber si el valor de operando está dentro o no del criterio especificado. Muy usado en los CHECK’s y en los SELECT … WHERE … El criterio de selección recoge la información que el usuario ha introducido en un SELECT-OPTION.

2.3. Sentencias Abap/4 de eventos (CONTROL EXTERNO):

Cada evento posible es capturado por la sentencia correspondiente. Un programa Abap/4 no es más que un conjunto de bloques de proceso, cada uno correspondiente a un evento (por tanto, no se ejecutan secuencialmente). Dichas sentencias son: INITIALIZATION, START-OF-SELECTION, END-OF-SELECTION, GET[LATE], TOP-OF-PAGE, END-OF-PAGE, AT SELECTION-SCREEN, AT LINE-SELECTION, AT PFn, AT USER-COMMAND (estos tres últimos son eventos específicos para reports o listados interactivos).

    • INITIALIZATION.
      Se ejecuta siempre antes de que aparezca la pantalla de selección, una sola vez. Se usa para inicializar parámetros y criterios de selección. Ejemplo:

      PARAMETERS fecha TYPE D DEFAULT sy-datum.
      
      INITIALIZATION.
            fecha+6(2) = '01'. fecha = fecha – 1.
      
      START-OF-SELECTION.
            WRITE fecha.


      El tipo D indica tipo fecha (8 caracteres. En este caso con el formato aaaammdd); con DEFAULT se indica el valor inicial por defecto (en este caso es la fecha de hoy, que se obtiene del campo del sistema SY-DATUM). Offsets: fecha+6(2) selecciona desde el carácter 6 de la cadena fecha, los 2 siguientes (el primer carácter es el 0). Así selecciona el día dentro de la fecha. También, con fecha(n) se obtiene el carácter n-ésimo de ese string. La función STRLEN (campo) devuelve la longitud de salida de ‘campo’ (no el máximo declarado, sino el valor ‘relleno’). Por tanto, este programa devuelve la fecha del último día del mes anterior a la actual (el cual se calcula bien, ya sea 30, 31 ó 28).

      Otro ejemplo:

      TABLES kna1.
      
      SELECT-OPTIONS cliente FOR kna1-kunnr.
      
      INITIALIZATION.
         MOVE 'I'      TO cliente-sign.
         MOVE 'EQ'     TO cliente-option.
         MOVE 'I56000' TO cliente-low.
      
         APPEND cliente.


    • El select-options permite meter un rango de valores para cliente, en lugar de uno solo. Adicionalmente pueden introducirse varios valores individuales, o varios intervalos. El valor ‘i’ para el campo sign indica que el valor está incluido; ‘eq’ indica seleccionar los valores que sean iguales, es decir, los que coincidan con el criterio de selección introducido.
  • START-OF-SELECTION.
    Bloque de proceso que se ejecutará tras procesar la pantalla de selección (después de INITIALIZATION), y antes de acceder a las tablas de la base de datos lógica, para empezar a escribir la salida (normalmente un programa Abap hará uso de una o más bases de datos lógicas, que son programas estándar que acceden las tablas SAP de forma simple yjerárquica). En este evento tiene lugar la selección de datos por parte del usuario.
  • END-OF-SELECTION.
    Se activa tras procesar todas las tablas de la base de datos lógica (que se acceden en/con el evento GET), o tras finalizar elSTART-OF-SELECTION si no se usan éstas.
  • GET tabla[ LATE ] [ FIELDS c1 c2 …].
    Llama al programa de la base de datos lógica, y devuelve la entrada leída de la tabla especificada. Con LATE, GET se activa cuando se han procesado todas las tablas jerárquicamente inferiores a la dada (las tablas se organizan en árbol, y se van recorriendo pasando por ellas hasta alcanzar el dato a leer). SinLATE, GET se dispara al leer la primera tabla; conLATEespera a recorrer la rama del árbol de tablas. SinFIELDS se leen todos los campos; conFIELDS sólo se leen los campos especificados, aparte de los clave.
  • TOP-OF-PAGE [ DURING LINE-SELECTION ].
    Se activa justo antes de imprimir la página actual (antes del primerWRITE). Sirve para escribir cabeceras de páginas y títulos. Se ejecuta antes de la primera línea de cada página. Sin la opción DURING LINE-SELECTION, se activa sólo en el informe básico; con esta opción, se activa además en los informes secundarios. La sentencia END-OF-PAGEno activa este evento, pero NEW-PAGE sí lo activa.
  • END-OF-PAGE.
    Se activa si se alcanza el área de la página reservada para este evento (con la opción LINE-COUNT en PROGRAM o REPORT) al final de la página; si no hay área definida, no se activa el evento. Con RESERVE n LINES se reservan n líneas al final de la página para escribir el pie de página. La sentencia NEW-PAGEno activa este evento.
  • AT SELECTION-SCREEN [varios parámetros ].
    Bloque de proceso que se activa mientras se procesa la pantalla de selección, o bien después de ésta (PAI). Según sus parámetros, se activará cuando el usuario realice cierta acción en la pantalla de selección, como dar valor a un SELECT-OPTIONS. Por tanto, se usa para controlar los datos que introduce el usuario, y sólo tiene sentido en reports. Parámetros: ON RADIOBUTTON GROUP grupo, ON criterio_selección, ONBLOCK bloque, ON END OF criterio_ selección, ON VALUE REQUEST FOR criterio_selección, ON OUTPUT(se ejecuta el evento cada vez que se pulse Enter en la pantalla de selección, mientras que el evento INITIALIZATION sólo se ejecuta una vez, esa es la diferencia).

2.4. EVENTOS PARA REPORTS INTERACTIVOS:

Los listados interactivos se muestran igual por pantalla que los normales (la lista básica. Se puede usar un modelo estándar de listado, y adaptarlo a cada report concreto), salvo que en ellos el usuario puede lanzar una(s) lista(s) secundaria(s) en función del (los) evento(s) que active. La lista secundaria machaca en pantalla la lista primera. Pueden generarse como mucho 20 nuevos listados, salvo que se use la sentencia WINDOW para crear una ventana nueva para el nuevo listado. Sentencias o eventos propias de estos listados:

    • AT LINE-SELECTION.
    • Para reports interactivos: el usuario puede seleccionar elementos de la lista mostrada. Se activa si el usuario selecciona (pick-up: doble clic) una línea del informe (generada por WRITE, ULINE, SKIP, … Pueden incluso seleccionarse líneas en blanco o no válidas: el programa debe discriminarlas), y sólo tras mostrar el informe básico, o bien pulsando F2 o por menú Edit – Choose. Se usa para ver información asociada al elemento seleccionado.
    • AT PFn.
    • Se activa al ser pulsada la tecla de función Fn especificada (n va de 0 a 99), y sólo tras mostrar el informe básico. Sin crear un status específico, se pueden usar las funciones Fn que no estén ya predefinidas (como son F1 para la ayuda o F3 para back); el código de la tecla Fn pulsada se guarda en SY-UCOMM. Pero este evento debería usarse sólo para probar el programa; para su versión final usar AT USER-COMMAND.
    • AT USER-COMMAND.

Se procesa si el usuario activa un comando, asociado a un icono, botón o elemento de menú, en un status específico, y sólo tras mostrar el informe básico. Una vez disparado el evento es cuando se puede decidir qué comando se ha pulsado, consultando el campo del sistema SY-UCOMM.

Para que el evento TOP-OF-PAGE se active en un listado secundario (así como las cabeceras estándar), debe tener el parámetro DURING LINE-SELECTION. En cambio sí funciona el END-OF-PAGE. Dentro de uno de estos 3 eventos propios de los listados interactivos, usar IF o CASE para decidir las acciones a realizar, en lugar de intentar activar otros eventos. Los siguientes campos del sistema (tabla SYST) pueden servir para controlar el flujo de programa:

    • SY-LSIND: Número del listado (el básico es el nº 0), aunque esté en una ventana diferente.
    • SY-LISTI: Nº de la lista en la que se activó el evento.
    • SY-LILLI: Nº de línea de la lista en la que se activó el evento.
    • SY-LISEL: Contenido de la línea en la que se activó el evento.
    • SY-CUROW: Posición de la línea en la que se activó el evento.
    • SY-UCOMM: Código de función que activó el evento.
    • SY-PFKEY: Status de la lista.

Dentro de ellos NO se pueden codificar sentencias / eventos GET para acceder a bases de datos lógicas (deberá hacerse con SELECT’s), ni hacer SUBMIT’s (llamadas a otros programas).

Se puede volver a la lista anterior con el botón BACK (ç) o bien F3. También se puede fijar un valor para el campo SY-LSIND, y darle el número de lista a la que se debe ir (la básica es la 0). El sistema borra los datos de las listas con número mayor al especificado (con lo que con este método sólo se puede retroceder), las anteriores no. Debe actualizarse SY-LSIND como última sentencia del evento o bloque, para evitar que otras sentencias interfieran y aparezcan problemas.

Pueden asignarse distintos status a las listas secundarias, para crearles botones, menús, … Para ello usar la sentencia SET PF-STATUS nombre [ EXCLUDING f | tabla ]. Con el parámetro EXCLUDING se desactiva en el status dado uno (f) o más (los de la tabla) códigos de función. Así los status pueden hacerse más reutilizables.

Ejemplos:

SET PF-STATUS menu EXCLUDING 'CODE'.    " Exclusión de un único código de función

DATA: BEGIN OF tabla OCCURS 10,         " Se declara una tabla interna normal campo1(4).
DATA: END OF tabla.

MOVE 'CODE' TO tabla-campo1.            " Códigos a excluir
APPEND tabla.

MOVE 'BACK' TO tabla-campo1.
APPEND tabla.

SET PF-STATUS menu2 EXCLUDING tabla.

Hay 3 formas para pasar datos del listado secundario al programa:

    • Usando directamente los campos del sistema SY-LSIND, SY-UCOMM,…
    • Usando sentencias específicas para ello, como HIDE, READ LINE, SET CURSOR FIELD o GET CURSOR LINE.
    • O bien pasando atributos del listado al programa con las sentencias DESCRIBE LIST (NUMBER, LINE o PAGE).

2.5. Sentencias de control DE FLUJO (interno):

Estas sentencias son: IF…, CASE…, DO… y WHILE… Están relacionadas con ellas las sentencias para abandonar bloques de proceso, en particular bucles y sentencias de bifurcación: CONTINUE, CHECK, EXIT.

    • IF condición. bloque [ ELSEIF condición. bloque ] … [ ELSE. bloque ] ENDIF.
    • CASE campo.   WHEN valor. bloque
      WHEN valor. bloque …
      [WHEN OTHERS.] bloque ENDCASE.
    • DO [ n TIMES ] [ VARYING campo FROM v1 NEXT v2 ]. bloque ENDDO.
      Con n TIMES, el bucle da n vueltas, de forma incondicional. Sin esta opción deberá salirse del bucle con EXIT, STOP o REJECT (para salir de un bucle que es infinito). La opción VARYING incrementa el campo, numérico o no, desde el valor inicial v1, con incrementos v2. Ejemplo: (aparece en pantalla: 2, 5, 8, 11, 14: campo1empieza en 2, y avanza de 3 en 3).

      DO 5 TIMES VARYING campo1 FROM 2 NEXT 3.
          WRITE campo1.
      ENDDO.
    • WHILE condición [ VARY campoFROMv1 NEXT v2 ]. bloque ENDWHILE.
      Se repite el cuerpo (bloque) del bucle mientras la condición sea cierta (también se puede salir con EXIT o similar). La opción VARY es análoga a la VARYING de DO.

Acerca de albertoarceti
Administrador de sistemas informáticos, y erps en la industria farmacéutica.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: