Control interno del flujo de un programa 1-14 Lección 1 Tipos de eventos Eventos en programas ejecutables Un report es un programa que realiza las siguientes fases: • Recogida de parámetros (si los hay) mediante la pantalla de selección. • Ejecución del programa en sí. • Presentación de los datos obtenidos en la fase de proceso mediante el listado. INITIALIZATION En este evento sé inicializarían todas las variables de los programas (o al menos aquellas que su ámbito de utilización sea en todo el programa). START-OF-SELECTION Este evento se lanza cuando se procesa la instrucción REPORT.. En ese momento se empieza a ejecutar el código que se encuentra entre REPORT y la palabra STARTOF-SELECTION. Inmediatamente después se procesa el bloque contenido dentro de este evento. Se utiliza cuando hay una selección de datos. Se utiliza siempre, cuando queremos Control interno del flujo de un programa 2-14 cargar los datos, desde una tabla o fichero, para después utilizarlo en el programa. END-OF-SELECTION El código asociado a este evento se procesa cuando se termina la selección de datos de tablas o bases de datos lógicas. Se puede forzar por código la interrupción de la selección de datos con la instrucción STOP. Si en nuestro código se procesa esta instrucción no se leerán más entradas y se procesará inmediatamente el código correspondiente al evento ENDOF-SELECTION. Otra alternativa es usar la instrucción EXIT, que cancela el procesamiento del report y muestra la lista. TOP-OF-PAGE Este evento se procesa antes de que el primer dato salga en cada página. Se suele usar para poner el título a las páginas o cabeceras, en combinación con la opción de la sentencia REPORT ...NO STANDARD PAGE HEADING. Si añadimos la opción ...DURING LINE-SELECTION se ejecutará sólo en listas secundarias que eventualmente se generen como consecuencia de una acción en el Report actual. END-OF-PAGE Este evento se lanza cuando se crea automáticamente una nueva página. Esto ocurrirá cuando el número de líneas procesado sobrepase el número de líneas fijado para la página en la sentencia REPORT, o cuando la sentencia RESERVE n LINES. Después de esta sentencia “RESERVE” se forzará nueva página si en la misma no hay al menos n líneas libres. ‘n’ puede ser una variable o una constante literal. No se procesará END-OF-PAGE si se refuerza nueva página por código (NEWPAGE). AT LINE-SELECTION A partir de la selección de una línea de pantalla (haciendo doble clic) se desencadenan una serie de eventos. Control interno del flujo de un programa 3-14 Nota: La palabra clave REPORT indica el inicio del mismo. Puede tener los siguientes añadidos: No standard page heading Suprime la cabecera estándar en el listado. Line-size <col> Crea un listado con <col> columnas por fila. Line-count n(m) Crea un listado de n líneas por página, y reserva m líneas para el pie de página. Message-id <mid> La clase de mensajes que se van a utilizar es la mid. Ejemplo: El programa muestra un ejemplo de bloques de eventos. La pantalla de selección contiene un valor de entrada para una fecha. El valor por defecto es la fecha actual La adición DEFAULT a PARAMETERS asegura que el objeto de datos se llena con el valor por defecto al principio del programa. Los valores por defecto pueden ser literales o campos de la estructura sy. El sistema en tiempo de ejecución llena el campo sy-datum con la fecha actual al comienzo del programa. Podemos usar el bloque de evento INITIALIZATION para cambiar las variables en tiempo de ejecución pero antes de que la pantalla de selección estándar se lance. START-OF-SELECTION es un bloque de evento para la creación de listados.Todas las declaraciones globales son reconocidas por el sistema por las palabras claves ABAP, y, de la misma forma, un bloque de proceso lógico (independientemente de dónde se haya situado en el programa). Las declaraciones se deben situar juntas al principio del programa. PARAMETERS es uno de los elementos que se usan para Control interno del flujo de un programa 4-14 hacer las declaraciones. Cuando se genera el programa, se genera también una pantalla de selección. El ejemplo más fácil de entender es para programas ejecutables. El sistema ABAP en tiempo de ejecución llama a los bloques de eventos en una secuencia designada: Primero, se llama al bloque de evento INITIALIZATION. Se lanza la pantalla de selección al servidor de presentación. Después de la pantalla de selección se llama a START-OF-SELECTION.Si el evento START-OF-SELECTION contiene un WRITE, SKIP o ULINE, se llena una buffer de listado.Después dicho buffer se envía al servidor de presentación. Eventos en pantallas (se verá más adelante en profundidad) AT USER-COMMAND Cuando hay un botón de selección y lo seleccionamos, a partir de su selección, se desencadenan unas acciones. AT SELECTION-SCREEN Define la pantalla de selección, tal como se presenta al usuario. Al hacer un enter o confirmar una pantalla de selección se ejecutan las órdenes que haya a continuación. Tiene las siguientes opciones: Control interno del flujo de un programa 5-14 - Podemos hacer que cuando se pulse F4 se ejecute las instrucciones que contenga el AT SELECTION-SCREEN. La sintaxis es la siguiente: AT SELECTION-SCREEN ON VALUE REQUEST FOR campo. Este “campo” suele ser un nombre de campo que se pide con la orden PARAMETERS. - OUTPUT -> con esta opción hacemos que se ejecute este evento antes de que se visualice la pantalla, por ejemplo, cambiar los atributos de unprograma. Existe dentro de la programación con dynpros la siguiente modulación: La sentencia ABAP CALL SCREEN <nnnn> interrumpe el bloque de procesos y llama a una pantalla. Cada pantalla tiene 2 bloques de eventos: • PROCESS BEFORE OUTPUT (PBO) se procesa inmediatamente antes que la pantalla es visualizada, en este momento los “Modules” son llamados, ellos cuidan que ciertas tareas se hagan correctamente. • PROCESS AFTER INPUT (PAI) se procesa inmediatamente después de una acción del usuario. Toda la lógica del programa que tiene que ocurrir debido a una acción del usuario tiene que estar en el PAI. Nota: El código para los eventos PBO y PAI es escrito en el screen painter no en el ABAP Editor. <ABAP module name> es el más importante comando de pantallas ABAP. Llama a un bloque de procesos especial llamado module. Control interno del flujo de un programa 6-14 Los Modules son bloques de procesos ABAP sin interfaces, que solo pueden ser llamados desde dentro del flujo lógico del programa. “Modules” empiezan con la sentencia MODULE y acaban con ENDMODULE. Subrutinas Ver Modulación Control interno del flujo de un programa 7-14 Lección 2 Tipos de lectura Lectura de una tabla interna mediante un loop Se puede leer y corregir el contenido de una tabla interna usando una declaración LOOP. En este ejemplo, una línea se copia de la tabla interna it_flightinfo a la estructura wa_flightinfo. Los campos de la estructura pueden entonces ser corregidos. Se puede crear una lista de los campos usando una declaración WRITE. Si se desea cambiar el contenido de la tabla interna, primero hay que cambiar el valor de los campos de la estructura dentro del LOOP y en luego sobrescribir la línea de la tabla interna con la declaración MODIFY. Control interno del flujo de un programa 8-14 Lectura de una tabla interna usando un índice EJEMPLO DE SINTAXIS: LECTURA UTILIZANDO EL ÍNDICE Dentro del LOOP, se puede restringir el acceso a ciertas líneas utilizando la declaración FROM-TO. En el ejemplo superior, el sistema solo trabaja con las cinco primeras líneas de la tabla. Se puede utilizar la sentencia READ TABLE para leer un registro único. Se utiliza el declaración INDEX para especificar el número de la línea del registro solicitado. Lectura de una tabla interna usando clave EJEMPLO DE SINTAXIS: LECTURA UTILIZANDO LA CLAVE Control interno del flujo de un programa 9-14 Dentro del LOOP, se puede restringir el acceso a ciertas líneas utilizando la declaración WHERE. En el ejemplo superior, el sistema solo trabaja con las líneas de la tabla en las que el campo CARRID tiene valor LH. Se puede utilizar la sentencia READ TABLE para leer una línea en concreto. En este caso se debe asignar un valor a todos los campos clave después de la instrucción WITH TABLE KEY. El código de retorno sy-subrc se dispone a cero si la fila correspondiente existe en la tabla interna. Lectura a la base de datos Se usa del OPEN SQL la instrucción SELECT para leer los datos de la base de datos. La instrucción SELECT utiliza una lógica compleja de acceso a datos, para permitir el acceso a diferentes tipos de datos a la vez. La sentencia contiene una serie de cláusulas, cada una de las cuáles tiene diferentes tareas: o La sentencia SELECT especifica: o Si el resultado de la selección será una línea o múltiples líneas. o Que campos son incluidos en el resultado. o Si el resultado puede contener dos o mas líneas iguales. o La cláusula INTO especifica el objeto interno del programa en el cual serán almacenados los datos. La cláusula FORM especifica el origen de los datos. Éste puede ser una Tabla o una Vista. La cláusula WHERE especifica las condiciones que la selección debe cumplir. Esto determina que líneas son incluidas en la tabla de resultados. Para mas información sobre otras cláusulas, consulte la documentación de la sentencia SELECT en el editor de ABAP. Control interno del flujo de un programa 10-14 Lectura de registros simples La sentencia SELECT SINGLE nos permite seleccionar un único registro de la base de datos. Para asegurar el acceso único todos los campos clave de la base de datos deben ser incluidos en la cláusula WHERE, a excepción del campo mandante (si este no esta especificado se utiliza el mandante en el que se realiza la selección). A continuación de INTO se inserta el nombre de la estructura donde se insertara la información obtenida de la base datos. Si se utiliza la instrucción CORRESPONDING FIELDS OF a continuación de INTO el sistema llena sólo los componentes de la estructura con los nombres idénticos a la base de datos. Si el sistema encuentra una entrada a la tabla que se ajusta a las condiciones, el valor de SY-SUBRC es igual 0. La instrucción SINGLE informa que sólo se leerá una línea de la base de datos cada vez. Control interno del flujo de un programa 11-14 Lectura de varios registros usando SELECT Loop Si no se utiliza la instrucción SINGLE en la sentencia SELECT el sistema lee múltiples registros de la base de datos. La lista de campos determina que columnas se leen de la base de datos. Se debe restringir el número de líneas a leer utilizando la cláusula WHERE con los campos clave de la tabla o un índice secundario. El nombre de la tabla de la base de datos a que se accede se especifica con la cláusula FROM. Es posible añadir múltiples condiciones lógicas a la cláusula WHERE gracias a AND u OR. Control interno del flujo de un programa 12-14 Lectura de varios registros usando un Array La instrucción INTO TABLE <itab> provoca que el sistema copie el contenido de la tabla de la base de datos a la tabla interna itab. El campo de control SY-SUBRC = 0 cuando el sistema ha podido leer al menos una entrada de la tabla. Lectura múltiple de tablas de la BBDD Se puede tener acceso a varias tablas de la base de datos con una sola consulta, con tal de que las tablas estén lógicamente relacionadas. Para ello se debe conocer la información siguiente: ¿A qué tablas de la base de datos se debe acceder? ¿Cómo debe ser la condición de ligado de las tablas? En esta condición las columnas de las tablas de la base de datos se ligan. ¿Qué columnas deben ser leídas? Si una columna aparece en más de una tabla, se debe especificar la tabla en la que esta columna debe ser leída. Control interno del flujo de un programa 13-14 Control interno del flujo de un programa 14-14