SAP: Field Symbols en ABAP
-
Upload
alejandro-torrijos -
Category
Documents
-
view
9.612 -
download
3
description
Transcript of SAP: Field Symbols en ABAP
Field Symbols en ABAP
Alejandro Torrijos Página 1
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
Field Symbols en ABAP
Alejandro Torrijos Página 2
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:
Field Symbols en ABAP
Alejandro Torrijos Página 3
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.
Field Symbols en ABAP
Alejandro Torrijos Página 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 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
Field Symbols en ABAP
Alejandro Torrijos Página 5
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>.
Field Symbols en ABAP
Alejandro Torrijos Página 6
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:
Field Symbols en ABAP
Alejandro Torrijos Página 7
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>.
Field Symbols en ABAP
Alejandro Torrijos Página 8
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.