Módulos de función qué son, cómo crearlos y buenas prácticas

Los Function Modules (módulos de función) son una de las piezas clave del desarrollo en SAP ABAP, especialmente en entornos legacy, integraciones y BAPIs.

En este artículo vas a aprender qué son, cómo se crean, sus partes principales, cómo llamarlos desde un programa, y buenas prácticas para usarlos correctamente.

¿Qué es un Function Module?

Un Function Module (FM) es un bloque de código ABAP que encapsula lógica en una unidad reutilizable, con una interfaz clara de entrada, salida y control de errores. Sus características principales son:

  • Organizados: Se guarda dentro de un Function Group.
  • Interfaz definida: tiene una interfaz definida con parámetros de entrada (IMPORTING), salida (EXPORTING), de ambos (CHANGING), tablas internas (TABLES) y excepciones.
  • Reutilizables: Puede ser llamado desde cualquier programa, clase u otro FM.
  • Remote-enabled: incluso puede ser marcado como remote-enabled, lo que permite su ejecución desde sistemas externos (RFC) u otros sistemas SAP.

Function Module vs Método de clase

Esta es una de las dudas más comunes, la diferencia entre un módulo de función y un método de clase es:

AspectoFunction ModuleMétodo de clase
ParadigmaProgramación proceduralProgramación orientada a objetos
OrganizaciónDentro de Function GroupsDentro de clases
EstadoVariables globales en el Function GroupAtributos de instancia o estáticos
ReutilizaciónSí, pero menos flexibleAlta, con herencia e interfaces
Uso actualLegacy, BAPIs, RFC, integracionesDesarrollo moderno (RAP, OO)

Partes de un Function Module

Cuando creas un FM (transacción SE37), verás estas secciones principales:

Atributos de un módulo de función

En la pestaña Attributes encontrarás:

  • Descripción corta → explica el objetivo del FM.
  • Paquete → organización del objeto.
  • Fecha de creación / autor.
  • Modo de ejecución

👉 Si quieres que se pueda ejecutar desde otro sistema, marca la opción Remote-Enabled Module.

Parámetros de un módulo de función

La interfaz de un FM se organiza en varias secciones:

  • Import (IMPORTING) → valores de entrada, solo lectura (no los puedes modificar dentro del FM).
  • Export (EXPORTING) → valores que el FM devuelve al programa que lo llamó.
  • Changing (CHANGING) → valores que entran, pueden modificarse dentro del FM y se devuelven al final.
  • Tables (TABLES) → para pasar tablas internas o estructuras. Aunque todavía se usa, hoy en día se recomienda usar IMPORTING/EXPORTING con tipos tabla definidos en el Diccionario.
  • Exceptions → lista de errores controlados que el FM puede lanzar.

Código fuente (Source Code) → la implementación.

Aquí va la implementación del FM. Es ABAP puro, con una estructura especial. Ejemplo simple de FM:

FUNCTION z_get_customer.
*»—————————————————————-
*»*»Local Interface:
*» IMPORTING
*» VALUE(iv_cust_id) TYPE kunnr
*» EXPORTING
*» VALUE(es_customer) TYPE zty_customer
*» EXCEPTIONS
*» not_found
*»—————————————————————-

SELECT SINGLE * FROM zcustomer INTO es_customer WHERE kunnr = iv_cust_id.
IF sy-subrc <> 0.
RAISE not_found.
ENDIF.
ENDFUNCTION.

Paso por valor o referencia (Pass by)

Cuando defines parámetros, puedes elegir:

  • Pass by value → se copia el valor, lo que consume más memoria pero evita que se modifique accidentalmente. Su ventaja es que protege el original.
  • Pass by reference (opción por defecto) → el parámetro apunta a la misma dirección en memoria, más eficiente pero cualquier cambio afecta a la variable original. Su ventaja es que es más eficiente.

👉 Buenas prácticas: usa pass by value en parámetros pequeños (números, flags) y pass by reference en tablas internas u objetos grandes.

" Pass by value (con VALUE)
IMPORTING VALUE(iv_id) TYPE i

" Pass by reference (sin VALUE, por defecto)
IMPORTING iv_name TYPE string

Cómo llamar a un Function Module desde un programa

La sintaxis básica para llamar a un FM es:

DATA: ls_customer TYPE zty_customer.

CALL FUNCTION ‘Z_GET_CUSTOMER’
EXPORTING
iv_cust_id = ‘000100200’
IMPORTING
es_customer = ls_customer
EXCEPTIONS
not_found = 1.

IF sy-subrc <> 0.
WRITE ‘Cliente no encontrado’.
ELSE.
WRITE: / ls_customer-name.
ENDIF.

Puntos importantes:

  • Los tipos de datos deben coincidir exactamente con los definidos en la función.
  • Puedes usar el pattern en el editor ABAP (Pattern → Call Function) para autocompletar la llamada con toda la interfaz.

Variables locales vs globales en una función

Esta es una de las diferencias clave entre FMs y métodos de clase.

  • Dentro de un FM, las variables que declares son locales a ese módulo y no afectan fuera de él.
  • Las variables globales de un Function Group pueden ser compartidas entre todos los FMs del mismo grupo.

👉 Consejo: evita abusar de las variables globales, porque hacen el código más difícil de mantener.

Cuándo usar Function Modules

✅ Usa Function Modules cuando…

SituaciónEjemplo
Necesitas una BAPI estándar de SAPBAPI_SALESORDER_CREATEFROMDAT2
Expones lógica a sistemas externos vía RFCRFC_READ_TABLE
Trabajas en un proyecto legacy que ya usa FMsMantener consistencia
Necesitas una API simple y reutilizable en ABAP clásicoCálculos matemáticos, validaciones

❌ No uses Function Modules cuando…

SituaciónAlternativa recomendada
Desarrollo nuevo orientado a objetosMétodos de clase
Necesitas lógica en la base de datosCDS Views o AMDP
Expones datos a Fiori o aplicaciones externas modernasServicios OData
Necesitas inyección de dependencias o testingClases con interfaces

Buenas prácticas

  • Usa prefijos Z/Y y nombres claros (Z_SD_GET_DISCOUNT).
  • Define excepciones para cada error posible
  • Documenta la interfaz. En la pestaña Documentation (o en comentarios), explica que hace el FM, que espera cada parámetro y en qué casos se lanza cada excepción.
  • Prefiere tipos del Diccionario (SE11) en lugar de CHAR(10).
  • No hagas COMMIT WORK dentro de un FM salvo que sea un update task o casos específicos.
  • Haz pruebas en SE37 antes de usarlo en programas reales.
  • Antes de crear un FM nuevo, busca si ya existe una BAPI estándar

Los Function Modules son un bloque fundamental en SAP ABAP: fáciles de crear, reutilizables y clave en integraciones (RFC, BAPI). Aunque cada vez hay alternativas más modernas, entenderlos y usarlos bien sigue siendo imprescindible para cualquier programador ABAP.

Hoy en día, se tiende a usar:

  • Métodos en clases ABAP (OO) para lógica interna.
  • CDS Views o AMDP para lógica en base de datos.
  • Servicios OData para exponer APIs a Fiori o aplicaciones externas.

Sin embargo, los módulos de función siguen siendo esenciales, sobre todo porque muchas APIs estándar de SAP están basadas en ellos (BAPIs).