ABAP
Programación dinámica
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_stringcontiene el nombre de los tipos como cadena.- Si no se encontró el tipo, se
CX_SY_CREATE_DATA_ERRORuna excepción del tipoCX_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
objpuede crearse usando los servicios de R un T ime T ype S- Debido a que
drefsigue 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