Начиная с версии 7.0, EhP2 в язык ABAP вместе с большими изменениями в выражениях, внедрены так называемые строковые шаблоны. С помощью шаблонов можно сильно сократить объем кода программы, полностью избавившись от оператора WRITE TO и CONCATENATE.
Использование шаблонов возможно только в Unicode программах.
Далее будут рассмотрены некоторые особенности работы с шаблонами.
Шаблоны могут содержать в себе как простую текстовую последовательность, так и встроенные выражения, и управляющие символы (\n\r\t). Специальные символы экранируются символом «\»
Пример:
1 |
s2 = |Linebreak:\n. Tab: \t. Reserved: \\, \{, \}.|. |
Результат:
1 |
S2 = `Linebreak: . Tab: . Reserved: \, {, }.` |
Шаблон должен начинаться с символа «|» и так же заканчиваться им в той же строке исходного кода. Исключением из этого правила могут быть встроенные выражения, которые система позволяет переносить на новую строку.
1 2 3 4 |
gv_str = | { go_dt->add_day( 1 )->add_hours( 1 )->add_minutes( 1 )->date( ) } |. |
Для объединения строковых шаблонов могут использоваться как оператор «&» так и «&&». Таким образом шаблон может быть длинной в несколько строк, кроме того не запрещается использовать комментарии при переносе шаблона.
1 2 3 4 |
gv_str = | { go_dt->add_day( 1 "добавляем день, час, минуту )->add_hours( 1 )->add_minutes( 1 )->date( ) } |. |
Примечания:
- Символ «|» является частью синтаксиса ABAP, для того чтобы использовать его в тексте необходимо воспользоваться escape символом \. Подсветка данного символа так же может быть настроена в опциях редактора.
- При использовании оператора «&» в строковых шаблонах, нет ограничения на длину до 255 символов.
Гибкость использования шаблонов обеспечивает внедрение в них встроенных выражений. Выражение должно быть помещено в фигурные скобки «{}». Между скобками справа и слева должен быть как минимум один пробел. В качестве выражения могут выступать:
- Встроенные функции (возвращающие результат — substring и т.п.)
- Рассчитываемые выражения (арифметические операции, битовые выражения, символьные выражения)
- Функциональные методы (методы классов) или цепочка вызовов методов, возвращающая результат
- Значения переменных (sy-datum и т.п.)
Результат работы выражения должен быть в виде, который преобразуем в строковую последовательность.
Пример:
1 |
s1 = |A VALUE:{SQRT(9)/2}. Another VALUE:{ lcl=>mi(2)}.|. |
Результат:
1 |
S1 =`A value: 1.5. Another value: 20.` |
Когда происходит анализ встроенного выражения, его результат преобразуется в строку и вставляется в указанном месте, формат строки может быть либо стандартным, либо переопределен с помощью опции форматирования и ключевых слов.
Следующий пример демонстрирует использование опций форматирования выражения, для вывода даты в ISO формате:
1 |
gv_str = | { sy-datum DATE=ISO} |. |
Анализ строкового шаблона происходит последовательно слева на право.
Примечания:
- Для отображения фигурных скобок необходимо использовать escape символ «\»
- Фигурные скобки не могут быть вложенными напрямую. Опции форматирования нельзя использовать для выражений следующим образом:
1gv_str = | { sy-datum DATE = ISO } |.
Примеры использования строковых выражений можно найти в программе: DEMO_EXPRESSIONS. Описание встроенных параметров форматирования выражений можно найти либо в справке по F1, либо по адресу: http://help.sap.com/abapdocu_731/en/abapcompute_string_format_options.htm.
Пример того как использование строковых шаблонов помогло сократить объем кода и сделать его более понятным для восприятия.
До:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
DATA: tmp TYPE STRING, tmp2 TYPE STRING. IF HIDDEN EQ 'X'. CONCATENATE tmp2 'display:none;' INTO tmp2 SEPARATED BY SPACE. ENDIF. IF WIDTH IS NOT INITIAL. CONCATENATE tmp2 'width:' WIDTH ';' INTO tmp2 SEPARATED BY SPACE. ENDIF. CONCATENATE tmp2 'style="' tmp2 '"' INTO tmp2 SEPARATED BY SPACE. IF CENTER EQ 'X'. CONCATENATE tmp2 'id="center"' INTO tmp2 SEPARATED BY SPACE. ENDIF. IF COLSPAN IS NOT INITIAL. CONCATENATE 'colspan="' colspan '"' INTO tmp. CONCATENATE tmp2 tmp INTO tmp2 SEPARATED BY SPACE. ENDIF. IF CLASS IS NOT INITIAL. CONCATENATE 'class="' CLASS '"' INTO tmp. CONCATENATE tmp2 tmp INTO tmp2 SEPARATED BY SPACE. ENDIF. tmp = VALUE. CONCATENATE '<TD ' tmp2 '>' INTO tmp SEPARATED BY SPACE. CONCATENATE tmp VALUE '</td>' INTO tmp. APPEND tmp TO CONTENT. |
После:
1 2 3 4 5 6 7 8 9 10 11 12 |
DATA: tmp TYPE STRING, lv_html_td = |<td STYLE="| & |{ iif( i_a = hidden i_b = 'display:none;' ) }| & |{ iif( i_a = invisible i_b = 'visibility:hidden;' ) }| & |" | & |{ iif( i_a = WIDTH i_b = ' width="' && WIDTH && '"' ) }| & |{ iif( i_a = CENTER i_b = ' id="center"' ) }| & |{ iif( i_a = colspan i_b = ' colspan="' && colspan && '"' ) }| & |{ iif( i_a = CLASS i_b = ' class="' && CLASS && '"' ) }| & |>{ VALUE }</td>|. APPEND lv_html_td TO content. |
Интересная статья. Нужно будет поэкспериментировать
А что это за функция такая — IIF ? в документации нет…
В данном примере это метод моего класса который в случае существования первого аргумента выводит второй, при отсутствии третий.
Код был взят изнутри класса, который включает данный метод
ДД!
Не разберусь как быть с NUMC типом.
Например:
DATA : l_numc Type n Length 3 Value ‘001’,
l_str Type string.
Write l_numc To l_str . » l_str = 1
Как это будет с шаблонами?
Добрый вечер, будет так:
DATA : l_numc Type n Length 3 Value ‘001’,
l_str Type string.
l_str = |{ l_numc }|.
WRITE l_str.
ДД!
Да, по логике так и должно быть ))
Но не работает. И в своем примере у меня ошибка. Там по идеи Write l_numc To l_str NO-ZERO .
Вообщем не получается совсем забыть про WRITE.
По идее, так:
l_str = |{ shift_left( val = l_numc sub = ‘0’ }|.
Сам делал такое много раз. И обратную операцию тоже (дополнение ведущими нулями до нужной длины), но это всё в примерах разобрано.