Достаточно удобная вещь, когда на селекционном экране множество критериев выбора и часть из них используется очень редко. В таком случае подобные поля можно скрыть. Есть два решения этой задачи и они схожи. Первый способ - это "в лоб". Не особо удобный способ для небольших или простых отчетов. В этом случае рисуется полностью пользовательский экран, кладется на него кнопка и по ее нажатию происходит отображение или скрытие определенных полей.
Второй способ - это немного кода для стандартного селекционного экрана. На мой взгляд, этот способ намного приятнее, чем перерисовывать экран.
Итак, немного пояснений. SELECTION-SCREEN FUNCTION KEY 2 означает, что мы добавляем функциональную кнопку. Сап по-умолчанию сделает кнопку с функциональным кодом FC02. Далее, идет объявление кучи чекбоксов. MODIF ID gr1 означает, что все чекбоксы относятся к группе GR1.
Еще одну вещь нужно сделать - объявить переменную, которая будет хранить состояние блока.
Поскольку мы хотим сохранять состояние, то делать это будем с помощью памяти. Собственно, первыми строками мы забираем значение из памяти и очищаем ее. Далее, нужно пробежаться по всем элементам экрана и проставить им соответствующий статус. В последних строках мы определяем внешний вид кнопки, а именно "Свернуть" или "Развернуть" и ставим соответствующую иконку.
Немного дополнений по типам данных переменных:
Здесь все тот же код, что и при инициализации с той лишь разницей, что выполняется он на нажатие нашей кнопки. В конце значение переменной состояния блока мы экспортируем в память.
Вот и все, готово!
Второй способ - это немного кода для стандартного селекционного экрана. На мой взгляд, этот способ намного приятнее, чем перерисовывать экран.
Задача
- Создать блок полей, которые будут скрываться/отображаться
- Кнопка в строке кнопок, по нажатию на которую будут скрываться/отображаться поля
- При возврате на селекционный экран отображать последнее состояние блока
Step-by-step
Шаг 1. Добавляем блок полей и функциональную кнопку на селекционный экран
SELECTION-SCREEN FUNCTION KEY 2. SELECTION-SCREEN BEGIN OF BLOCK a05 WITH FRAME TITLE text-a05. PARAMETERS: p_glodat AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_drmet AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_texts AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_ltexts AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_rbp AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_okato AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_tax AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_presen AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_lifeti AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_waers AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_zarcod AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_nzs AS CHECKBOX DEFAULT '' MODIF ID gr1 , p_nzs2 AS CHECKBOX DEFAULT '' MODIF ID gr1 . SELECTION-SCREEN END OF BLOCK a05.
Итак, немного пояснений. SELECTION-SCREEN FUNCTION KEY 2 означает, что мы добавляем функциональную кнопку. Сап по-умолчанию сделает кнопку с функциональным кодом FC02. Далее, идет объявление кучи чекбоксов. MODIF ID gr1 означает, что все чекбоксы относятся к группе GR1.
Еще одну вещь нужно сделать - объявить переменную, которая будет хранить состояние блока.
DATA: gv_expand_status TYPE boole_d VALUE abap_false.
Шаг 2. Инициализация
В разделе инициализации нужно проставить начальные значения для нашего блока полей.INITIALIZATION. IMPORT gv_expand_status FROM MEMORY ID 'ZUNI_OSV_OS_V2_EXPAND'. IF sy-subrc NE 0. gv_expand_status = abap_false. ENDIF. FREE MEMORY ID 'ZUNI_OSV_OS_V2_EXPAND'. LOOP AT SCREEN. IF screen-group1 EQ 'GR1'. IF gv_expand_status EQ abap_false. screen-active = '0'. ELSE. screen-active = '1'. ENDIF. MODIFY SCREEN. ENDIF. ENDLOOP. CLEAR: g_free_sel_icon. IF gv_expand_status EQ abap_true. " развернуть MOVE: text-004 TO g_free_sel_icon-text , icon_collapse TO g_free_sel_icon-icon_id . gv_expand_status = abap_true. ELSE. " свернуть MOVE: text-004 TO g_free_sel_icon-text , icon_expand TO g_free_sel_icon-icon_id . gv_expand_status = abap_false. ENDIF. sscrfields-functxt_02 = g_free_sel_icon.
Поскольку мы хотим сохранять состояние, то делать это будем с помощью памяти. Собственно, первыми строками мы забираем значение из памяти и очищаем ее. Далее, нужно пробежаться по всем элементам экрана и проставить им соответствующий статус. В последних строках мы определяем внешний вид кнопки, а именно "Свернуть" или "Развернуть" и ставим соответствующую иконку.
Немного дополнений по типам данных переменных:
DATA: g_free_sel_icon LIKE smp_dyntxt.
Шаг 3. Обработчик для кнопки
Сап присвоил функциональный код нашей кнопке FC02. Его и нужно ожидать. Это действие мы будем делать в разделе вывода экрана.AT SELECTION-SCREEN OUTPUT. CASE gv_ucomm. WHEN 'FC02'. LOOP AT SCREEN. IF screen-group1 EQ 'GR1'. IF gv_expand_status EQ abap_false. screen-active = '1'. ELSE. screen-active = '0'. ENDIF. MODIFY SCREEN. ENDIF. ENDLOOP. CLEAR: g_free_sel_icon. IF gv_expand_status EQ abap_false. " развернуть MOVE: text-004 TO g_free_sel_icon-text , icon_collapse TO g_free_sel_icon-icon_id . gv_expand_status = abap_true. ELSE. " свернуть MOVE: text-004 TO g_free_sel_icon-text , icon_expand TO g_free_sel_icon-icon_id . gv_expand_status = abap_false. ENDIF. sscrfields-functxt_02 = g_free_sel_icon. ENDCASE. EXPORT gv_expand_status TO MEMORY ID 'ZUNI_OSV_OS_V2_EXPAND'.
Здесь все тот же код, что и при инициализации с той лишь разницей, что выполняется он на нажатие нашей кнопки. В конце значение переменной состояния блока мы экспортируем в память.
Шаг 4. Команда
Поскольку сап затирает команду кнопки в момент вывода экрана, то этот момент тоже нужно учесть, иначе мы не узнаем, какая кнопка была нажата. Для этого сохраним код кнопки в переменную в момент события селекционного экрана.DATA: gv_ucomm TYPE syucomm.
AT SELECTION-SCREEN. MOVE: sscrfields-ucomm TO gv_ucomm.
Вот и все, готово!
Комментарии
Отправить комментарий