Поиск…


Поле-символы

Символы поля эквивалентны 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow