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:
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:
| Aspecto | Function Module | Método de clase |
|---|---|---|
| Paradigma | Programación procedural | Programación orientada a objetos |
| Organización | Dentro de Function Groups | Dentro de clases |
| Estado | Variables globales en el Function Group | Atributos de instancia o estáticos |
| Reutilización | Sí, pero menos flexible | Alta, con herencia e interfaces |
| Uso actual | Legacy, BAPIs, RFC, integraciones | Desarrollo 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:
👉 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:
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:
Variables locales vs globales en una función
Esta es una de las diferencias clave entre FMs y métodos de clase.
👉 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ón | Ejemplo |
|---|---|
| Necesitas una BAPI estándar de SAP | BAPI_SALESORDER_CREATEFROMDAT2 |
| Expones lógica a sistemas externos vía RFC | RFC_READ_TABLE |
| Trabajas en un proyecto legacy que ya usa FMs | Mantener consistencia |
| Necesitas una API simple y reutilizable en ABAP clásico | Cálculos matemáticos, validaciones |
❌ No uses Function Modules cuando…
| Situación | Alternativa recomendada |
|---|---|
| Desarrollo nuevo orientado a objetos | Métodos de clase |
| Necesitas lógica en la base de datos | CDS Views o AMDP |
| Expones datos a Fiori o aplicaciones externas modernas | Servicios OData |
| Necesitas inyección de dependencias o testing | Clases con interfaces |
Buenas prácticas
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).



