Шаблоны строк (Embedded Expressions)

Начиная с версии 7.0, EhP2 в язык ABAP вместе с большими изменениями в выражениях, внедрены так называемые строковые шаблоны. С помощью шаблонов можно сильно сократить объем кода программы, полностью избавившись от оператора WRITE TO и CONCATENATE.

Использование шаблонов возможно только в Unicode программах.
Далее будут рассмотрены некоторые особенности работы с шаблонами.

Шаблоны могут содержать в себе как простую текстовую последовательность, так и встроенные выражения, и управляющие символы (\n\r\t). Специальные символы экранируются символом "\"

Пример:

  1. s2 = |Linebreak:\n. Tab: \t. Reserved: \\, \{, \}.|.

Результат:
S2 = `Linebreak: . Tab: . Reserved: \, {, }.`

Шаблон должен начинаться с символа «|» и так же заканчиваться им в той же строке исходного кода. Исключением из этого правила могут быть встроенные выражения, которые система позволяет переносить на новую строку.

  1. gv_str = | { go_dt->add_day( 1
  2. )->add_hours( 1
  3. )->add_minutes( 1
  4. )->date( ) } |.

Для объединения строковых шаблонов могут использоваться как оператор «&» так и «&&». Таким образом шаблон может быть длинной в несколько строк, кроме того не запрещается использовать комментарии при переносе шаблона.

  1. gv_str = | { go_dt->add_day( 1 "добавляем день, час, минуту
  2. )->add_hours( 1
  3. )->add_minutes( 1
  4. )->date( ) } |.

Примечания:

Символ «|» является частью синтаксиса ABAP, для того чтобы использовать его в тексте необходимо воспользоваться escape символом \. Подсветка данного символа так же может быть настроена в опциях редактора.
При использовании оператора «&» в строковых шаблонах, нет ограничения на длину до 255 символов.
Гибкость использования шаблонов обеспечивает внедрение в них встроенных выражений. Выражение должно быть помещено в фигурные скобки «{}». Между скобками справа и слева должен быть как минимум один пробел. В качестве выражения могут выступать:

  • Встроенные функции (возвращающие результат - substring и т.п.)
  • Рассчитываемые выражения (арифметические операции, битовые выражения, символьные выражения)
  • Функциональные методы (методы классов) или цепочка вызовов методов, возвращающая результат
  • Значения переменных (sy-datum и т.п.)

Результат работы выражения должен быть в виде, который преобразуем в строковую последовательность.
Пример:
s1 = |A VALUE:{SQRT(9)/2}. Another VALUE:{ lcl=>mi(2)}.|.

Результат:
S1 =`A value: 1.5. Another value: 20.`

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

Следующий пример демонстрирует использование опций форматирования выражения, для вывода даты в ISO формате:

gv_str = | { sy-datum DATE=ISO} |.

Анализ строкового шаблона происходит последовательно слева на право.

Примечания:

Для отображения фигурных скобок необходимо использовать escape символ «\»
Фигурные скобки не могут быть вложенными напрямую. Опции форматирования нельзя использовать для выражений следующим образом:

gv_str = | { sy-datum DATE = ISO } |.

Примеры использования строковых выражений можно найти в программе: DEMO_EXPRESSIONS. Описание встроенных параметров форматирования выражений можно найти либо в справке по F1, либо по адресу: http://help.sap.com/abapdocu_731/en/abapcompute_string_format_options.htm.

Пример того как использование строковых шаблонов помогло сократить объем кода и сделать его более понятным для восприятия.

До:

  1. DATA: tmp TYPE STRING,
  2. tmp2 TYPE STRING.
  3.  
  4. IF HIDDEN EQ 'X'.
  5. CONCATENATE tmp2 'display:none;' INTO tmp2 SEPARATED BY SPACE.
  6.  
  7. IF WIDTH IS NOT INITIAL.
  8. CONCATENATE tmp2 'width:' WIDTH ';' INTO tmp2 SEPARATED BY SPACE.
  9.  
  10. CONCATENATE tmp2 'style="' tmp2 '"' INTO tmp2 SEPARATED BY SPACE.
  11.  
  12. IF CENTER EQ 'X'.
  13. CONCATENATE tmp2 'id="center"' INTO tmp2 SEPARATED BY SPACE.
  14.  
  15. IF COLSPAN IS NOT INITIAL.
  16. CONCATENATE 'colspan="' colspan '"' INTO tmp.
  17. CONCATENATE tmp2 tmp INTO tmp2 SEPARATED BY SPACE.
  18.  
  19. IF CLASS IS NOT INITIAL.
  20. CONCATENATE 'class="' CLASS '"' INTO tmp.
  21. CONCATENATE tmp2 tmp INTO tmp2 SEPARATED BY SPACE.
  22.  
  23. tmp = VALUE.
  24. CONCATENATE '<TD ' tmp2 '>' INTO tmp SEPARATED BY SPACE.
  25. CONCATENATE tmp VALUE '</td>' INTO tmp.
  26. APPEND tmp TO CONTENT.

После:

  1. DATA: tmp TYPE STRING,
  2. lv_html_td = |<td STYLE="| &
  3. |{ iif( i_a = hidden i_b = 'display:none;' ) }| &
  4. |{ iif( i_a = invisible i_b = 'visibility:hidden;' ) }| &
  5. |" | &
  6. |{ iif( i_a = WIDTH i_b = ' width="' && WIDTH && '"' ) }| &
  7. |{ iif( i_a = CENTER i_b = ' id="center"' ) }| &
  8. |{ iif( i_a = colspan i_b = ' colspan="' && colspan && '"' ) }| &
  9. |{ iif( i_a = CLASS i_b = ' class="' && CLASS && '"' ) }| &
  10. |>{ VALUE }</td>|.
  11.  
  12. APPEND lv_html_td TO content.

Источник

Комментарии

По моему мнению, код "после" просто ужастно нечитабельный и неудобный. Всегда любил ABAP за то, что код написанный на нем легко читаем, а так, это какая то бяка - ява.