Иногда возникает необходимость скрыть одно или несколько полей (или любой другой элемент) на экране в зависимости от некоторых условий. Существует несколько способов это сделать, как простых и незамысловатых, так и достаточно сложных, но дающих максимальную гибкость настройки экрана. Пойдем от простого к сложному.
NO-DISPLAY для элементов экрана
Для таких элементов экрана, как PARAMETERS и SELECT-OPTIONS есть дополнение NO-DISPLAY, позволяющее скрыть поля на экране. Поле с таким дополнением будет скрыто, но к нему можно будет обратиться, например, при вызове программы с таким полем из другой программы с передачей SET-параметров. Выглядит это так:
1 2 3 |
PARAMETERS p_par TYPE CHAR10 NO-DISPLAY. SELECT-OPTIONS so_sopt FOR gv_somevar NO-DISPLAY. |
Сокрытие полей экранов инфо-типов HR
Настройка полей инфо-типа производится в таблице T588M, открыть которую можно из транзакции SM30.
Здесь первоначальным экраном служит экран, для которого поле «Переменный ключ» не заполнено. По двойному щелчку можно открыть детальный просмотр:
Как видно из рисунка, для полей экрана можно задать не только невидимость (столбцы выделены красной рамкой), но и сделать поле обязательным (Обяз), необязательным (Необ) или закрытым для редактирования (Вывд). Поле Скрт делает поле невидимым, а поле Иниц вдобавок к невидимости очищает его содержимое.
Сокрытие полей в ABAP
Скрыть поля экрана можно при помощи реализации цикла с использованием специальной структуры SCREEN (её можно найти в словаре данных SE11). Как правило, цикл по структуре включается либо в событие AT SELECTION-SCREEN OUTPUT (для селекционного экрана) либо в PBO-модуль (для селекционного и обычного экранов). Цикл по экрану выглядит как обычный цикл:
1 2 3 4 5 |
LOOP AT SCREEN. ... ENDLOOP. |
Есть одно различие: в данном цикле нельзя использовать дополнительный параметр WHERE, т.к. SCREEN в данном случае выступает в качестве рабочей области, а таблицей является сам экран. Получить доступ по ключу или по номеру строки таблицы к строкам экрана нельзя.
Для того, чтобы скрыть элемент экрана, нужно отредактировать два поля структуры SCREEN:
1 2 3 |
SCREEN-INVISIBLE ='1'. SCREEN-ACTIVE = '0'. |
После этого нужно обязательно сделать MODIFY SCREEN.
Существует несколько способов определения, какой именно объект нужно скрыть на экране.
1 способ – по имени поля
Часто используется для модификации селекционного экрана, из-за простоты обращения. Например, у нас есть параметр на селекционном экране:
1 |
PARAMETERS p_par1(10). |
Все элементы экрана, такие как, например, сгенерированная подпись, в своём имени будут содержать имя параметра P_PAR1. Соответственно, в цикле по экрану мы можем сделать проверку на присутствие названия параметра в имени элемента:
1 2 3 4 5 6 7 8 9 |
IF SCREEN-NAME CS ‘P_PAR1’. SCREEN-INVISIBLE = '1'. SCREEN-ACTIVE = '0'. MODIFY SCREEN. ENDIF. |
2 способ – по группе полей
В редакторе экрана для интересующих нас полей можно задать группы:
Этим группам в структуре SCREEN соответствуют поля GROUP1…GROUP4. Проверка групп будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 |
IF SCREEN-GROUP1 = ‘GR1’. SCREEN-INVISIBLE = '1'. SCREEN-ACTIVE = '0'. MODIFY SCREEN. ENDIF. |
Данный способ больше подходит для обычного экрана, т.к. если мы внесём свои группы в поля селекционного экрана, то, если в будущем произойдёт перегенерация экрана, все группы затрутся.
Ещё есть способ скрытия через создание системного шаблона по-моему, типа «CUS&…». Пользуюсь таким с логическими базами.
Наверное, вы имели в виду системный вариант? С вариантами, кстати, есть небольшие глюки. Иногда скрытые поля всё равно выводятся видимыми
Да, именно системный вариант. Если честно, не встречал пока что глюков.
Если речь идет о Z-абапе, то второй способ изумительно подходит и для селекционного экрана, если использовать в описании параметра дополнение MODIF ID GR1.
При таком описании в screen-group1 ляжет GR1.
И все будет в порядке. Как у меня (с)
Вот ещё в дополнение видео о селекционном экране. Возможно будет полезно:
https://www.youtube.com/watch?v=IJvA2Iemq-0&list=PLcaW8IEDpScvohdm7Cjt2kzBs_t84NGOj&index=2&t=1s