Anda di halaman 1dari 8

Field Symbols en ABAP

Alejandro Torrijos Pgina 1












FIELD SYMBOLS

Introduccin:
ABAP permite acceder a los objetos (data object) que hayan sido
declarados bien de forma esttica (por el nombre que les hayamos
dado), o bien de forma indirecta, a travs de un field symbol.
El field symbol es un nombre simblico que nos permite operar con los
distintos campos (fields). En realidad se trata de un puntero cuyo
contenido es la direccin 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 ms eficiente operar con punteros
que con los objetos, ya que los punteros ocupan mucho menos espacio
en memoria (a efectos prcticos podemos decir que no ocupan espacio
en memoria, aunque en realidad ocupan el espacio justo para guardar
una direccin 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.
Caractersticas:
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
Field Symbols en ABAP

Alejandro Torrijos Pgina 2

que el primero. En realidad lo que hacemos es copiar el contenido del
primer field symbol (una direccin de memoria) en el segundo.
Podemos especificar el tipo de field symbol o no. Si no se especifica, el
field symbol hereda las caractersticas tcnicas (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).
Declaracin:
Para declarar un field-symbol usamos la instruccin FIELD-SYMBOLS y le
damos un nombre que debe estar entre dos signos <> (angle
brackets).
Si no aadimos nada ms el field-symbol puede ser asignado a cualquier
tipo de objeto. As el field symbol heredar los atributos tcnicos del
objeto al que apunte.
Para declarar un field symbol genrico, que puede apuntar a cualquier
tipo de objeto:
FIELD-SYMBOLS <f> TYPE ANY
En este caso el field symbol NO puede incluirse en ninguna instruccin
propia de una tabla, ya que dara un error sintctico, por ejemplo no
podramos hacer esto:
READ TABLE <f>.
Para declarar un field symbol genrico que apunte a cualquer tipo de
tabla:
FIELD-SIMBOLS <f> TYPE ANY TABLE.
En este caso S podramos realizar instrucciones propias de una tabla,
pero NO de una tabla especfica, por ejemplo NO podramos hacer esto:
Field Symbols en ABAP

Alejandro Torrijos Pgina 3

READ TABLE <f> WITH TABLE KEY columna1 = x.
puesto que el sistema no sabe en tiempo de compilacin que la tabla
tiene la columna1 como clave.
Asignacin:
Para que el field symbol apunte a una variable primero declaramos la
variable y luego asignamos al field symbol la direccin 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:
Tambin podemos declarar un field symbol de un tipo determinado:
FIELD-SYMBOLS <f> TYPE i.
Tambin 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 carcter que representa un espacio en blanco (c(1)). Un field
symbol con un tipo declarado no apunta hacia ningn sitio hasta que se
le asigna un objeto. La asignacin se puede hacer en cualquier parte del
programa. Podemos asignar variables, estructuras o bien lneas de una
tabla interna.
Field Symbols en ABAP

Alejandro Torrijos Pgina 4

Si asignamos un field symbol sin tipificar a un puntero (reference) o a
un objeto complejo (por ejemplo una estructura o una tabla), tan slo
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 tcnicos que le permiten
hacerlo. Para ello habra que declarar el field symbol del tipo
correspondiente a la estructura o tabla. Esto se debe a que el field
symbol es tan slo un puntero, y no incorpora los atributos del objeto
hasta el momento de la ejecucin 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 esttica, igual que haramos si
trabajramos 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 instruccin 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 instruccin sera 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 dara un error. Si asignamos un
objeto que no es del mismo tipo pero que es convertible, el sistema
Field Symbols en ABAP

Alejandro Torrijos Pgina 5

acta del mismo modo que si hiciramos un casting, es decir, una
conversin forzada de un tipo a otro.
Si declaramos completamente el tipo de un field symbol, tan slo
podemos asignarle objetos que sean sean totalmente compatibles.
Cualquier atributo que no se especifique en la declaracin del field
symbol se hereda del objeto en la instruccin de asignacin.
Es recomendable, siempre que sea posible, especificar el tipo del field
symbol.
Acceso dinmico:
El field symbol permite acceder dinmicamente (en tiempo de
ejecucin) 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.
Asignacin 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>.
Field Symbols en ABAP

Alejandro Torrijos Pgina 6

WRITE: / <numero>.
En este caso asignamos al field symbol tan slo los 4 dgitos que
corresponden al nmero.
Comprobacin de asignacin:
Para comprobar si un field symbol ha sido asignado correctamente
podemos usar la expresin lgica <f> IS ASSIGNED.
Si el field symbol apunta hacia algn objeto el resultado de esta
espresin 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 instruccin:
UNASSIGN <f>.
Asignacin dinmica:
Podemos asignar los componentes de una estructura a un field symbol
de forma dinmica:
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 instruccin CASTING, por ejemplo:
Field Symbols en ABAP

Alejandro Torrijos Pgina 7


DATA x TYPE i VALUE 5.
FIELD-SYMBOLS <f> TYPE n.
ASSIGN x TO <f> CASTING.
WRITE. / <f>.
Tambin lo podramos 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 slo 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 tamao de la
tabla crece a medida que vamos aadiendo lneas, esta rea es
dinmica, y ms memoria va siendo asignada por el sistema a
medida que se necesita.
rea de almacenamiento de datos estticos. Como el tamao de
las variables y objetos estticos se declara al inicio del programa,
esta parte de la memoria tiene un tamao fijo durante el tiempo
que dure la ejecucin del programa.
Supongamos que declaramos una variable y un field symbol:
DATA a(20) TYPE c.
FIELD-SYMBOLS <f>.


Field Symbols en ABAP

Alejandro Torrijos Pgina 8

Supongamos que realizamos el siguiente loop de asignacin:
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 nmero 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 direccin del primer
carcter de los 20 que ocupa la variable a. En la segunda vuelta se
asigna la direccin del segundo carcter, etctera. A partir de la vuelta
20 estamos intentando asignar al field symbol una direccin de memoria
que cae fuera de la variable a.
Dado que la asignacin de un campo a un field symbol se produce en
tiempo de ejecucin, los errores son difciles de detectar en tiempo de
compilacin, y slo 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.