К основному контенту

Скрытие и показ дополнительных полей на 1000 экране

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

Задача

  1. Создать блок полей, которые будут скрываться/отображаться
  2. Кнопка в строке кнопок, по нажатию на которую будут скрываться/отображаться поля
  3. При возврате на селекционный экран отображать последнее состояние блока

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.

Вот и все, готово!

Комментарии

Популярные сообщения из этого блога

Прямые ссылки на файлы Google диска

В предыдущей статье я рассказал, как подключить свой JavaScript файл к блогу BLOGSPOT . Но для того, что бы их подключить нужны прямые ссылки на файл, а Google диск при предоставлении общего доступа к файлу выдает ссылку на предварительный просмотр, которая никак напрямую не ссылается на файл. Для Google диска прямая ссылка на файл - это ссылка на скачивание. Ниже описаны два способа создания ссылки на скачивание на примере файла prism.js.

События для ведения таблиц

Как и всегда, в пылу проекта внезапно родилась Z табличка. Главный нюанс был в том, что она должна была хранить пароли для авторизации на стороннем сервере. Естественно, никто не хотел хранить пароли в открытом виде, а двустороннее шифрование SAP не умеет без сторонних пакетов и надстроек. Далее, все как обычно - придумали алгоритм, сделали табличку. Дело осталось за малым - нужно шифровать пароли, которые вводит пользователь. Делать отдельную программу нет смысла, поскольку ее функционал мало чем будет отличаться от сгенерированного. Вот здесь на помощь приходят события! С их помощью можно, наверное, все. По крайней мере, я не нашел чего-либо, что нельзя сделать с данными через события.

OOP ALV GRID с HTML шапкой

В этой статье хочу постараться подробно описать и привести пример, как можно создать ALV отчет с таблицей на весь экран и с HTML шапкой вверху. Я не буду описывать начальный этап, где пишется селекционный экран или делается выборка данных. Будем считать, что основа у нас есть и нам нужно просто вывести данные. Главной изюминкой является то, что нужно вывести ALV GRID на экран без использования каких-либо дополнительных элементов на экране. Step-By-Step Шаг 1. Создание окна Создаем самое простое окно с номером 100. На него не нужно кидать никаких контейнеров. Оно нам нужно только для модулей PAI и PBO и вывода на него ALV GRID.