2016-03-14 2 views
1

Я заметил странное поведение нового синтаксиса 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? Я не мог найти никаких подсказок, которые привели бы меня к этому.

ответ

2

from ABAP documentation

Символ # в качестве символа для данного типа операнда.

...

Если тип операнда не полностью идентифицировать, операнд с статически идентифицировать тип должен быть указан после первого THEN. Затем этот тип используется.

+0

Спасибо. Интересно, что это работает так, как ожидалось: '| {COND # (WHEN l_bool IS INITIAL THEN \' AAA \ 'ELSE \' BBBB \ ')} |'. Кажется, что тип по умолчанию не соответствует строке, а не char3. Вы видите разницу с '| {COND # (WHEN l_bool IS INITIAL THEN 'AAA' ELSE 'BBBB')} |'? : D – Jagger

+0

С моей точки зрения: когда вы используете эти кавычки - \ 'AAA \' - тип идентифицируется, это STRING, а строки не имеют фиксированной длины. Когда вы используете «AAA» - это могут быть C (3) или STRING, и по какой-то причине SAP решает, что это C (3) –