Buscar..


Simbolos de campo

Los símbolos de campo son equivalentes de ABAP a los punteros, excepto que los símbolos de campo siempre están referenciados (no es posible cambiar la dirección real en la memoria).

Declaración

Para declarar un símbolo de campo, debe utilizarse la palabra clave FIELD-SYMBOLS . Los tipos pueden ser genéricos ( ANY [... TABLE] ) para manejar una amplia variedad de variables.

FIELD-SYMBOLS: <fs_line>     TYPE any,    "generic
               <fs_struct>   TYPE kna1.   "non-generic

Asignando

Los símbolos de campo unassigned están unassigned en la declaración, lo que significa que no apuntan a nada. El acceso a un símbolo de campo sin asignar dará lugar a una excepción y, si no se detecta, a un volcado breve. Por lo tanto, el estado debe ser verificado con IS ASSIGNED :

IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.

Como solo son referencias, no se pueden almacenar datos reales en el interior. Por lo tanto, los DATA declarados son necesarios en todos los casos de uso.

DATA: w_name  TYPE string VALUE `Max`,
      w_index TYPE i      VALUE 1.
 
FIELD-SYMBOLS <fs_name> TYPE any.

ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'.        "Changes to <fs_name> now also affect w_name

* As <fs_name> is generic, it can also be used for numbers

ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.    
ADD 1 TO <fs_name>.          "w_index gets incremented by one

Desasignar

A veces puede ser útil restablecer un símbolo de campo. Esto se puede hacer utilizando UNASSIGN .

UNASSIGN <fs>.
* Access on <fs> now leads to an exception again

Uso para tablas internas

Los símbolos de campo se pueden utilizar para modificar tablas internas.

LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
    wa-name1 = 'Max'. 
ENDLOOP.    

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
    <fs>-name1 = 'Max'. 
ENDLOOP.

¡Atención! Los símbolos de campo permanecen asignados incluso después de salir del bucle. Si desea reutilizarlos de forma segura, anule su asignación inmediatamente.

Referencias de datos

Esencial para las referencias de datos es la adición REF TO después de TYPE .

Creación dinámica de estructuras

Si el tipo de estructura debe decidirse en tiempo de ejecución, podemos definir nuestra estructura objetivo como referencia a los data tipo genérico.

DATA wa TYPE REF TO data.

Para dar un tipo a wa usamos la sentencia CREATE DATA . La adición TYPE se puede especificar por:

Referencia:

CREATE DATA wa TYPE kna1

  • Las comprobaciones estáticas están activas, por lo que no es posible crear un tipo desconocido

Nombre:

CREATE DATA wa TYPE (lw_name_as_string)

  • Los paréntesis son necesarios y lw_name_as_string contiene el nombre de los tipos como cadena.
  • Si no se encontró el tipo, se CX_SY_CREATE_DATA_ERROR una excepción del tipo CX_SY_CREATE_DATA_ERROR

Para la creación de instancias de tipos creados dinámicamente, se puede especificar la adición HANDLE . HANDLE recibe un objeto que hereda de CL_ABAP_DATADESCR .

CREATE DATA dref TYPE HANDLE obj

  • obj puede crearse usando los servicios de R un T ime T ype S
  • Debido a que dref sigue siendo una referencia a datos, debe ser anulada ( ->* ) para ser utilizada como contenedor de datos (normalmente se realiza a través de los símbolos de campo)

Servicios de tipo RunTime

Los servicios de tipo RunTime ( short: RTTS ) se usan para:

  • creando tipos (RunTime Type Creation; short: RTTC )
  • tipos de análisis (Identificación de tipo RunTime; breve: RTTI )

Las clases

CL_ABAP_TYPEDESCR 
  | 
  |--CL_ABAP_DATADESCR 
  |   | 
  |   |--CL_ABAP_ELEMDESCR 
  |   |--CL_ABAP_REFDESCR 
  |   |--CL_ABAP_COMPLEXDESCR 
  |       | 
  |       |--CL_ABAP_STRUCTDESCR 
  |       |--CL_ABAP_TABLEDESCR 
  | 
  |--CL_ABAP_OBJECTDESCR 
     | 
     |--CL_ABAP_CLASSDESCR 
     |--CL_ABAP_INTFDESCR

CL_ABAP_TYPEDESCR es la clase base. Implementa los métodos necesarios para describir:

  • DESCRIBE_BY_DATA
  • DESCRIBE_BY_NAME
  • DESCRIBE_BY_OBJECT_REF
  • DESCRIBE_BY_DATA_REF


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow