ABAP
Динамическое программирование
Поиск…
Поле-символы
Символы поля эквивалентны ABAP для указателей, за исключением того, что полевые символы всегда разыменовываются (изменить фактический адрес в памяти невозможно).
декларация
Чтобы объявить полевой символ, необходимо использовать ключевое слово FIELD-SYMBOLS . Типы могут быть общими ( ANY [... TABLE] ) Для обработки самых разных переменных.
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
Назначение
Полевые символы unassigned декларируются при объявлении, а это означает, что они ничего не указывают. Доступ к неназначенному полю-символу приведет к исключению и, если не показано, короткому дампу. Поэтому состояние должно быть проверено с помощью IS ASSIGNED :
IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.
Поскольку они являются только ссылками, реальные данные не могут храниться внутри. Таким образом, объявленный DATA необходим в каждом случае использования.
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
отменяете
Иногда может быть полезно сбросить полевой символ. Это можно сделать с помощью UNASSIGN .
UNASSIGN <fs>.
* Access on <fs> now leads to an exception again
Использование для внутренних таблиц
Полевые символы могут использоваться для изменения внутренних таблиц.
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.
Внимание! Полевые символы остаются назначенными даже после выхода из цикла. Если вы хотите повторно использовать их безопасно, немедленно отмените их назначение.
Ссылки на данные
Существенным для ссылок на данные является добавление REF TO после TYPE .
Динамическое создание структур
Если тип структуры должен быть определен во время выполнения, мы можем определить нашу целевую структуру в качестве ссылки на data типового типа.
DATA wa TYPE REF TO data.
Чтобы wa тип, мы используем оператор CREATE DATA . TYPE добавления можно указать:
Ссылка:
CREATE DATA wa TYPE kna1
- Статические проверки активны, поэтому невозможно создать неизвестный тип
Название:
CREATE DATA wa TYPE (lw_name_as_string)
lw_name_as_stringнужны, аlw_name_as_stringсодержитlw_name_as_stringтипов в виде строки.- Если тип не найден, будет
CX_SY_CREATE_DATA_ERRORисключение типаCX_SY_CREATE_DATA_ERROR
Для создания динамически создаваемых типов может быть указано дополнение HANDLE . HANDLE получает объект, который наследуется от CL_ABAP_DATADESCR .
CREATE DATA dref TYPE HANDLE obj
objможет быть создан с использованием R un T ime T ype S ervices- потому что
drefвсе еще является datareference, он должен быть разыменован (->*), который будет использоваться как datacontainer (обычно это делается с помощью полевых символов)
Службы типа RunTime
Службы типа RunTime ( короткие: RTTS ) используются либо для:
- создание типов (создание типа RunTime, короткий: RTTC )
- анализирующие типы (идентификатор типа RunTime, короткий: RTTI )
Классы
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 - базовый класс. Он реализует необходимые методы для описания:
-
DESCRIBE_BY_DATA -
DESCRIBE_BY_NAME -
DESCRIBE_BY_OBJECT_REF -
DESCRIBE_BY_DATA_REF