Está en la página 1de 8

Field Symbols en ABAP

FIELD SYMBOLS

Introducción:
ABAP permite acceder a los objetos (data object) que hayan sido
declarados bien de forma estática (por el nombre que les hayamos
dado), o bien de forma indirecta, a través de un field symbol.

El field symbol es un nombre simbólico que nos permite operar con los
distintos campos (fields). En realidad se trata de un puntero cuyo
contenido es la dirección de un objeto (data object), es decir, el field
symbol apunta a un objeto (cualquier tipo de objeto). El sistema no
reserva espacio en memoria para un field symbol.

Para el sistema no hay diferencia entre operar con el objeto o con el


field symbol, sin embargo, resulta más eficiente operar con punteros
que con los objetos, ya que los punteros ocupan mucho menos espacio
en memoria (a efectos prácticos podemos decir que no ocupan espacio
en memoria, aunque en realidad ocupan el espacio justo para guardar
una dirección de memoria, es decir, cuatro bytes).

Para aquellos que conocen el lenguaje C, un field symbol es lo mismo


que un puntero de-referenciado (es decir, un puntero al que se le ha
aplicado el operador * para acceder a su contenido). Cuando accedemos
a un field symbol en realidad accedemos al contenido de la variable u
objeto al que apunta.

Características:
Todas las instrucciones con field symbols se ejecutan en los campos
asignados. Así, una sentencia MOVE (copiar) de un field symbol a otro
se ejecuta haciendo que el segundo field symbol apunte al mismo objeto

Alejandro Torrijos Página 1


Field Symbols en ABAP

que el primero. En realidad lo que hacemos es copiar el contenido del


primer field symbol (una dirección de memoria) en el segundo.

Podemos especificar el tipo de field symbol o no. Si no se especifica, el


field symbol hereda las características técnicas (tipo) del campo
asignado. Si se le asigna un tipo este debe ser igual o compatible con el
objeto al que apunta.

Podemos asignar un field symbol a otro, lo que nos permite acceder a


los componentes de una estructura.

Podemos asignar estructuras complejas (por ejemplo una tabla) a un


field symbol.

Podemos forzar un field symbol de un tipo para que sea compatible con
un objeto de otro tipo (casting).

Declaración:
Para declarar un field-symbol usamos la instrucción FIELD-SYMBOLS y le
damos un nombre que debe estar entre dos signos <…> (angle
brackets).

Si no añadimos nada más el field-symbol puede ser asignado a cualquier


tipo de objeto. Así el field symbol heredará los atributos técnicos del
objeto al que apunte.

Para declarar un field symbol genérico, que puede apuntar a cualquier


tipo de objeto:

FIELD-SYMBOLS <f> TYPE ANY

En este caso el field symbol NO puede incluirse en ninguna instrucción


propia de una tabla, ya que daría un error sintáctico, por ejemplo no
podríamos hacer esto:

READ TABLE <f>.

Para declarar un field symbol genérico que apunte a cualquer tipo de


tabla:

FIELD-SIMBOLS <f> TYPE ANY TABLE.

En este caso SÍ podríamos realizar instrucciones propias de una tabla,


pero NO de una tabla específica, por ejemplo NO podríamos hacer esto:

Alejandro Torrijos Página 2


Field Symbols en ABAP

READ TABLE <f> WITH TABLE KEY columna1 = ‘x’.

puesto que el sistema no sabe en tiempo de compilación que la tabla


tiene la columna1 como clave.

Asignación:
Para que el field symbol apunte a una variable primero declaramos la
variable y luego asignamos al field symbol la dirección de esa variable:

DATA x TYPE i.

ASSIGN x TO <f>.

Ahora podemos asignar un valor a la variable x mediante el field


symbol:

<f> = 5.

Para leer el contenido de la variable x podemos hacer dos cosas:

WRITE: / x.

WRITE: / <f>.

Tipo de un field symbol:


También podemos declarar un field symbol de un tipo determinado:

FIELD-SYMBOLS <f> TYPE i.

También podemos declarar un field symbol del mismo tipo que un


objeto/variable ya existente:

FIELD-SYMBOLS <f> LIKE x.

El tipo asignado al field symbol y el tipo de variable a la que apunta


deben ser iguales, o bien compatibles. Si un field symbol no tiene un
tipo declarado apunta a un objeto del sistema llamado space, que es en
realidad un carácter que representa un espacio en blanco (c(1)). Un field
symbol con un tipo declarado no apunta hacia ningún sitio hasta que se
le asigna un objeto. La asignación se puede hacer en cualquier parte del
programa. Podemos asignar variables, estructuras o bien líneas de una
tabla interna.

Alejandro Torrijos Página 3


Field Symbols en ABAP

Si asignamos un field symbol sin tipificar a un puntero (reference) o a


un objeto complejo (por ejemplo una estructura o una tabla), tan sólo
podemos realizar operaciones con el objeto entero (por ejemplo copiar)
pero no podemos acceder a cada uno de sus componentes individuales,
ya que el field symbol no tiene los atributos técnicos que le permiten
hacerlo. Para ello habría que declarar el field symbol del tipo
correspondiente a la estructura o tabla. Esto se debe a que el field
symbol es tan sólo un puntero, y no incorpora los atributos del objeto
hasta el momento de la ejecución del programa.

Si, por el contrario, declaramos un field symbol de un tipo completo


(con todos los atributos declarados) podemos acceder a los distintos
componentes de un objeto de forma estática, igual que haríamos si
trabajáramos con el propio objeto al que está asignado.

Supongamos que asignamos un field symbol a una estructura:

DATA: BEGIN OF estructura,

columna1(1) TYPE c,

columna2(1) TYPE c VALUE ‘a’,

END OF estructura.

FIELD-SYMBOLS <f> LIKE estructura.

ASSIGN estructura TO <f>.

<f>-columna1 = <f>-columna2.

Tras ejecutar la última instrucción la columna1 contiene la letra a.

Al estar el field symbol totalmente tipificado, ya que lo hemos declarado


del mismo tipo que la estructura, podemos realizar las mismas
operaciones que con el objeto al que apunta. En el caso anterior la
última instrucción sería lo mismo que hacer lo siguiente:

estructura-columna1 = estructura-columna2.

Tipos compatibles y convertibles:


Si los tipos de la variable y del field symbol no son compatibles, o al
menos convertibles, el sistema nos daría un error. Si asignamos un
objeto que no es del mismo tipo pero que es convertible, el sistema

Alejandro Torrijos Página 4


Field Symbols en ABAP

actúa del mismo modo que si hiciéramos un casting, es decir, una


conversión forzada de un tipo a otro.

Si declaramos completamente el tipo de un field symbol, tan sólo


podemos asignarle objetos que sean sean totalmente compatibles.
Cualquier atributo que no se especifique en la declaración del field
symbol se hereda del objeto en la instrucción de asignación.

Es recomendable, siempre que sea posible, especificar el tipo del field


symbol.

Acceso dinámico:
El field symbol permite acceder dinámicamente (en tiempo de
ejecución) a los distintos objetos que existen en SAP. De esta forma
podemos acceder a objetos cuyo nombre no se conoce hasta el
momento en que se ejecuta el programa:

DATA nombre TYPE string VALUE 'hola'.

DATA a(10) TYPE c VALUE 'nombre'.

FIELD-SYMBOLS <f> TYPE c.

ASSIGN (a) TO <f>.

En este caso el field symbol apunta a la variable nombre, ya que este es


el contenido de la variable a.

Asignación de componentes de una estructura:


Podemos asignar componentes de una estructura a un field symbol, por
ejemplo:

DATA: BEGIN OF direccion,

calle(20) TYPE c VALUE 'calle real',

numero(4) TYPE c VALUE '74',

END OF direccion.

FIELD-SYMBOLS <numero> TYPE c.

ASSIGN direccion+20(4) TO <numero>.

Alejandro Torrijos Página 5


Field Symbols en ABAP

WRITE: / <numero>.

En este caso asignamos al field symbol tan sólo los 4 dígitos que
corresponden al número.

Comprobación de asignación:
Para comprobar si un field symbol ha sido asignado correctamente
podemos usar la expresión lógica <f> IS ASSIGNED.

Si el field symbol apunta hacia algún objeto el resultado de esta


espresión es verdadero, por ejempo:

IF <f> IS ASSIGNED,

WRITE 'El field symbol se ha asignado correctamente',

ENDIF.

Desasignar un field symbol:


Para desasignar el field symbol usamos la instrucción:

UNASSIGN <f>.

Asignación dinámica:
Podemos asignar los componentes de una estructura a un field symbol
de forma dinámica:

FIELD-SYMBOLS <f> TYPE c.

ASSIGN COMPONENT numero OF STRUCTURE domicilio TO <f>.

WRITE. / <f>.

Casting field symbols:


Si deseamos cambiar el tipo de variable del field symbol al de una
variable de otro tipo usamos la instrucción CASTING, por ejemplo:

Alejandro Torrijos Página 6


Field Symbols en ABAP

DATA x TYPE i VALUE 5.

FIELD-SYMBOLS <f> TYPE n.

ASSIGN x TO <f> CASTING.

WRITE. / <f>.

También lo podríamos hacer de la siguientes tres maneras

ASSIGN x TO <f> CASTING LIKE x.

ASSIGN x TO <f> CASTING TYPE i.

ASSIGN x TO <f> CASTING TYPE (x).

Áreas de datos para un field symbol:


Tan sólo podemos asignar a un field symbol objetos del área de datos de
un programa ABAP. Por defecto el sistema comprueba para asegurarse
de que el field symbol no está tocando datos fuera del área de memoria
reservada para ese programa.

Las áreas de memoria reservadas para un programa son:

 Área reservada para tablas internas. Puesto que el tamaño de la


tabla crece a medida que vamos añadiendo líneas, esta área es
dinámica, y más memoria va siendo asignada por el sistema a
medida que se necesita.
 Área de almacenamiento de datos estáticos. Como el tamaño de
las variables y objetos estáticos se declara al inicio del programa,
esta parte de la memoria tiene un tamaño fijo durante el tiempo
que dure la ejecución del programa.

Supongamos que declaramos una variable y un field symbol:

DATA a(20) TYPE c.

FIELD-SYMBOLS <f>.

Alejandro Torrijos Página 7


Field Symbols en ABAP

Supongamos que realizamos el siguiente loop de asignación:

DO 1000 times.

ASSIGN a+sy-index(1) TO <f>.

ENDDO.

Puesto que la variable a tiene asignados tan solo 20 bytes en la


memoria (uno por cada uno de los caracteres) el loop se sale
claramente de la memoria a partir de la vuelta número 20. Recordemos
que la variable de sistema sy-index guarda la vuelta del loop (realmente
es un contador de vueltas).

En la primera vuelta se asigna al field symbol <f> la dirección del primer


carácter de los 20 que ocupa la variable a. En la segunda vuelta se
asigna la dirección del segundo carácter, etcétera. A partir de la vuelta
20 estamos intentando asignar al field symbol una dirección de memoria
que cae fuera de la variable a.

Dado que la asignación de un campo a un field symbol se produce en


tiempo de ejecución, los errores son difíciles de detectar en tiempo de
compilación, y sólo se descubren cuando se ejecuta el programa.

En ese momento el sistema nos muestra una pantalla con el tipo de


error (error al intentar acceder a un área de memoria protegida) y la
fecha y la hora en que se ha producido.

Alejandro Torrijos Página 8