Почему структура с только символьными и String
компонентами не может быть "приведена" как текстовая переменная
Причина указана в документации ABAP Strings :
"Структура, содержащая строку, имеет структуру deep и не может использоваться в качестве символьного поля так же, как структура flat .".
и Глубокий :
"Deep: [...] содержимое [...] адресовано внутренне с использованием ссылок ([...], строки ..."
и Требования к памяти для объектов Deep Data :
"Требуемый объем памяти для ссылки составляет 8 байт. [...] В строках [...] внутренняя создается неявная ссылка."
и ASSIGN - casting_spec :
"Если тип данных, определенный CASTING, является глубоким или если глубокие объекты данных хранятся в назначенной области памяти, глубокие компоненты должны появляться с точно таким же типом и положением в назначенной области памяти. В частности, это означает, что отдельные ссылочные переменные могут быть назначены только одному символу поля, который типизирован как ссылочная переменная того же статического типа. "
Теперь причина, по которой компилятор и среда выполнения не позволяют вам этого сделать, заключается в том, что если вы приведете целую глубокую структуру, вы можете изменить 8-байтовую ссылку, чтобы получить доступ к любому месту в памяти, которое могло бы быть опасным ( Насколько опасен доступ к массиву вне границ? ) и очень трудно анализировать последующие ошибки. Во всех языках программирования, насколько это возможно, компилятор предотвращает доступ за границы или проверки выполняются во время выполнения ( Проверка границ ).
Обход
Ваша проблема возникает во время выполнения, потому что вы используете динамически созданные объекты данных, но у вас будет точно такая же проблема во время компиляции со статически определенными объектами данных. Ниже приведено простое решение со статически определенной структурой.
Вы можете получить доступ к каждому полю структуры и объединить его в строку:
DATA: BEGIN OF dyn_wa,
country TYPE c LENGTH 3,
city TYPE string,
END OF dyn_wa,
lf_string TYPE string.
FIELD-SYMBOLS: <lf_field> TYPE clike.
dyn_wa = VALUE #( country = 'FR' city = 'Paris' ).
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE dyn_wa TO <lf_field>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
CONCATENATE lf_string <lf_field> INTO lf_string RESPECTING BLANKS.
ENDDO.
ASSERT lf_string = 'FR Paris'. " one space because country is 3 characters
RESPECTING BLANKS
сохраняет конечные пробелы для имитации ASSIGN ... CASTING
.