Diferencia entre CLEAR, REFRESH y FREE

Cuando empiezas en ABAP, es muy común ver código con CLEAR, REFRESH y FREE usados casi como si fueran lo mismo, pero no lo son.

Los tres sirven para limpiar datos, aunque su comportamiento respecto a memoria y reutilización cambia bastante. Y entender esa diferencia es importante, especialmente cuando trabajas con tablas internas grandes o programas que procesan muchos datos.

Sentencia CLEAR

CLEAR reinicia una variable a su valor inicial según su tipo de dato. Ejemplos:

DATA lv_text TYPE string VALUE 'Hola'.
CLEAR lv_text. "lv_text ahora es igual a ' '.

DATA lv_num TYPE i VALUE 10.
CLEAR lv_num. "lv_num ahora vale 0

Con tablas internas:

CLEAR lt_data.

Elimina todas las líneas de la tabla interna, pero mantiene parte de la memoria reservada para reutilizarla después. En la práctica, SAP puede reutilizar parte de la memoria ya reservada, lo que hace que volver a llenar la tabla sea más eficiente que liberar memoria completamente y volver a solicitarla.

¿Cuándo usar CLEAR?

  • Cuando vas a rellenar la misma tabla de nuevo inmediatamente después.
  • La memoria ya asignada se reutiliza, ahorrando el coste de tener que pedirla de nuevo al sistema. Es la opción más eficiente en bucles de procesamiento.

Caso de uso típico: dentro de un LOOP donde limpias y vuelves a llenar la tabla en cada iteración. Con CLEAR evitas que el sistema esté constantemente pidiendo y liberando memoria.

Sentencia REFRESH

REFRESH se utiliza únicamente con tablas internas. Ejemplo:

REFRESH lt_data.

Su comportamiento es prácticamente el mismo que CLEAR. Es decir:

  • Borra todas las líneas
  • Mantiene memoria reservada
  • La tabla sigue preparada para reutilizarse rápidamente

El problema es que REFRESH hoy se considera sintaxis obsoleta. En ABAP moderno se recomienda usar CLEAR directamente. En código moderno, no tiene ninguna ventaja sobre CLEAR. Únicamente existe por compatibilidad hacia atrás.

Sentencia FREE

FREE también elimina el contenido de una tabla interna, pero además libera la memoria utilizada.

FREE lt_data.

A diferencia de CLEAR y REFRESH:

  • Elimina todas las líneas
  • Libera la memoria ocupada
  • SAP tendrá que volver a reservar memoria si la tabla se reutiliza

Si liberas memoria con FREE y luego vuelves a llenar la tabla, el sistema tendrá que reservar memoria de nuevo desde cero, lo que tiene un coste asociado. No lo hagas si vas a reutilizar la tabla inmediatamente.

SAP recomienda usar FREE solo cuando realmente necesitas liberar memoria completamente.

¿Cuándo usar FREE?

  • La tabla ha crecido mucho y no la vas a volver a usar (o no de forma inmediata).
  • La tabla es muy grande o el programa tiene problemas de memoria y necesitas liberar recursos para el resto del sistema.

⚠️ Importante: si vas a reutilizar la tabla inmediatamente, FREE es contraproducente porque fuerza a que el sistema tenga que pedir la memoria de nuevo, lo que ralentiza la ejecución.

Tablas con cabecera (Header Lines)

Aquí es donde la cosa se complica. Aunque las tablas con cabecera están obsoletas y prohibidas en clases, aún puedes encontrarlas en código legacy. Su comportamiento es el siguiente:

SentenciaQué afecta
CLEAR itabSolo limpia la cabecera (header line). El cuerpo de la tabla no se toca.
CLEAR itab[]Vacía el cuerpo de la tabla (las filas). La cabecera no se modifica.
REFRESH itabVacía el cuerpo de la tabla (igual que CLEAR itab[]).
FREE itabVacía el cuerpo y libera la memoria del cuerpo.

Por eso, en código legacy es muy importante fijarse en si la tabla tiene header line o no.

A modo resumen..

SentenciaElimina datosLibera memoriaUso recomendado
CLEARNo completamenteReutilizar variables, tablas, estructuras, etc.
REFRESHNoCódigo antiguo
FREELiberar memoria

Cuándo usar CLEAR, REFRESH y FREE es una cuestión de rendimiento, memoria y calidad del código. Y aunque muchas veces “todo funcione igual”, en programas grandes o procesos masivos la diferencia puede ser significativa.