SAP: Field Symbols en ABAP

8
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

description

Manual sobre el concepto , declaración, asignación y uso de field symbols en ABAP

Transcript of SAP: Field Symbols en ABAP

Page 1: 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

Page 2: SAP: Field Symbols en ABAP

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:

Page 3: SAP: Field Symbols en ABAP

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.

Page 4: SAP: Field Symbols en ABAP

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

Page 5: SAP: Field Symbols en ABAP

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

Page 6: SAP: Field Symbols en ABAP

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:

Page 7: SAP: Field Symbols en ABAP

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

Page 8: SAP: Field Symbols en ABAP

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.