У оператора VALUE #( ) при формировании внутренних таблиц есть так называемая короткая форма:
|
VALUE dtype|#( [let_exp] [BASE itab] col1 = dobj11 ... ( col2 = dobj12 col3 = dobj13 ... ) ( col2 = dobj22 col3 = dobj23 ... ) ... col1 = dobj31 col2 = dobj32 ... ( col3 = dobj33 ... ) ( col3 = dobj43 ... ) ... ). |
Что соответствует следующему полному синтаксису:
|
VALUE dtype|#( [let_exp] [BASE itab] ( col1 = dobj11 ... col2 = dobj12 col3 = dobj13 ... ) ( col1 = dobj11 ... col2 = dobj22 col3 = dobj23 ... ) ... ( col1 = dobj31 col2 = dobj32 ... col3 = dobj33 ... ) ( col1 = dobj31 col2 = dobj32 ... col3 = dobj43 ... ) ... ). |
Таким образом мы можем не указывать все столбцы, если хотим их заполнить на основе столбцов вне внутренних скобок.
Удобно использовать для формирования диапазонов:
|
DATA lt_range TYPE RANGE OF i. lt_range = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 ) ( low = 21 high = 30 ) ( low = 41 high = 50 ) option = 'GE' ( low = 61 ) ). |
Все что указано за пределами внутренних скобок дублируется в следующие строки:
I |
BT |
1 |
10 |
I |
BT |
21 |
30 |
I |
BT |
41 |
50 |
I |
GE |
61 |
0 |
Но данный синтаксис в случае вложенных конструкторных операторов может приводить к непредвиденным результатам.
|
DATA lt_range TYPE RANGE OF i. lt_range = VALUE #( ( low = 1 ) ( VALUE #( sign = 'I' option = 'EQ' low = 2 ) ) ( low = 3 ) ). |
Исходя из документации в третьей строке мы должны увидеть пустые значения sign и option, т.к. мы ничего не указывали за пределами внутренних скобок, однако они заполнены из второй строки:
Описанное поведение судя по всему является багом, исправление будет под нотой: 3042453