✒️ABAP Los Field Symbols
ABAP Los Field Symbols
FIELD SYMBOLS
ABAP permite acceder a los objetos (data object) que hayan sido declarados bien de forma estática (por el nombre que se le haya dado), o bien de forma indirecta, a través de un field symbol. El field symbol es un nombre simbólico que permite operar con los distintos campos (fields).
Son los punteros referenciados de SAP. Un puntero es una variable que hace referencia a una región de memoria, es decir son objetos de datos que apuntan al contenido de una variable. Los “field symbols” son nombres simbólicos de otros campos. NO reservan espacio físicamente para un campo sino que “apuntan” a su contenido. Un field symbol puede apuntar a cualquier objeto de datos.
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 se puede 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).
A la hora de asignarle un valor se usará la sentencia ASSIGN para suministrar campos concretos. Otra opción puede ser usar la sentencia STRUCTURE para asignarle una estructura. Para limpiar el puntero y que no direccione a nada se usará la sentencia UNASSIGN.
Sintaxis:
FIELD-SYMBOLS <fs> [ <tipo> ].
En la sintaxis de los field-symbols, los símbolos "<" y ">" en <fs> forman parte de la sintaxis de la sentencia. Sirven para identificar un field-symbol en el código fuente de un programa. Con esta sentencia definimos el field-symbol en código del programa. Un field-symbol puede ser especificado con o sin identificación de tipo. Si no especificamos ningún tipo, se puede asignar cualquier objeto de dato, en tiempo de ejecución, al field-symbol. Durante el proceso de asignación, el field-symbol adquiere todos los atributos del objeto de dato.
En la opción <tipo> se puede utilizar la especificación directa (con TYPE), o la indirecta (con LIKE). Con la especificación de tipo, el sistema comprueba si los tipos del field-symbol y el dato son compatibles. En caso de no ser compatibles, se produce un error en tiempo de ejecución.
FIELD-SYMBOLS <fs> STRUCTURE <estructura> DEFAULT <campo>.
En esta sentencia se define el field-symbol estructurado <fs>, el cual apunta por defecto al campo <campo>. El sistema obliga a un campo inicial, aunque se puede modificar a posteriori. El field-symbol <fs> adquiere la estructura <fs> que puede ser cualquier field-string o estructura definida en el diccionario de datos. Las estructuras del diccionario de datos referenciadas en esta sentencia no tienen que ser declaradas con la sentencia TABLES. La estructura se debe especificar sin encerrar entre comillas (""), sin ser posible su especificación en tiempo de ejecución.
Si <estructura> no tiene componentes de tipo F o I, <campo> puede ser cualquier campo interno con la longitud de <estructura>. Si <campo> es menor que <estructura> aparecerá un error de sintaxis al verificar el programa.
Si durante la ejecución se asigna un campo al field-string, el sistema verificará la longitud. Si la longitud es menor a la de la estructura entonces se producirá un error en tiempo de ejecución. Si la estructura <estructura> tiene campos de tipo F o I, se debe especificar un campo con la misma estructura.
DECLARACIÓN DE UN FIELD SYMBOL
Se puede declarar un field symbol sin o con especificaciones de “tipo”. Si no se especifica el “type”, el field symbol asume todos los atributos técnicos del campo asignado. Si se especifica type, el sistema controla la compatibilidad del field symbol y el campo al que se está asociando en el momento de la ejecución de la sentencia de asignación.
La sintaxis de la declaración es:
FIELD-SYMBOLS <FS> [<type>|STRUCTURE <s> DEFAULT <wa>]
Los field symbols proveen gran flexibilidad ya que permiten, entre otras cosas procesar secciones de campos (se pueden especificar modificadores de desplazamiento y longitud dinámicamente), direccionar partes de un campo (asignando un field symbol a otro), lograr que un field symbol tome distintos atributos técnicos de los campos asignados a él, etc. Pero aumentan las posibilidades de error o de incorrectas asignaciones de datos durante la corrida, dado que los campos se asignan recién en el momento de ejecución del programa y las verificaciones de sintaxis y chequeos de seguridad son muy limitados para las operaciones que incluyen field symbols.
ASIGNACIÓN DE DATOS A UN FIELD SYMBOLS
En un programa, se pueden asignar objetos de datos a field symbols en cualquier momento, como también asignar una serie de diferentes objetos de datos a un field symbol. Para la asignación se utiliza la sentencia ASSIGN, que tiene varias variantes y parámetros. Una de estas variantes es la adición TYPE con los Abap types C, D, F, I, N, P, T y X que permiten setear el tipo de datos de un field symbol independientemente del objeto asignado.
Mediante la sentencia FIELD-SYMBOLS se declaran los field symbols dentro del programa. El field symbol puede ser declarado con un tipo definido si se conoce el tipo de la variable al que va apuntar, en caso contrario puede ser de tipo ANY.
Cuando un objeto de datos sea asignado a un field symbol hay que tener en cuenta que el tipo de dato del objeto asignado debe ser compatible con el tipo de dato del field symbol, si esto no se cumple puede ocurrir un error de sintaxis o de tiempo de ejecución, el error en tiempo de ejecución ocurre cuando el tipo de dato del field symbols es ANY.
Cuando ya se desee definir el field symbol lo que se hace es asignar el objeto de datos al field symbol mediante la sentencia ASSIGN.
Las referencias a los datos son punteros a los objetos de datos, para definir una referencia se hace usando la sentencia TYPE REF TO. La sentencia TYPES <reftype> TYPE REF TO data define una referencia a un objeto de datos (data object).
Con GET REFERENCE OF <data object> INTO <reference> se escribe la dirección de un data object al valor referencia.
Este apartado está muy relacionado con programación orientada a objetos. Se debe recordar que un objeto de datos (data object) es una parte del repositorio cuyo contenido puede ser direccionado e interpretado por el programa. Todos los objetos de datos deben de ser declarados dentro de un programa ABAP y no son persistentes, es decir sólo existen mientras el programa esté en ejecución. Se localizan rápidamente en el programa, pues todos para ser declarados, empiezan con la sentencia DATA.
CASTING
Se usa TYPE CASTING cuando se asigna un data object a un field symbol. En el caso expuesto el nombre de la tabla de la base de datos no se da a conocer hasta el momento de ejecución.
Dentro de la ejecución del programa se irán escribiendo los datos de la select en la cadena line, es en la línea posterior donde se podrá acceder a line como si fuera una estructura gracias a la sentencia CASTING. De esta manera, si se conocieran los nombres de los componentes dentro de la estructura, se podrían presentar llamándolos a cada uno por su nombre: WRITE <fs_wa>-.
Sin embargo, como se ha comentado, que no conocemos la tabla hasta el momento de su ejecución, por lo tanto no se puede hacer referencia de forma directa a sus campos. Para solucionar este problema se hace uso de la variante ASSIGN COMPONENT a través de la cual cada componente de <fs_wa> es asignado uno a uno al field symbol <fs_comp>.
Esta posibilidad tiene un problema y es que la dirección de line debe de satisfacer las mismas reglas de direccionamiento que la estructura de una tabla (la dirección deberá ser divisible por cuatro), esto se puede forzar declarando un campo entero “dummy” justamente antes de declarar la línea (ya que los enteros son siempre almacenados en direcciones que son divisibles por cuatro).
 
 
 
Sobre el autor
Publicación académica de Sergio Armando Beltran Castaneda, en su ámbito de estudios para la Carrera Consultor ABAP.
Sergio Armando Beltran Castaneda
Profesión: Ingeniero de Sistemas con Especialización en Gerencia de Proyectos - Colombia - Legajo: WK55K
✒️Autor de: 70 Publicaciones Académicas
🎓Cursando Actualmente: Consultor ABAP Nivel Avanzado
🎓Egresado del módulo:
Disponibilidad Laboral: FullTime
Presentación:
Soy ingeniero de sistemas desde hace mas de 10 años y quiero enfocarme en el mundo sap, iniciando en el lenguaje abap, con miras a ampliar mi conocimiento profesional y laboral.
Certificación Académica de Sergio Beltran