Синтаксическая ошибка при построении ЗНАЧЕНИЯ строки таблицы из литерала

#abap

#abap

Вопрос:

Вот одна для вас.

Почему это не компилируется

 REPORT ZZY.

TYPES: my_int TYPE x LENGTH 4,
  my_int_table TYPE STANDARD TABLE OF my_int WITH EMPTY KEY.

DATA(g_tab_my_int) = VALUE my_int_table( ( 2 ) ).
  

и это происходит?

 REPORT ZZY.

TYPES: my_int TYPE x LENGTH 4,
  my_int_table TYPE STANDARD TABLE OF my_int WITH EMPTY KEY.

DATA(g_tab_my_int) = VALUE my_int_table( ( 2 * 1 ) ).
  

Ответ №1:

В документации ABAP для inside VALUE dtype|#( line | {LINES OF itab ...} ) говорится:

Если для line указан объект данных, этот объект должен быть совместим с типом строки.

Если для line указано выражение (встроенная функция, функциональный метод, выражение вычисления, выражение конструктора или табличное выражение), результат выражения должен быть конвертируемым в тип строки.

В вашем примере:

  • «2», являющийся числовым литералом, то есть объектом данных, допустим, только если он совместим с типом, т. Е. он точно такого же типа.
  • «1 * 2» является выражением, оно допустимо, поскольку существует правило преобразования из типа I в тип X.

Вы можете ввести более короткое выражение, например » 2″ : VALUE my_int_table( ( 2 ) ).

Комментарии:

1. Предостережение: Не используйте это обходное решение в жестких циклах или в другом коде, критически важном для производительности. ABAP не выполняет постоянное сворачивание, поэтому арифметическое выражение будет вычисляться во время выполнения при каждом запуске этого кода. Использование CONV для принудительного преобразования литерала было бы более целесообразным.