CLEAR en ABAP: Inicializar variables, estructuras y tablas – Sintaxis y uso

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La instrucción CLEAR es una de las instrucciones más básicas y frecuentemente utilizadas en ABAP. Su propósito es restablecer el contenido de un objeto de datos (una variable) a su valor inicial según el tipo. Es decir, “elimina” o “vacía” el valor actual de la variable y establece el estado que tendría la variable directamente después de su declaración (sin el agregado VALUE).

CLEAR es aplicable a casi todos los tipos de objetos de datos:

  • Variables elementales (números, texto, fecha, hora, etc.)
  • Estructuras (Work Areas)
  • Tablas internas
  • Variables de referencia (referencias a objetos, referencias a datos)
  • Field symbols (actúa sobre el objeto de datos asignado)

Sintaxis

La sintaxis es muy simple:

1. Restablecer un único objeto de datos

CLEAR <objeto_de_datos>.
  • <objeto_de_datos>: El nombre de la variable, estructura, tabla interna, etc., que se debe restablecer.

2. Restablecer múltiples objetos de datos (instrucción encadenada)

CLEAR: <objeto_de_datos1>, <objeto_de_datos2>, ..., <objeto_de_datosN>.

Con dos puntos después de CLEAR y comas entre los nombres de variables, se pueden restablecer múltiples objetos de datos en una sola instrucción.

Funcionamiento y efecto en diferentes tipos de datos

El valor inicial al que CLEAR restablece depende del tipo de datos del objeto:

Tipos elementales

  • Numéricos (I, P, F, …): 0
  • Cadena de caracteres de longitud fija (C, N, D, T): Rellenado con espacios (según la longitud definida). P.ej. C(5) se convierte en ' '.
  • Cadena de caracteres de longitud variable (STRING): Cadena vacía ('').
  • Cadena de bytes de longitud fija (X): Rellenado con 00 hexadecimal (según la longitud definida). P.ej. X(2) se convierte en X'0000'.
  • Cadena de bytes de longitud variable (XSTRING): Cadena de bytes vacía.
  • Referencias (TYPE REF TO ...): La referencia se vuelve NULL (ya no apunta a ningún objeto o área de datos).

Estructuras

CLEAR actúa sobre cada componente de la estructura individualmente, según el tipo de datos del respectivo componente. Hacer CLEAR a una estructura significa establecer todos sus campos a sus valores iniciales.

Tablas internas

CLEAR <tabla_interna>. elimina todas las filas del cuerpo de la tabla. La tabla queda vacía después (contiene 0 filas). La memoria que ocupaban las filas se libera (con excepción de una memoria base posiblemente reservada por INITIAL SIZE).

  • Nota sobre tablas con línea de cabecera (obsoleto): En tablas que aún fueron declaradas con la antigua sintaxis DATA <tabla> TYPE <tipo> OCCURS n WITH HEADER LINE., CLEAR <tabla>. restablece tanto el cuerpo de la tabla como la línea de cabecera. CLEAR <tabla>[]. solo eliminaría el cuerpo. En declaraciones de tablas modernas (DATA <tabla> TYPE TABLE OF ...) no hay línea de cabecera, y CLEAR <tabla>. siempre elimina el cuerpo.

Diferencia con FREE

Aunque CLEAR en tablas internas libera la memoria de las filas, también existe la instrucción FREE.

  • CLEAR: Restablece el valor. En tablas: Elimina el contenido de filas y libera la memoria de filas.
  • FREE: Es más agresivo en la liberación de memoria, especialmente para tablas internas y objetos como strings. FREE <tabla>. intenta devolver toda la memoria de la tabla (incluyendo información de administración) al sistema operativo. FREE también restablece la variable a su valor inicial. Se usa FREE principalmente cuando tablas u objetos muy grandes definitivamente ya no se necesitan y la memoria debe liberarse urgentemente. Para variables elementales simples, FREE se comporta como CLEAR.

Casos de uso típicos para CLEAR

  • Inicializar una variable antes de la (re)utilización, para asegurar que no hay valores antiguos presentes.
  • Restablecer una estructura de trabajo (Work Area) antes de leer datos de una nueva fila de una tabla interna (importante en loops LOOP AT ... INTO wa.).
  • Vaciar una tabla interna antes de llenarla con nuevos datos.
  • Restablecer contadores, sumas o indicadores de estado.

Ejemplos

1. Variables elementales

DATA count TYPE i VALUE 55.
DATA description TYPE string VALUE 'Un texto'.
DATA is_valid TYPE abap_bool VALUE abap_true.
WRITE: / 'Antes:', count, description, is_valid.
CLEAR: count, description, is_valid.
WRITE: / 'Después:', count, description, is_valid.

Salida:

Antes: 55 Un texto X
Después: 0 ' '

(Nota: abap_false se representa como espacio ’ ‘).

2. Estructura

TYPES: BEGIN OF ty_person,
name TYPE string,
age TYPE i,
END OF ty_person.
DATA person TYPE ty_person.
person-name = 'Meier'.
person-age = 42.
WRITE: / 'Persona antes:', person-name, person-age.
CLEAR person.
WRITE: / 'Persona después:', person-name, person-age.

Salida:

Persona antes: Meier 42
Persona después: 0

3. Tabla interna

DATA number_table TYPE STANDARD TABLE OF i WITH EMPTY KEY.
APPEND 1 TO number_table.
APPEND 2 TO number_table.
APPEND 3 TO number_table.
WRITE: / 'Filas antes de CLEAR:', lines( number_table ).
CLEAR number_table.
WRITE: / 'Filas después de CLEAR:', lines( number_table ).

Salida:

Filas antes de CLEAR: 3
Filas después de CLEAR: 0

4. Área de trabajo en un loop

TYPES: BEGIN OF ty_item,
id TYPE i,
END OF ty_item.
DATA: lt_items TYPE STANDARD TABLE OF ty_item,
ls_item TYPE ty_item.
APPEND VALUE #( id = 10 ) TO lt_items.
APPEND VALUE #( id = 20 ) TO lt_items.
LOOP AT lt_items INTO ls_item.
WRITE: / 'Procesando ID:', ls_item-id.
" ... Lógica con ls_item ...
" Buena práctica: Vaciar Work Area para la próxima iteración o uso posterior
CLEAR ls_item.
WRITE: ' | Work Area ID después de CLEAR:', ls_item-id.
ENDLOOP.

Salida:

Procesando ID: 10 | Work Area ID después de CLEAR: 0
Procesando ID: 20 | Work Area ID después de CLEAR: 0

En resumen: CLEAR es una instrucción indispensable para restablecer objetos de datos de manera controlada a su estado inicial definido. Es fácil de aplicar y esencial para el procesamiento limpio de datos en muchos escenarios de programación ABAP.