Operaciones más importantes con tablas internas en ABAP

Las tablas internas son una de las estructuras más utilizadas en ABAP. Gran parte de la lógica de negocio consiste en leer, modificar, ordenar, filtrar y procesar datos almacenados en ellas.

Aunque muchos desarrolladores conocen las operaciones básicas, ABAP ofrece bastantes más posibilidades de las que suelen usarse en el día a día.

En este artículo repasamos las operaciones más importantes que puedes realizar sobre una tabla interna.

Añadir registros

APPEND

Añade una nueva línea al final de la tabla.

APPEND ls_material TO lt_materiales.

Es la operación más habitual cuando trabajas con tablas estándar.

INSERT

Permite insertar registros en una posición específica o respetando las reglas de una tabla ordenada.

INSERT ls_material INTO TABLE lt_materiales.

O por índice:

INSERT ls_material INTO lt_materiales INDEX 3.

Leer datos

READ TABLE

Busca un registro dentro de la tabla.

READ TABLE lt_materiales INTO ls_material WITH KEY matnr = lv_matnr.

También puede buscarse por índice:

READ TABLE lt_materiales INTO ls_material INDEX 1.

Alternativa más moderna a READ TABLE.

DATA(ls_material) = lt_materiales[ matnr = lv_matnr ].

O recuperar directamente un campo:

DATA(lv_maktx) = lt_materiales[ matnr = lv_matnr ]-maktx.

Recorrer registros

LOOP AT

Permite iterar sobre todos los registros.

LOOP AT lt_materiales INTO DATA(ls_material).
  WRITE ls_material-matnr.
ENDLOOP.

También puede usarse con condiciones:

LOOP AT lt_materialesINTO DATA(ls_material)WHERE mtart = 'FERT'.
  "Lógica
ENDLOOP.

Modificar registros

MODIFY

Actualiza una línea existente.

MODIFY lt_materiale FROM ls_material.

Por índice:

MODIFY lt_materiales FROM ls_material INDEX 2.

Eliminar registros

DELETE

Elimina registros concretos.

Por clave:

DELETE lt_materiales WHERE matnr = lv_matnr.

Por índice:

DELETE lt_materiales INDEX 1.

Eliminar todo:

DELETE lt_materiales.

Ordenar datos

SORT

Ordena los registros.

Ascendente:

SORT lt_materiales BY matnr.

Descendente:

SORT lt_materiales BY matnr DESCENDING.

Por varios campos:

SORT lt_materiales BY werks matnr.

Buscar duplicados

DELETE ADJACENT DUPLICATES

Elimina registros duplicados consecutivos. Antes es necesario ordenar.

SORT lt_materiales BY matnr.

DELETE ADJACENT DUPLICATES FROM lt_materiales COMPARING matnr.

Vaciar tablas

CLEAR

Vacía la tabla manteniendo memoria reservada.

CLEAR lt_materiales.

FREE

Vacía la tabla y libera la memoria utilizada.

FREE lt_materiales.

REFRESH

Sintaxis antigua equivalente a vaciar la tabla. Hoy se considera obsoleta.

REFRESH lt_materiales.

Comprobar si tiene datos

Antes de procesar una tabla es habitual verificar si contiene registros.

IF lt_materiales IS NOT INITIAL.

ENDIF.

O:

IF lines( lt_materiales ) > 0.

ENDIF.

Obtener número de registros

LINES

Devuelve el número de filas.

DATA(lv_lines) = lines( lt_materiales ).

Crear tablas filtradas

FILTER

ABAP moderno permite filtrar registros fácilmente.

DATA(lt_fert) = FILTER #( lt_materiales WHERE mtart = 'FERT' ).

Evita muchos LOOP con IF.

Construir tablas

VALUE

Permite crear tablas completas en una sola expresión.

DATA(lt_materiales) = VALUE tt_material(
( matnr = 'MAT1' )
( matnr = 'MAT2' )
).

Muy útil para pruebas y datos temporales.

Agrupar registros

COLLECT

Inserta registros acumulando automáticamente los campos numéricos cuando la clave ya existe.

COLLECT ls_ventas INTO lt_ventas.

Aunque sigue existiendo, hoy suele verse menos porque muchos escenarios se resuelven mejor mediante SQL o agrupaciones modernas.

Comprobar existencia de registros

LINE_EXISTS

Permite verificar si existe una línea sin necesidad de READ TABLE.

IF line_exists( lt_materiales[ matnr = lv_matnr ] ).

ENDIF.

Es una alternativa moderna y muy legible.

Obtener posición de un registro

LINE_INDEX

Devuelve la posición de una línea encontrada.

DATA(lv_index) =nline_index(lt_materiales[ matnr = lv_matnr ] ).

A modo resumen

OperaciónDescripciónEjemplo
APPENDAñade una línea al final de la tabla.APPEND ls_data TO lt_data.
INSERTInserta una línea.INSERT ls_data INTO lt_data.
MODIFYModifica una línea existente.MODIFY lt_data FROM ls_data INDEX 3.
DELETEElimina una línea completa.DELETE lt_data INDEX 5.
SORTOrdena la tabla (ascendente o descendente).SORT lt_data BY campo1 DESCENDING campo2.
LOOP ATItera sobre las líneas de la tabla.LOOP AT lt_data INTO ls_data.
READ TABLEBusca y lee una línea específica.READ TABLE lt_data WITH KEY id = '123'.
COLLECTAgrupa por claves suma campos numéricos.COLLECT ls_data INTO lt_data.

Dominar estas operaciones es fundamental porque gran parte del trabajo diario de un programador ABAP consiste precisamente en mover, transformar y procesar datos dentro de tablas internas.