Если транзакция является отчётом, то у неё есть экран выбора.
И если параметров много, и вы часто заполняете их одинаково, то имеет смысл запомнить это в виде шаблона. Вот этот шаблон и называется вариантом.
А теперь – в подробностях…
Что это такое?
Экраном выбора (селекционным экраном) является экран, сформированный операторами PARAMETERS, SELECT-OPTIONS с вариациями. Он всегда имеет номер 1000. Такой экран может сгенерирован только автоматически и только для программы типа REPORT. Вносить вручную изменения в такой экран — запрещается.
Если соотносить с вариантами транзакций (SHD0), то тут полное разделение:
- Экран выбора не может быть включен в вариант транзакции
- В варианте экрана выбора может использоваться только экран выбора, и его невозможно создать для других экранов
Функции вариантов экрана выбора и вариантов транзакций реализованы похоже (похоже, но не то же).
Над экраном выбора всегда горит стандартная кнопка сохранения, и если её нажать, то появится экран сохранения:
Вот тут можно порасставлять галочки и сохранить под нужным именем.
В-целом очень похоже на варианты транзакций, вот только значения “по-умолчанию” напрямую не показываются и напрямую не вписываются. Не очень приятное поведение.
Если к программе создан хотя бы один вариант, то появляется кнопочка, нажав которую можно выбрать варианты из списка:
NB: Мне вообще не нравится принятое название “селекционный экран” или “селективный экран”. В английском всё просто “Selection screen”. Официально он называется всё-таки “экран выбора”, в этом можно убедиться в транзакции SE93.
Переносы
Варианты экрана выбора делятся на два вида:
- системные: начинаются на CUS&, не зависят от манданта, переносятся автоматически, автоматически защищаются
- пользовательские: начинаются на другие буквы, зависят от манданта, не переносятся автоматически
Маркер CUS& нужно вводить ручками. Что-то вроде этого можно найти и в вариантах ALV, но там используется другой маркер-префикс: это прямой слеш, да и означает этот маркер чуть другое.
Если пользовательский вариант хочется перенести, то можно воспользоваться программой RSTRANSP. Можно включить и ручками, но там нужно будет склеить правильно имя объекта.
Если говорить о систематическом подходе, то лучше всегда придерживаться стандартной логики:
- Системные варианты – всегда переносить, ландшафт должен быть ровным
- Пользовательские варианты – никогда не переносить
- В транзакциях использовать только системные варианты
А то, например, может сложиться не очень приятная ситуация, если решат перенести корректировку варианта через запрос из разработки, и окажется что на продуктивной системе в варианте были сделаны локальные корректировки.
Использование
Пока пользователь у нас может только запустить отчёт, и потом выбрать из списка нужный. Можно сократить этот шаг:
- Создать транзакцию с предустановленным вариантом
- При инициализации отчёта вызвать RS_SUPPORT_SELECTIONS (в том числе и вызывать разные варианты в зависимости от пользователя)
Защита
С защитой всё не очень приятно. По сути это завязка на имя пользователя – вот насколько всё просто. Снять защиту с пользовательского варианта легко с помощью программы RSVARENT, тут лезть в таблицы не обязательно.
А вот снять защиту с системного варианта непросто. Даже если зайти под владельцем, то снимать флаг защиты бесполезно – он при сохранении будет поставлен обратно. Получается что нельзя сменить владельца системного отчёта.
Ситуацию усложняет тот факт, что системные варианты хранятся в 000 манданте (и как следствие они являются независимыми от манданта). А лично меня не тянет идти ради этого в нулевой мандант. Поэтому даже снять флаг защиты с полпинка не получится. Ну а таблица не секретная: VARID; надо только написать вручную запрос учитывая мандант.
Снимаете защиту, и при следующем сохранении он защитится обратно, но уже на вас.
На закуску
Можно поглядеть на кучку программ RSVAR* – там есть небольшие помогалки на разные случаи.
Если что и стоит разведать дополнительно, то это механизм использования переменных.
С датой всё просто: если поле является датой, то там появляются дополнительные вкусняшки:
А вот если вам нужна какая-то условная константа с динамическим расчётом (например, код БЕ из профиля пользователя), то необходимо сделать какие-то дополнительные шаги. Вот это стоило бы копнуть дополнительно.
Может кто даст наводку?
Планирование
Есть стандартная функция платформы: можно запланировать регулярный запуск отчёта (например: ежедневно).
Если ввести параметры на экране выбора и запланировать запуск в фоновом режиме, то будет создан технический вариант вроде &0000000000012. В данном случае не играет роли, если вы перед этим вызвали какой-либо вариант для предварительного заполнения этих полей.
Поэтому если у вас есть динамические переменные выбора в варианте, то планировать следует из SM36 (где можно напрямую указать вариант), а не из SA38.
Варианты настройки зависят от прикладного компонента (в СО, к примеру, они свои) и в этих компонентах есть свои настройки «по-умолчанию». Общего для разных модулей при настройке вариантов мало, нужно конкретную ситуацию смотреть.
Само собой, обсуждение вариантов тут не затрагивает те вещи, которые пишутся напрямую в тексте ABAP-программы. И в каждой программе готовы появиться какие-то свои «феньки» в экранах выбора.
Вот например, у меня есть стандартный трюк: если данный пользователь имеет права только на одну БЕ, то эту БЕ я прописываю на экране выбора и закрываю ввод. А это делается старым добрым ABAP-ом, без всяких вариантов.
Небольшое замечание не по сути статьи. Утверждение
«Технически экраном выбора (селекционным экраном) является экран, сформированный операторами PARAMETERS, SELECT-OPTIONS. Он всегда имеет номер 1000. Такой экран может сформирован только для программы типа REPORT.» является не полностью корректным. Selection-screen может иметь и другой номер. Их может быть > 1. Никто не мешает создать его, например, в группе функций и затем вызвать через CALL SELECTION-SCREEN XXXX. А вот СТАНДАРТНЫЙ selection screen действительно имеет фиксированный номер 1000 и может быть только в программах типа REPORT.
Да, разумеется, есть такое пространство для манёвра. Просто в контексте данной статьи это не существенно.
> Никто не мешает создать его
Спорно. Я бы стал мешать разработчику так делать ;-)
Технически спорные формулировки тут ещё есть. Например:
>Если транзакция является отчётом, то у неё есть экран выбора.
Отчёт можно сделать и без экрана выбора. Но вот нормальные отчёты так никто не делает.
>> Никто не мешает создать его
>Спорно. Я бы стал мешать разработчику так делать
Я лично не вижу причин запрещать, поскольку адекватное применение этому имеется. Например, экраны выбора применяются в стандартной группе функций V56L.
Спасибо Иван за статью. Даже не представишь как ты мне помог)
Огромное спасибо за статью, Иван. Если впервые с этим сталкиваешься, как я, то информация очень полезная.
А вот если вам нужна какая-то условная константа с динамическим расчётом (например, код БЕ из профиля пользователя), то необходимо сделать какие-то дополнительные шаги. Вот это стоило бы копнуть дополнительно.
транзакция STVARV.
Но не думаю, что выйдет связать с профилем пользователя.
Выйдет конечно, но только если поле экрана выбора связано с MEMORY ID в ABAP:
PARAMETERS: p_bukrs TYPE bkpf-bukrs MEMORY ID buk.
Просто оно обладает недостатками:
а) не всегда будет работать для стандарта, где иногда может не быть связки поля с MEMORY ID
б) если пользователь в сессии заранее перебивал поле другими значениями, тогда будут подставлены последние, а не значения из профиля
Вот в дополнение видео про Селекционный экран ABAP: https://youtu.be/IJvA2Iemq-0, может кому пригодится.
Ну вообще-то можно с нормальным вариантом запланировать как из SM36, так и из SA38.
В обоих случаях будет нормальный вариант в SM37 отображаться, а не динамически сгенерированные поля.
Иван, добрый день!
Пытаюсь настроить вариант для CЭ.
Подскажите, пожалуйста, как для Select-Option установить значение в поле «ПО».
По инструкции выше получается установить значение только в поле «С».
Илья, даже не представляю в чём у вас может быть проблема.
Вполне возможно, что отчёт у вас реализован таким образом, что там встроена инициализация параметров по умолчанию или что-то в этом роде, что вставляет палки в колёса.
Спасибо, Иван, ваши статьи очень выручают.
А как можно посмотреть изменения варианта?
Мария, насколько я представляю, в обычно системе хронология таких изменений не ведётся.
Если варианты переносятся, то их можно отследить по запросам на перенос, куда они были включены.
А если не переносятся, то в таблице VARID можно посмотреть, кто и когда создал и кто и когда менял в последний раз.
Эти поля в моей системе не выводятся на экран, но их можно посмотреть в таблице. Это максимум.
Добрый день! Где можно посмотреть какими значениями ограничен вариант?
Очевидно, что значения в варианте можно посмотреть, если его выбрать.
Если в базе данных, то они лежат в таблице VARI в которой невооруженным взглядом понять ничего нельзя.
Если воспользоваться функциональным модулем RS_VARIANT_CONTENTS, то можно получить эти значения в человеческом виде.