В методе у меня есть ссылка на таблицу, которая была объявлена следующим образом:
DATA: tabname TYPE tabname,
dref TYPE REF TO data,
FIELD-SYMBOLS: <itab> TYPE ANY TABLE.
CREATE DATA dref TYPE TABLE OF (tabname).
ASSIGN dref->* TO <itab>.
SELECT * FROM (tabname)
UP TO 5 ROWS
INTO TABLE <itab>.
Как создать структуру на основе?
Вы можете использовать встроенное объявление для определения WA следующим образом. READ TABLE <itab> INTO (<wa>)
или сначала объявите символ WA / Field с помощью FIELD SYMBOL <wa> TYPE ANY
, затем прочитайте таблицу с помощью READ TABLE <tab> ASSIGNING <wa>
ПРОЧИТАЙТЕ ТАБЛИЦУ <itab> В (<wa>) строку ИНДЕКС. дает мне: Поле "(<WA>)" неизвестно. Его нет ни в одной из указанных таблиц, ни в операторе "DATA". .
Может опечатка. Пожалуйста, попробуйте FIELD-SYMBOLS <fs>. READ TABLE <table> INTO <fs> WITH KEY (fld_name) = "value".
Это именно тот код в моей программе
ПОЛЕ-СИМВОЛЫ <fs>. выдает ошибку: нетипизированные символы поля не поддерживаются в объектно-ориентированном контексте. Используйте «СИМВОЛЫ ПОЛЯ ... НАПИРАЙТЕ ЛЮБОЙ». .
Пожалуйста, взгляните на эту статью blogs.sap.com/2014/04/03/…
1. Вы определяете символ поля ANY
и используете ASSIGNING
FIELD-SYMBOLS:
<line> type any.
LOOP at <itab> ASSIGNING <line>.
ENDLOOP.
2. Вы определяете символ поля ANY
и используете INTO
FIELD-SYMBOLS:
<line> type any.
CREATE DATA dref like line of <itab>.
ASSIGN dref->* to <line>.
LOOP at <itab> INTO <line>.
ENDLOOP.
Согласен, но я не вижу интереса к решению 2 с CREATE DATA и INTO (более сложным, менее производительным, без преимуществ)
Решение 2 @SandraRossi показывает, как динамически определять тип строки таблицы. Это лишь один из ответов на вопрос. И INTO, и ASSIGNING имеют свои подводные камни.
Просто используйте для этого старый добрый RTTS. Вы можете создать ссылку и читать прямо в ней
FIELD-SYMBOLS: <itab> TYPE STANDARD TABLE.
DATA: ref_wa TYPE REF TO data,
ref_rowtype TYPE REF TO cl_abap_structdescr,
ref_tabletype TYPE REF TO cl_abap_tabledescr.
ref_rowtype ?= cl_abap_typedescr=>describe_by_name( tabname ).
CREATE DATA ref_wa TYPE HANDLE ref_rowtype.
READ TABLE <itab> REFERENCE INTO ref_wa INDEX 1.
или создать поле-символ на основе этой ссылки и использовать его в ТАБЛИЦЕ ДЛЯ ЧТЕНИЯ
ASSIGN ref_wa->* TO FIELD-SYMBOL(<fsym_wa>).
READ TABLE <itab> ASSIGNING <fsym_wa> INDEX 1.
Обратите внимание, я объявил <itab>
как таблицу СТАНДАРТ, чтобы избавиться от возникшей у вас операции с ошибкой индекса.
ОБНОВИТЬ: для создания структуры из объекта <itab>
используйте этот синтаксис:
ref_tabletype ?= cl_abap_typedescr=>describe_by_data( <itab> ).
ref_rowtype ?= ref_tabletype->get_table_line_type( ).
Последние две строки будут идентичны.
Спасибо за ваше указание. Но просто пытаюсь освоить RTTS - могу ли я использовать это решение с <itab>, а не с именем объекта dict?
ПРОЧИТАЙТЕ ТАБЛИЦУ <itab> НАЗНАЧЕНИЕ <fs> строки ИНДЕКСА. дает мне: вы не можете использовать явные или неявные операции с индексами для таблиц с типами «HASHED TABLE» или «ANY TABLE». «<ITAB>» имеет тип «ЛЮБАЯ ТАБЛИЦА». Возможно, что добавление «ТАБЛИЦА» не было указано перед «<ITAB>».