La sentencia DATA es la sentencia fundamental en ABAP para declarar variables. Las variables son objetos de datos nombrados (areas de memoria) cuyo contenido o valor puede cambiar durante la ejecucion del programa. Son el nucleo del procesamiento de datos en ABAP, ya que permiten almacenar, leer, calcular y manipular informacion.
A diferencia de las constantes (declaradas con CONSTANTS), cuyo valor queda fijo despues de la declaracion, las variables son flexibles. Cada variable tiene un tipo de datos que determina que tipo de datos puede almacenar (p. ej. texto, numero, fecha) y cuanto espacio de memoria necesita.
Sintaxis
La declaracion de variables con DATA puede realizarse de varias formas:
1. Declaracion de una variable individual
DATA <nombre_variable> TYPE <tipo_datos> [LENGTH <longitud>] [DECIMALS <decimales>] [VALUE <valor_inicial> | IS INITIAL].<nombre_variable>: El nombre de la variable (debe cumplir las convenciones de nomenclatura ABAP).TYPE <tipo_datos>: Metodo preferido. Indica el tipo de datos (p. ej.I,P,C,STRING,D,T,F,XSTRING, un tipo del diccionario comoMARA-MATNR, un tipo global de la SE11 o un tipo local).LIKE <otro_objeto_datos>: Metodo antiguo, deberia reemplazarse porTYPEen codigo nuevo. La variable hereda el tipo de datos y propiedades de otro objeto de datos ya declarado (p. ej. otra variable, un componente de estructura, un campo del diccionario comoMARA-MATNR).LENGTH <longitud>: Especificacion de longitud explicita opcional para ciertos tipos (C,N,X,P).DECIMALS <decimales>: Necesario para el tipoP(numero empaquetado), para definir el numero de decimales.VALUE <valor_inicial>: Opcional. Asigna un valor inicial a la variable directamente en la declaracion.VALUE IS INITIAL: Opcional. Asigna explicitamente el valor inicial especifico del tipo. Este es el comportamiento predeterminado cuando faltaVALUE.
2. Declaracion de multiples variables (sentencia encadenada)
DATA: <var1> TYPE <tipo1> [VALUE <valor1>], <var2> LIKE <campo2>, <var3> TYPE <tipo3>, ... .Con dos puntos despues de DATA, se pueden declarar multiples variables separadas por comas. La sentencia termina con un punto.
3. Declaracion de una variable de estructura
DATA: BEGIN OF <nombre_estructura>, <componente1> TYPE <tipo1> [VALUE <valor1>], <componente2> LIKE <campo2>, ... END OF <nombre_estructura>.Define una variable que contiene un grupo de componentes (campos).
4. Declaracion de una tabla interna
DATA <tabla> TYPE [STANDARD | SORTED | HASHED] TABLE OF <tipo_linea> [WITH <definicion_clave>] [INITIAL SIZE <n>].Define una tabla interna, una estructura de datos dinamica para mantener multiples filas del mismo tipo (<tipo_linea>).
5. Declaracion de una variable de referencia
DATA <variable_ref> TYPE REF TO <tipo> | <clase> | <interface> | DATA.Define una variable que no contiene datos directamente, sino que apunta a otros objetos de datos o instancias de clases/interfaces (similar a un puntero).
Inicializacion / Valores predeterminados
Si no se especifica el agregado VALUE en la declaracion con DATA, la variable se inicializa automaticamente con el valor inicial especifico del tipo:
- Tipos numericos (
I,P,F):0 - Tipos de caracteres (
C,N,STRING): Espacios en blanco (C,N) o cadena vacia (STRING) - Fecha/Hora (
D,T):'00000000'o'000000'respectivamente - Tipos de bytes (
X,XSTRING): Hexadecimal 0 (X'00') o cadena de bytes vacia (XSTRING) - Referencias (
REF TO): ReferenciaNULL(no apunta a nada)
Declaracion Inline (Estilo ABAP moderno >= 7.40)
Una alternativa moderna muy comun es la declaracion inline. La variable se declara directamente en el lugar donde se le asigna un valor por primera vez:
DATA(<nueva_variable>) = <expresion>.
" Ejemplos:DATA(lv_datum) = sy-datum. " lv_datum obtiene automaticamente el tipo DDATA(lo_instance) = NEW zcl_meine_klasse( ). " lo_instance obtiene tipo REF TO zcl_meine_klasseSELECT SINGLE * FROM t001 WHERE bukrs = '0001' INTO @DATA(ls_t001). " ls_t001 obtiene tipo T001El tipo de la variable se deriva automaticamente por el compilador del contexto (p. ej. del resultado de la expresion en el lado derecho o de la sentencia SELECT). Esto reduce el esfuerzo de declaracion y mantiene la declaracion cerca del uso.
Ambito de validez (Scope)
El lugar de la declaracion DATA determina donde la variable es valida (visible y utilizable):
- Global: Declaracion en la parte de declaracion global de un programa (REPORT, FUNCTION-POOL, CLASS-POOL). La variable es valida en todo el programa/objeto.
- Local: Declaracion dentro de un procedimiento (METHOD, FUNCTION, FORM). La variable solo es valida dentro de ese procedimiento.
Ejemplos
1. Variables simples
DATA counter TYPE i. " Integer, valor inicial 0DATA message TYPE string VALUE `Hola`. " String con valor inicialDATA customer_id TYPE n LENGTH 10. " Texto numerico, 10 digitos, valor inicial '0000000000'DATA valid_until TYPE d. " Fecha, valor inicial '00000000'DATA company_name TYPE name1. " Tipo diccionario (p.ej. de KNA1)DATA total_amount LIKE bseg-wrbtr. " Tipo del campo WRBTR de estructura BSEG (sintaxis antigua)2. Sentencia encadenada
DATA: first_name TYPE string, last_name TYPE string, age TYPE i VALUE 30, city TYPE string.3. Variable de estructura
DATA: BEGIN OF person, name TYPE string, geb_dat TYPE d, " Fecha de nacimiento plz TYPE ad_pstcd1, " Codigo postal (tipo diccionario) ort TYPE string, END OF person.
person-name = 'Perez'.person-geb_dat = '19900101'.4. Tabla interna
TYPES: BEGIN OF ty_material_s, matnr TYPE matnr, maktx TYPE maktx, END OF ty_material_s.
DATA materials TYPE STANDARD TABLE OF ty_material_s WITH EMPTY KEY.DATA user_list TYPE HASHED TABLE OF syuname WITH UNIQUE KEY table_line.5. Variable de referencia
DATA alv_grid TYPE REF TO cl_gui_alv_grid.DATA data_ref TYPE REF TO data.6. Declaracion inline en accion
DATA(lv_user) = sy-uname.WRITE: / 'Usuario actual:', lv_user.
LOOP AT materials INTO DATA(ls_material). " ls_material se declara inline (Tipo: ty_material_s) WRITE: / ls_material-matnr, ls_material-maktx.ENDLOOP.
TRY. DATA(lo_calculator) = NEW zcl_simple_calculator( ). " lo_calculator es REF TO zcl_simple_calculator DATA(lv_result) = lo_calculator->add( val1 = 5 val2 = 10 ). " lv_result es I (si el metodo retorna I) WRITE: / 'Resultado:', lv_result. CATCH cx_root INTO DATA(lx_error). " lx_error es REF TO cx_root WRITE: / 'Error:', lx_error->get_text( ).ENDTRY.En resumen: La sentencia DATA es indispensable para trabajar con datos modificables en ABAP. La declaracion inline moderna DATA(...) simplifica considerablemente la definicion de variables y es hoy estandar en muchos escenarios de desarrollo.