TÉCNICAS DE MODULARIZACIÓN
10.7. LLAMADA A UNA TRANSACCIÓN |
10.1 MACROS:
- Sintaxis de definición de una macro. Pueden usarse hasta 9 parámetros: &1, &2, ..., &9:
DEFINE nombre_macro. bloque. END OF DEFINITION.
- Sintaxis de uso de la macro definida. Se indicar su nombre, seguido de los parámetros actuales:
nombre_macro [ p1 ] [ p2 ] ... [ p9 ] .
Ejemplo:
DATA solucion TYPE I. DEFINE operacion. solución = &1 &2 &3. salida &1 &2 &3 solución. "hace uso de otra macro, que se define luego END-OF-DEFINITION. "macro llamada operación DEFINE salida. WRITE: / 'El resultado de la operación &1 &2 &3 es', &4. END-OF-DEFINITION. "macro llamada salida operación 4 + 3.
Se han definido las macros ‘operación’ y ‘salida’, y además la primera hace uso de la segunda en su definición. Con esto se crea una nueva “instrucción” Abap/4 llamada ‘operación’, con 3 parámetros formales. Al ejecutarla con parámetros actuales ‘4’ ‘+’ ‘3’, lo que se ve en pantalla es: “El resultado de la operación 4 + 3 es 7”. Los operandos &1 y &3 son números, así como el resultado &4, y el operando &2 es el operador binario. En la variable ‘solución’ se calcula el resultado, y se llama a la macro ‘salida’ para mostrar éste en pantalla.
10.3. ZONAS DE DATOS COMUNES:
- Existe una sentencia que permite incluir o insertar (en tiempo de generación / compilación, no en tiempo de ejecución) el código fuente del programa especificado, dentro del llamante. Esta sentencia sólo puede estar codificada en una línea. Dicho programa debe ser de tipo I (es un INCLUDE). Estos no llevan sentencia PROGRAM ni REPORT, y no son ejecutables directamente, sino que deben ser llamados siempre desde otro programa, con la sentencia INCLUDE. Por lo demás, es código Abap/4 normal. Los includes se usan para agrupar subrutinas que van a ser reutilizadas en muchos programas (por ejemplo, programas ‘batch-input’).
Sintaxis:
INCLUDE nombre_include.
- Se usan para declarar datos comunes a varios programas. En todos ellos debe estar declarada la mismaCOMMON PART, con el mismo nombre y estructura (se puede por ejemplo declarar la COMMON PART en un INCLUDE aparte, y llamarlo desde donde sea necesario). Un programa puede tener variasCOMMON PART, que se identifican por su distinto nombre (el nombre es opcional si sólo hay una).
Sintaxis:
- DATA: BEGIN OF COMMON PART [ nombre ].
- Sentencias declarativas de datos.
- DATA: END OF COMMON PART.
Existen 2 tipos de subrutinas: internas (el código de la subrutina está dentro del programa que la llama) y externas (la subrutina está en un programa distinto al llamante). Las subrutinas se codifican al final del programa principal, tras todos los eventos. No se pueden anidar. Se puede salir de una subrutina con un EXIT (salida incondicional) o un CHECK (salida condicional), si estas sentencias no están dentro de un bucle. Sólo dentro de una subrutina se puede usarse la sentencia LOCAL campo, para declarar variables locales a la subrutina (sólo visibles dentro de ella). Deja oculto el valor de ese campo que tuviera antes de entrar a la subrutina, y lo restaura al salir de ésta.
- Sintaxis de declaración: (igual para subrutinas internas y externas)
FORM nombre [ parámetros ]. bloque. ENDFORM.
- Sintaxis de la llamada:
- Llamada a una subrutina interna: PERFORM nombre [ parámetros ].
- Llamada a una subrutina externa: PERFORM name (programa) [ paráms ] [ IF FOUND ].
En este caso se debe indicar el programa en el cual se encuentra la subrutina llamada. Con IF FOUND, si la subrutina no existe, la sentencia PERFORM es ignorada y no se genera error.
- Llamada dinámica: PERFORM (var) [ IN PROGRAM (var2) ] [ parám ] [ IF FOUND ].
Se llama a la subrutina cuyo nombre está contenido en el campo o variable ‘var’. Se puede indicar opcionalmente el nombre del programa donde está (así vale para subrutinas internas y externas), en el campo o variable ‘var2’. IF FOUND es igual que antes.
- Llamada a partir de una lista: PERFORM índice OF subrutina1 subrutina2 ... subrutinaN.
El sistema ejecuta la subrutina que ocupe la posición especificada en ‘índice’ (literal o variable), de la lista dada de subrutinas. Con esto sólo se puede llamar a subrutinas internas.
- Parámetros formales:
FORM nombre [ TABLES lista_tablas ] [ USING lista_var ] [ CHANGING lista_var ][ TYPE ... | LIKE ... ].
Las distintas opciones deben escribirse en este mismo orden. Los parámetros formales de una subrutina interna pueden ser cualesquiera variables declaradas en el llamante (no las variables locales internas a la subrutina), pues son visibles. Por esa misma razón ni siquiera es necesario declarar esos parámetros formales. En cambio en las subrutinas externas sí es necesario pues esas variables no serán visibles directamente. Usando parámetros ya no es necesario declarar un COMMON PART en el llamante y llamado para pasar valores a una subrutina externa.
Las variables de USING y CHANGING pueden ser de cualquier tipo, mientras que las de TABLES deben ser tablas internas (con o sin área de trabajo). Por tanto, con CHANGING y USING pueden pasarse también tablas, pero hay que pasar explícitamente la estructura de la misma (por ejemplo con un LIKE) para poder referenciar luego a sus campos.
Ejemplo:
PERFORM nombre CHANGING itabla. FORM nombre CHANGING ztabla LIKE itabla. … ENDFORM.
- Parámetros actuales:
PERFORM nombre [(prog)] [ TABLES lista_tablas ] [ USING lista_var ][ CHANGING lista_var ].
- Paso de parámetros:Hay 3 formas de pasar datos (parámetros) a una subrutina:
- Paso por valor: El parámetro formal y el actual ocupan posiciones de memoria distintas, es una copia, con lo que su valor no puede ser modificado por la subrutina. Sólo se puede usar en USING con la opción VALUE.
- Paso por referencia: El parámetro formal y el actual ocupan la misma posición de memoria, con lo que su valor puede ser modificado por la subrutina. Se pasa la dirección del parámetro, no una copia. Se puede usar en TABLES, USING y CHANGING.
Ejemplos:
PERFORM fecha_fin_mes USING fedat. PERFORM load TABLES itab USING zcampo zfile.
- Paso por valor y resultado: El parámetro formal y el actual ocupan posiciones de memoria distintas (se pasa una copia), pero su valor puede ser modificado por la subrutina (sólo si ésta termina incorrectamente y por tanto se lanza algún mensaje. En otro caso el parámetro no se modifica). Sólo se puede usar en CHANGING con VALUE.
Una función es una subrutina externa especial que se almacena en una “biblioteca central” de SAP. Hay muchas predefinidas, de librería, así como subrutinas, que pueden ser llamados desde cualquier programa Abap/4. Se pueden crear otras nuevas (indicando el grupo de funciones al que van a pertenecer). Las funciones se crean por menú en Workbench Abap/4 – Biblioteca de Funciones. También se pueden ver y testar (probar su funcionamiento introduciendo valores en los parámetros de entrada de forma manual, al pulsar en el botón Test).
- Grupo de funciones: Sirve para reutilizar funciones (son programas que calculan algo, que devuelven algo como parámetro(s) de salida). Es análogo a un pool de subrutinas (agrupación de subprogramas). El grupo de funciones crea un programa module pool (se compone sólo de sentencias INCLUDE) de nombre SAPLXXXX, con XXXX el nombre del grupo de funciones.
- Sintaxis de la llamadaa una función: Con esta sentencia se llama a un módulo de función desde programa. Conviene escribir la sintaxis de esta sentencia usando el botón de Traer Modelo del Editor Abap/4, para que aparezcan automáticamente los parámetros de concretos de la función.
CALL FUNCTION nombre [ EXPORTING f1 = a1 ... fn = an ][ IMPORTING f1 = a1 ... fn = an ] [ CHANGING f1 = a1 ... fn = an ][ TABLES f1 = a1 ... fn = an ] [ EXCEPTIONS f1 = a1 ... fn = an ].
- EXPORTING: Parámetros que van hacia el módulo, son los de entrada (la función por tanto no los modifica). Se dan valores actuales a1 ... an a los parámetros formales f1 ... fn de la función (que estarán declarados como IMPORT en la función).
- IMPORTING: Parámetros de salida (en la función estarán declarados como EXPORT). CHANGING: Parámetros de entrada / salida (son modificables). TABLES: Se usa para pasar tablas internas como parámetros.
- EXCEPTIONS: Se usa para gestionar excepciones y errores. Cuando se activa la excepción fi, en el campo de retorno SY-SUBRC se tendrá el valor ai. Así se puede saber qué ocurrió al ejecutar la función. Con OTHERS = a se da tratamiento a errores no contemplados.
- ERROR-MESSAGE = re. Se usa para tratar errores generando un mensaje. Se tendrá el valor re en SY-SUBRC. Se podrá mandar el mensaje desde el programa llamante, accediendo a los campos del sistema: SY-MSGID (nombre del mensaje), SY-MSGNR (número del mensaje), SY-MSGTY (tipo del mensaje), SY-MSGV1 ... SY-MSGV4 (4 textos para los 4 posibles parámetros & del mensaje).
Ejemplo:
DATA: text(20), front(20), end(20). text = 'testing: string-split'. CALL FUNCTION 'STRING-SPLIT' " módulo de función predefinido EXPORTING delimiter = ':' string = text " parámetros de entrada IMPORTING head = front tail = end " parámetros de salida EXCEPTIONS not_found = 1 OTHERS = 2. " excepciones CASE sy-subrc. … ENDCASE. " tratamiento de los errores
- Objetos parcialesde una función:
- Atributos y parámetros: Una función tiene los siguientes parámetros: EXPORTING (de entrada a la función), IMPORTING (de salida. Resultado de la función), CHANGING (de entrada / salida), TABLES (tablas internas de entrada / salida), EXCEPTIONS (excepciones producidas por la función. Se usa para el manejo de errores).
- Texto fuente: Código Abap/4 de la función.
- Documentación: Asociada a la función, dependiente del idioma.
- Datos globales: Código Abap/4 con las sentencias declarativas del grupo de función.
- Programa principal: Programa que llama a la función. Cada módulo de función tiene su correspondiente “include” (CALL FUNCTION) en el programa.
- Sintaxis de la definiciónde la función:
FUNCTION nombre [ EXPORT f1 ... fn ] [ IMPORT f1 ... fn ] [ TABLES f1 ... fn ][ EXCEPTION f1 ... fn ]. bloque. ENDFUNCTION.Se usa esta sentencia para crear el código fuente de un módulo de funciones. El nombre son 4 caracteres. No debe escribirse REPORT ni PROGRAM. El resto es similar a una subrutina, pero no se declaran con DATA variables para los parámetros EXPORT ni IMPORT (ya lo hace SAP automáticamente). Puede usarse en toda función de grupo de funciones XXXX un include llamado LXXXXTOP. El resto de includes que use la función se llamarán: LZZZZUYY, con ZZZZ el nombre de dicha función, e YY el número del include. Tras el ENDFUNCTION pueden codificarse las subrutinas que use dicha función, si tiene.
- Gestión de excepcionesdentro de un módulo de función. Hay 2 maneras:
RAISE excepción.
MESSAGE ... RAISING excepción.
La única manera de gestionar errores dentro de un módulo de función es elevar excepciones, ya que no se pueden usar mensajes en ellas. La segunda sentencia activa un mensaje, pero no lo muestra. Para poder visualizarlo hay que acceder a los campos del sistema de la tabla SYST, donde se almacena el texto del mensaje, número, ... pero desde el programa principal).
Ejemplo:
CALL FUNCTION ... EXCEPTIONS too_long = 5. "código del programa principal IF SY-SUBRC = 5 MESSAGE Exx. "código del programa principal FUNCTION mi_división IMPORT n1 n2 EXPORT result EXCEPTION div_zero. IF n2 = 0. RAISE div_zero. "elevar excepción ELSE. result = n1 / n2. ENDIF. ENDFUNCTION.
- SUBMIT nombre_report | (variable) [ AND RETURN ] [ LINE-SIZE columnas ][ LINE-COUNT líneas ] [ VIA SELECTION-SCREEN ] [ WITH criterio_selección ][ USING SELECTION-SET variante ] [ WITH FREE SELECTIONS libre_selección ][ WITH SELECTION-TABLE tabla ].
- Puede darse el nombre del report a llamar de forma estática (indicando su nombre directamente) o dinámica (mediante una variable).
Parámetros:
- AND RETURN: El sistema devuelve el control al finalizar al programa llamado (pulsando en éste el botón BACK: F3); si no se usa esta opción, no se vuelve al llamante (aunque se pulse F3) salvo que el llamado incluya AND RETURN en su sentencia REPORT.
- LINE-SIZE y LINE-COUNT: Formatean el tamaño de salida del report llamado.
- VIA SELECTION-SCREEN: Con esta opción el sistema muestra la pantalla de selección del llamado (por defecto no aparecerá, porque se supone que el llamante pasará al llamado como parámetros los datos que necesite para su ejecución).
- WITH: Se especifica el valor concreto para un criterio de selección (SELECT-OPTIONS) del llamado. Habrá un WITH para cadaPARAMETER o SELECT-OPTIONS del llamado al que deba pasársele valor. Con esto se le pasan al llamado sus parámetros de ejecución.
- USING SELECTION-SET: Se ejecuta el llamado con la variante especificada. Así, es posible saltarse la pantalla de selección del report llamado, y rellenar los valores de los parámetros de ésta mediante la variante especificada, en lugar de dar un WITH para cada uno.
- WITH FREE SELECTIONS: Se crea una ventana de diálogo para selecciones dinámicas.
- WITH SELECTION-TABLE: Permite pasar dinámicamente valores a los criterios de selección del llamado que se desee. La estructura de la tabla especificada debe ser la misma que la de RSPARAMS, que tiene 6 campos: SELNAME (8 caracteres: nombre del criterio de selección o parámetro), KIND (1 carácter: ‘S’ para SELECT-OPTIONS y ‘P’ para PARAMETERS), SIGN, OPTION, LOW, HIGH (éstos como un criterio de selección).
10.7. LLAMADA A UNA TRANSACCIÓN:
- LEAVE TO TRANSACTION código_transacción [ AND SKIP FIRST SCREEN ].
Llama a la transacción especificada, sin devolver el control al programa llamante cuando ésta acabe. Con AND SKIP FIRST SCREEN se salta la primera pantalla de la transacción.
- CALL TRANSACTION código_transac [ AND SKIP FIRST SCREEN ] [ USING tabla].
Devuelve cuando acabe el control al programa llamante. Con USING se le pasa una tabla con la estructura de la BDCDATA para que se realicen automáticamente las acciones especificadas.