SAP: Field Symbols en ABAP

Share Embed Donate


Short Description

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

Description

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 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 . Para declarar un field symbol genérico que apunte a cualquer tipo de tabla: FIELD-SIMBOLS 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 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 . Ahora podemos asignar un valor a la variable x mediante el field symbol: = 5. Para leer el contenido de la variable x podemos hacer dos cosas: WRITE: / x. WRITE: / .

Tipo de un field symbol: También podemos declarar un field symbol de un tipo determinado: FIELD-SYMBOLS TYPE i. También podemos declarar un field symbol del mismo tipo que un objeto/variable ya existente: FIELD-SYMBOLS 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 LIKE estructura. ASSIGN estructura TO . -columna1 = -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 TYPE c. ASSIGN (a) TO . 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 TYPE c. ASSIGN direccion+20(4) TO . Alejandro Torrijos

Página 5

Field Symbols en ABAP WRITE: / . 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 IS ASSIGNED. Si el field symbol apunta hacia algún objeto el resultado de esta espresión es verdadero, por ejempo: IF 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 .

Asignación dinámica: Podemos asignar los componentes de una estructura a un field symbol de forma dinámica: FIELD-SYMBOLS TYPE c. ASSIGN COMPONENT numero OF STRUCTURE domicilio TO . WRITE. / .

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 TYPE n. ASSIGN x TO CASTING. WRITE. / . También lo podríamos hacer de la siguientes tres maneras ASSIGN x TO CASTING LIKE x. ASSIGN x TO CASTING TYPE i. ASSIGN x TO 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 .

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

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF