Desde la versión 7.40, SP08 podemos utilzar declaraciones en línea con el operador de declaración DATA (…)
- Sintaxis
SELECT field1, field2, …
FROM database_table
INTO TABLE @DATA(internal_table)…
SELECT SINGLE field1, field2, …
FROM database_table
INTO @DATA(structure)…
- Efecto
Una expresión de declaración con el operador de declaración DATA declara una variable utilizada como un operando en la posición de escritura actual. La variable declarada es visible estáticamente en el programa desde la ubicación DATA(var) y es válida en el contexto actual. La declaración se realiza cuando se compila el programa, independientemente de si la declaración se ejecuta realmente.
La tabla interna del primer SELECT declarada con @DATA(internal_table) va a tener como componentes de su línea las columnas a seleccionar: field1, field2, etc. del mismo tipo que las columnas de base de datos.
En el segundo SELECT se declara una estructura que va a contener como componentes las columnas: field1, field2, etc.
- Notas
Una declaración en línea de una variable generalmente puede interpretarse como una forma abreviada de una declaración de declaración utilizada como un prefijo directo. Las excepciones a esta regla ocurren solo si se usa un objeto de datos con un nombre idéntico de un contexto más global en la misma declaración.
- Caso práctico
Primero veamos cómo se leía sin la declaración en línea en una tabla interna las columnas MATNR, LAEDA y MEINS. Para tener una tabla interna con las tres columnas necesitamos una estructura definida en el diccionario de datos o un tipo local y en base a esto se puede realizar la declaración de la tabla interna. El siguiente código realiza esta lógica:
TYPES: BEGIN OF gty_materials,
matnr TYPE matnr,
laeda TYPE laeda,
meins TYPE meins,
END OF gty_materials.
DATA gt_materials TYPE STANDARD TABLE OF gty_materials.
SELECT matnr laeda meins
FROM mara
INTO TABLE gt_materials
UP TO 5 ROWS.
En cambio, con la declaración en línea no necesitamos crear el tipo local y tampoco declarar la tabla interna.
SELECT matnr, laeda, meins
FROM mara
INTO TABLE @DATA(gt_materials)
UP TO 5 ROWS.
Las dos implementaciones devuelven el mismo resultado. Con la declaración en línea @DATA tenemos un código mucho más sencillo y fácil de implementar.
y si deseo traer solo ciertas variables en un select single como se colocaria ?
mmm ya vi sorry
Hola Gracias por la explicación, muy amable, tengo una duda, cuando haces una declaracion en linea por ejemplo en un FORM saco mi query con @DATA(gt_mitabla) pero en otro form quiero hacer uso de esa tabla sin pasarla por parametros en ese caso como se realiza, busque y hay formas con field-symbols o declarando ese query desde el top pero no hay algo en @DATA que permita que esa variable sea global estando en un primer FORM. Gracias
¡Hola! Gracias por tu consulta. En ABAP, cuando declaras una variable usando @DATA en un FORM, su alcance (scope) está limitado al bloque donde se declaró. Esto significa que no será accesible fuera del FORM. Sin embargo, si necesitas usar esa tabla interna en otros FORM, tienes algunas alternativas, pero no directamente con @DATA:
Tenemos las siguientes opciones:
1. Declarar la variable como global: Puedes declarar la tabla interna como una variable global en la sección TOP de tu programa. Esto permite que todos los FORM puedan acceder a la tabla sin necesidad de pasársela como parámetro.
2. Uso de FIELD-SYMBOLS (Referencias): Puedes declarar un FIELD-SYMBOL global, y asignarle la tabla interna localmente en el primer FORM. Esto funciona porque los FIELD-SYMBOLS no almacenan datos, solo apuntan a la ubicación en memoria de la variable.
3.Declarar con @DATA en un FORM y pasarlo como parámetro: Aunque mencionas que no quieres pasarlo como parámetro, esta es una forma más segura y legible de manejar datos entre subrutinas. Esto se hace definiendo una tabla interna con CHANGING o USING.
El uso de @DATA en ABAP está diseñado para crear variables locales de forma sencilla, pero no tiene una opción directa para hacer que estas variables sean globales. Esto es intencional, ya que la programación modular fomenta el uso de variables locales para evitar efectos secundarios y mejorar la legibilidad.
Si necesitas que una variable sea global, lo recomendable es usar DATA en la sección TOP del programa.
Si quieres el ejemplo de código de alguna de las soluciones que te indico, por favor házmelo saber.
Quedo atenta.
Un saludo.
Muchas Gracias, con tu respuesta es suficiente, lo agradezco. Saludos.