SAPфорум.RU
https://www.sapboard.ru/forum/

Запись в <fs> c + i
https://www.sapboard.ru/forum/viewtopic.php?f=13&t=96692
Страница 1 из 1

Автор:  santa-by [ Вт, авг 07 2018, 12:42 ]
Заголовок сообщения:  Запись в <fs> c + i

Добрый день,

Подскажите, пожалуйста, что происходит в выделенной области?

REPORT demo_field_symbols_stat_as_of2 .

FIELD-SYMBOLS <fs> TYPE ANY.

DATA: BEGIN OF line,
a TYPE c VALUE '1', b TYPE c VALUE '2',
c TYPE c VALUE '3', d TYPE c VALUE '4',
e TYPE c VALUE '5', f TYPE c VALUE '6',
g TYPE c VALUE '7', h TYPE c VALUE '8',
END OF line,
off TYPE i,
len TYPE i VALUE 2.

DO 2 TIMES.
off = sy-index * 3.
ASSIGN line-a+off(len) TO <fs>
<fs> = 'XX'.
ENDDO.

DO 8 TIMES.
off = sy-index - 1.
ASSIGN line-a+off(1) TO <fs>.
WRITE <fs>.
ENDDO.

Почему в процессе первого цикла после первого прохождения <fs> = 45, потом ему присваивается 'ХХ', а после второго он уже равен 78 (потом ему снова присваивается 'ХХ')? line-a - поле с типом char, off - переменная с типом i. Что подразумевается под "+" в данном случае? Заранее благодарю за ответ.

Автор:  pberezin [ Вт, авг 07 2018, 15:43 ]
Заголовок сообщения:  Re: Запись в <fs> c + i

происходит корявый способ модификации строковых данных, засунутых в структуру, через указатель (field-symbol) :D

ASSIGN line-a+off(len) TO <fs>
значит отсчитай от места, где в памяти хранится содержимое переменной line-a смещение равное off символов (байтов), с указанной позиции возьми len=2 символов (байтов) и присвой ссылку на эти байты в указатель <fs>.
соответственно, следующей строкой оно пихает в это место 2 символа 'XX'.

Если взять аналог на VBA
то выполняется аналог присвоения в середину строки Mid(line-a, off+1, len) = 'XX' только не напрямую, а через указатель. Здесь off+1 потому что в VBA отсчёт от начала строки идёт с единицы, а в абапе смещение всегда от нуля. Т.е. line-a+0(2) = первые два символа строки line-a, line-a+1(2) = второй и третий символ строки line-a.

В документации по абап всё подробно с примерами разжёвано.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/