Я заметил странное поведение нового синтаксиса COND
при использовании внутри шаблона строки. Это касается длины строки по умолчанию. Похоже, что длина строки будет дефолтна всегда на том, что стоит после THEN
, даже если условие не выполнено.Странное поведение с использованием строковых шаблонов и нового синтаксиса COND
Проверьте следующий код!
REPORT zzz.
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
main.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD main.
DATA(l_bool) = abap_true.
DATA(l_v_line) = |{ COND #(WHEN l_bool IS INITIAL THEN 'AAA' ELSE 'BBBB') }|.
DATA(l_v_line2) = |{ COND #(WHEN l_bool IS INITIAL THEN 'AAA' ELSE 'BBBB') WIDTH = 4 }|.
DATA(l_v_line3) = |{ COND #(WHEN l_bool IS INITIAL THEN 'AAA ' ELSE 'BBBB') }|.
DATA(l_v_line4) = |{ COND #(WHEN l_bool IS NOT INITIAL THEN 'BBBB' ELSE 'AAA') }|.
WRITE /: l_v_line, l_v_line2, l_v_line3, l_v_line4.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_main=>main().
Выход
BBB
BBB·
BBBB
BBBB
Первые две переменные l_v_line
и l_v_line2
усечены, даже если условие оценивается как ложное. Если я поместил место после AAA
в l_v_line3
, тогда все в порядке. Помещение BBBB
после THEN
для l_v_line4
решает проблему.
Мой вопрос: является ли это поведение документировано где-либо в документации SAP? Я не мог найти никаких подсказок, которые привели бы меня к этому.
Спасибо. Интересно, что это работает так, как ожидалось: '| {COND # (WHEN l_bool IS INITIAL THEN \' AAA \ 'ELSE \' BBBB \ ')} |'. Кажется, что тип по умолчанию не соответствует строке, а не char3. Вы видите разницу с '| {COND # (WHEN l_bool IS INITIAL THEN 'AAA' ELSE 'BBBB')} |'? : D – Jagger
С моей точки зрения: когда вы используете эти кавычки - \ 'AAA \' - тип идентифицируется, это STRING, а строки не имеют фиксированной длины. Когда вы используете «AAA» - это могут быть C (3) или STRING, и по какой-то причине SAP решает, что это C (3) –