Field Symbols en ABAP

download Field Symbols en ABAP

of 8

Transcript of Field Symbols en ABAP

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

    Para declarar un field symbol genrico que apunte a cualquer tipo de tabla:

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

    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:

    Tambin podemos declarar un field symbol de un tipo determinado:

    FIELD-SYMBOLS TYPE i.

    Tambin 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 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 LIKE estructura.

    ASSIGN estructura TO .

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

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

    ASSIGN direccion+20(4) TO .

  • Field Symbols en ABAP

    Alejandro Torrijos Pgina 6

    WRITE: / .

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

    Si el field symbol apunta hacia algn objeto el resultado de esta espresin 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 instruccin:

    UNASSIGN .

    Asignacin dinmica:

    Podemos asignar los componentes de una estructura a un field symbol de forma dinmica:

    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 instruccin CASTING, por ejemplo:

  • Field Symbols en ABAP

    Alejandro Torrijos Pgina 7

    DATA x TYPE i VALUE 5.

    FIELD-SYMBOLS TYPE n.

    ASSIGN x TO CASTING.

    WRITE. / .

    Tambin lo podramos 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 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 .

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

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