Você está na página 1de 19

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ónTest).

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 llamada a 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 deTraer 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 ][ IMPORTINGf1 = 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 … fnde 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 parciales de 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 ZZZZel 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.
[MEGAPOST] Creación de un Módulo de Función paso
a paso
Habrás leído mucho acerca de cómo crear un módulo de funciones para realizar alguna tarea en ABAP, pero
de seguro echarás de menos un lugar en donde te expliquen paso a paso, de la A a la Z, todo lo que necesitas
saber para crear tus funciones dentro de SAP.
Este post consiste en eso, vamos a tomar un caso práctico y vamos a crear un Módulo de Funciones paso a
paso.
Sin más, esto es lo que vamos a hacer:
Crearemos un Módulo de Función que cuente con las siguientes características:
Parámetros de Entrada y Salida.
Parámetros de Entrada:
 VALOR1– del tipo ERMFG.
 VALOR2 – del tipo ERMFG.
 OPERADOR – del tipo CHAR1.
Parámetros de Salida:
 DESCRIPCION- del tipo CHAR20.
Tablas de Salida:
 ITAB – con los siguientes campos:
 OPER – del tipo CHAR20.
 RESUL – del tipo ERFMG.
Parámetros de Excepción:
 DIV_CERO – División por cero.
 NOT_FOUND – Parámetro no encontrado.
¿Qué debe hacer el Módulo de Función?
La función que vamos a crear, deberá cumplir con las siguientes 4 especificaciones:
 Se debe tomar el símbolo del parámetro de entrada OPERADOR, y escribir su significado en el parámetro de
salida DESCRIPCION.
 Se debe tomar los parámetros de entrada VALOR1 y VALOR2 para realizarle las 4 operaciones aritméticas,
e ir guardando los resultados en la tabla de salida ITAB.
 Se debe validar que el VALOR2 no tenga valor 0 (cero), porque daría un dump al intentar dividir, por lo
tanto, se debe controlar la excepción DIV_CERO.
 Se debe validar que el OPERADOR introducido de entrada sea una de las 4 operaciones aritméticas, de
tratarse de alguna diferente, se debe controlar la excepción NOT_FOUND.
Ejemplos:

Contenido del Programa Principal


El Módulo de Función deberá ser llamado desde un programa principal, el cual tendrá las siguientes
especificaciones:
 Se debe crear un programa principal que tenga como parámetros de selección, los 3 parámetros de entrada de
la función, VALOR1, VALOR2 y OPERADOR. El programa llamará al Módulo de Función pasándole
estos 3 campos.
 Si los resultados son correctos (caso de ejemplo 1), tomar los resultados de la función y mostrarlos en un
reporte ALV.
 Si los resultados no son correctos, capturar la excepción correspondiente (casos 2 y 3), y mostrar el respectivo
mensaje de error por pantalla.
El programa se llamará ZABAP_PROGRAMA y el Módulo de Funciones lo
llamaremos ZABAP_FUNCION.
Con todo esto, empecemos:
Creación del Módulo de Funciones.
Para crear un Módulo de Funciones, entramos en la transacción SE37, indicamos el nombre de la nueva
función y pulsamos Crear.

Cuando se crea un Módulo de Función en SE37, el sistema pide asignarlo a un Grupo de Funciones, por lo
que procedemos a crearlo desde la transacción SE80, lo llamaremos ZABAP_GRUPO.

Indicamos su descripción, y pulsamos Grabar.


Nos pedirá una orden de transporte, en este caso crearé los objetos como locales, pero en el tuyo, asignas los
objetos a la orden de transporte que te hayan indicado.

Listo, ya tenemos el Grupo de Funciones creado.

Ahora regresamos a la SE37 y asignamos el Grupo de Función a nuestra nueva Función y pulsamos Grabar.
En este punto ya tenemos creado el Módulo de Funciones en el sistema, aunque sin datos ni parámetros, ahora
corresponde configurarlo.
Un Módulo de Función visto desde la SE37 cuenta con las siguientes pestañas:

 En la pestaña IMPORT será donde crearemos los 3 parámetros de entrada.


 En la pestaña EXPORT será donde se creará el parámetro de salida.
 En esta pestaña también creará la tabla que necesitamos.
 En la pestaña EXCEP se crearán las excepciones requeridas.
 En la pestaña FTE será donde crearemos el código de la función.
 La pestaña ATRIBUTOS será la primera que revisaremos.
Pestaña ATRIBUTOS

Esta pestaña contiene la información general del Módulo de Función; en la sección Clasificación veremos a
que Grupo de Funciones pertenece y podremos modificar la descripción de nuestra función.
En la sección Forma Ejecución (izquierda), nos interesa saber lo siguiente:
Una función que se ejecutará directamente desde SAP, tendrá una forma de ejecución normal (primer botón),
siendo ésta una de las dos formas más comunes de funciones que desarrollemos.
La otra forma la encontramos en el segundo botón, (acceso remoto), que son funciones ideadas para ser
llamadas desde sistemas externos a SAP. Este tipo de Funciones son conocidas como funciones RFC (Remote
Function Control).
La sección de Datos Generales (derecha) solo nos muestra información general del objeto ABAP.
Pestaña IMPORT

En esta pestaña procedemos a crear los parámetros de entrada de nuestra función, que en este caso serán 3
campos, VALOR1 y VALOR2 el tipo ERFMG, y el campo OPERADOR del tipo CHAR1.
A la hora de declarar los campos, podemos hacerlo de dos formas:

En nuestro caso, como utilizaremos un Elemento de Datos como referencia, optamos por la primera opción.
Al ingresar los campos correctamente y pulsar ENTER, el sistema tomará las descripciones del Elemento de
Datos, siempre que éste exista en el Diccionario ABAP.
Pestaña EXPORT.
En esta pestaña incluiremos el parámetro DESCRIPCION, que será un CHAR20, y la estructura ITAB, que
contendrá los 4 resultados aritméticos que calculará la función.
En esta pestaña incluiremos el parámetro de salida DESCRIPCION, el cual será del tipo CHAR20.
Igual que en la pestaña anterior, también podremos seleccionar dos tipos de referencia para los campos:

Adicionalmente, en esta pestaña se indicará también la estructura interna que se va a utilizar en la función,
pero esto requiere un paso previo.
Primero debemos crear una Estructura de Datos Z con los campos requeridos, para luego poder referenciarla
desde esta pestaña de la Función.
Para ello, vamos a la transacción SE11
Pulsamos el botón “Tipo de Datos”, le indicamos un nombre, (yo lo llamaré ZFI4B_ED_RR),

Se nos abrirá una ventana en la que nos pedirá el tipo de datos exacto que queremos crear, indicamos
“Estructura”.

Procedemos a indicar los campos requeridos por la estructura, eligiendo un tipo de dato numérico con
decimales, en este caso el Elemento de Datos DMBTR:
Ahora necesitamos indicar los campos referencia de estos tipos de datos numéricos.

Volvemos a la creación de la función en la SE37 para completar la pestaña EXPORT.

Pestaña EXCEPTIONS.

En esta pestaña declararemos las excepciones que se requieren controlar en la Función, a recordar:
 DIV_CERO = División por cero.
 NOT_FOUND = Parámetro no encontrado.
Solo se requiere declarar el nombre de la excepción, y una descripción corta, no se necesita el tipo de datos.
Pestaña SOURCE CODE o CODIGO FUENTE
Llegados a este punto, ya hemos declarado los atributos y parámetros que tendrá nuestra función, por lo que
guardamos los cambios, y los activamos.
Ahora toca codificar, plasmar en código ABAP la lógica requerida para solucionar el requerimiento.
Recordemos, la función recibirá dos valores de tipo numérico y un valor tipo carácter indicando el símbolo
de la operación solicitada. La función deberá convertir este símbolo en su significado en letras, el cual será
devuelto por la función a través de su parámetro de salida.
Adicionalmente, con los dos valores numéricos de entrada, la función realizará las 4 operaciones aritméticas
simples y las guardará en la tabla interna como resultado de salida.
Y no hay que olvidar las dos excepciones que se nos piden controlar, cuando se intenta dividir por cero, y
cuando se inserta un operador distinto a los que 4 básicos que controlaremos.
Como vemos en la siguiente imagen, la pestaña CODIGO FUENTE muestra los parámetros creados en cada
pestaña. Esto ocurre en cualquier Módulo de Función, siendo de utilidad para saber en la misma pestaña con
que campos y variables podremos contar, resultado muy útil en BAPIS y EXITS.

NOTA: Por temas de disponibilidad, he cambiado el nombre de la función a ZFI4B_FM_RR, pero los pasos
siempre son los mismos.
Procedamos a crear la lógica del requerimiento, la cual desarrollaremos en 3 partes.
Primero, empezamos por lo más sencillo, controlar la excepción DIV_CERO, para ello simplemente
controlamos que el parámetro CAMPO2 no tenga valor cero.
Para capturas las excepciones dentro de una Función, utilizamos la sentencia RAISE seguida del nombre de la
excepción que hemos declarado en la pestaña correspondiente.
Procedemos ahora a llenar el parámetro de salida DESCRIPCION, con el correspondiente significado de cada
operador indicado por el parámetro de entrada OPERADOR, y en caso de no pertenecer a ninguna de las 4
operaciones básicas, capturamos la excepción NOT_FOUND.

Ahora nos queda simplemente realizar las 4 operaciones aritméticas y asignarlas a la estructura de salida
ITAB, en su respectivo campo.

Probar la Función

Ya tenemos completada la Función, así de simple es.


Si deseas probar los 3 casos de prueba indicamos al comienzo para ver si todo está bien, pulsamos el botón de
“ejecutar” luego de activar la función.

Indicamos los valores del caso 1:


Y ejecutamos:

Al no haber errores en los parámetros de entrada, se realizan las 4 operaciones, y podemos ver en ITAB los
respectivos resultados, además de ver en DESCRIPCION el operador indicado en letras.
Veamos el caso 2:

Y ejecutamos:

El valor2 es 0, por ende se captura la excepción y se termina la ejecución de la función, impidiendo que se
realice la división y por ende la función termine en error.
Veamos el caso 3:

Y ejecutamos:
Los valores son correctos, pero el operador no es uno de los 4 básicos que estamos controlando en la función,
por lo tanto, se captura la excepción NOT_FOUND, y se termina la ejecución de la función.
Como vemos, el Módulo de Función cumple con lo requerido perfectamente, ahora solo nos queda crear el
programa principal.
Creación del Programa Principal
Ya tenemos hecho el Módulo de Función, ahora debemos implementar el programa de control que llamará a
la función, indicándoles los parámetros requeridos, y que recibirá los resultados de la misma.
Nos vamos a la SE80 y creamos un programa que se llamará ZFI4B_P_APRENDE_ABAP; asignamos el
mismo a la orden de transporte que corresponda (en mi caso lo crearé como objeto local)
 Se debe crear un programa principal que tenga como parámetros de selección, los 3 parámetros de entrada de
la función, VALOR1, VALOR2 y OPERADOR. El programa llamará al Módulo de Función pasándole
estos 3 campos.
 Si los resultados son correctos (caso de ejemplo 1), tomar los resultados de la función y mostrarlos en un
reporte.
 Si los resultados no son correctos, capturar la excepción correspondiente (casos 2 y 3), y mostrar el respectivo
mensaje de error por pantalla.
Se crea la pantalla de selección con los 3 campos correspondientes:

Creamos el llamado al Módulo de Función indicándole los 3 parámetros de entrada.


Para ello, utilizaremos la opción “Modelo” en la barra de pulsadores de la SE80.
Indicamos el nombre de la Función:

Y recibiremos en el código todos los parámetros de la Función que queremos invocar:

Declaramos las variables que recibirán los datos de salida de la Función:

Y llenamos el llamado correctamente.


El primer paso es capturar las excepciones, que como vemos representan los números 1 y 2, estos números se
capturan en la variable SY-SUBRC.
El funcionamiento es similar a cuando consultamos una tabla, si SY-SUBRC devuelve un valor 0, es que la
consulta fue correcta, por el contrario, si devuelve otros valores, es que algo ha ido mal, en nuestro caso, SY-
SUBRC devolverá 1 o 2 dependiendo de cuál excepción haya sido capturada dentro de la Función.
Para cumplir el requerimiento, simplemente verificamos el contenido de esta variable, y emitimos los
correspondientes mensajes de error:

Si no ocurren excepciones, simplemente capturamos los resultados de la función en las variables


DESCRIPCION e ITAB y preparamos la salida por pantalla de éstos.
Con esto habremos completado todo el requerimiento, procedemos a realizar las pruebas de los 3 casos desde
el programa:
Caso 1:

Resultado:

Caso 2:
Resultado:

Caso 3:

Resultado:

Você também pode gostar