Está en la página 1de 8

Field Symbols en ABAP

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 Alejandro Torrijos Pgina 1

Field Symbols en ABAP


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: Alejandro Torrijos Pgina 2

Field Symbols en ABAP


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.

Alejandro Torrijos

Pgina 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 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 Alejandro Torrijos Pgina 4

Field Symbols en ABAP


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>. Alejandro Torrijos Pgina 5

Field Symbols en ABAP


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:

Alejandro Torrijos

Pgina 6

Field Symbols en ABAP


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>.

Alejandro Torrijos

Pgina 7

Field Symbols en ABAP


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.

Alejandro Torrijos

Pgina 8

También podría gustarte