VALUE Operador: Construye y lee datos de forma rápida (más allá de APPEND)

Con la llegada de ABAP 7.40 aparecieron muchas mejoras de sintaxis que cambiaron completamente la forma de escribir código ABAP. Una de las más útiles y utilizadas es el operador VALUE.

Gracias a VALUE, puedes crear estructuras, tablas internas, rangos e incluso obtener valores de tablas internas en una sola expresión, evitando muchísimo código repetitivo.

¿Qué es VALUE?

VALUE es un operador de construcción de datos que te permite crear cualquier tipo de dato (un número, un texto, una estructura, una tabla interna, un rango) en el mismo lugar donde lo vas a usar, sin necesidad de:

  • declarar variables auxiliares
  • rellenar estructuras campo a campo
  • hacer múltiples APPEND
  • usar READ TABLE + IF sy-subrc

En otras palabras VALUE permite construir datos de forma declarativa y mucho más legible.

La sintaxis básica de VALUE es:

DATA(resultado) = VALUE tipo( ... ).

También puedes usar # para que ABAP infiera automáticamente el tipo:

DATA(resultado) = VALUE #( ... ).
Pieza¿Qué significa?
DATA(resultado)Declaro una variable para guardar el resultado
VALUE tipoOperador VALUE que construye un dato del tipo indicado
( ... )Dentro va lo que quieres construir (valores, filas, componentes)

¿Qué puedes construir con VALUE?

Con VALUE puedes crear prácticamente cualquier tipo de dato:

  • Variables
  • Estructuras
  • Tablas internas
  • Rangos
  • Valores por defecto

Ejemplos prácticos

Crear tablas internas

Antes:

DATA: lt_users TYPE TABLE OF ty_user,
ls_user TYPE ty_user.

ls_user-id = 1.
ls_user-name = 'Andrea'.
APPEND ls_user TO lt_users.

ls_user-id = 2.
ls_user-name = 'Laura'.
APPEND ls_user TO lt_users.

Con VALUE:

DATA(lt_users) = VALUE ty_t_users(
( id = 1 name = 'Andrea' )
( id = 2 name = 'Laura' )
).

Leer datos de tablas internas

Antes:

READ TABLE t_material_type INTO DATA(ls_mat) WITH KEY matnr = iv_matnr.
IF sy-subrc = 0.
lv_matnr_type = ls_mat-matnr_type.
ENDIF.

Con VALUE:

DATA(lv_matnr_type) = VALUE #( t_materials[ matnr = iv_matnr ]-matnr_type OPTIONAL ).

Crear estructuras

Antes (clásico):

TYPES: BEGIN OF ty_persona,
nombre TYPE string,
edad TYPE i,
END OF ty_persona.
DATA: ls_persona TYPE ty_persona.

ls_persona-nombre = 'Juan'.
ls_persona-edad = 30.

Con VALUE:

TYPES: BEGIN OF ty_persona,
         nombre TYPE string,
         edad   TYPE i,
       END OF ty_persona.

DATA(ls_persona) = VALUE ty_persona( nombre = 'Juan' edad = 30 ).

Incluso más compacto con #:

DATA(ls_persona) = VALUE #( nombre = 'Juan' edad = 30 ).

El operador VALUE es una de las herramientas más versátiles del ABAP moderno. Te permite construir prácticamente cualquier tipo de dato de forma declarativa y en una sola expresión.