Диалоговое программирование Ч.4. Работа с экранами


Мы обсудим различные операторы, которые можно использовать в логике потока экрана для вызова диалоговых модулей, как поддерживать и вызывать состояние графического интерфейса для экрана и как устанавливать заголовок для экрана. Мы также рассмотрим, как можно динамически изменять поля экрана и как можно установить справку по полям и справку по вводу для полей экрана. Одна диалоговая программа может иметь несколько экранов, которые можно вызывать последовательно. 

Логика потока экрана

Давайте посмотрим на операторы, которые можно использовать в логике потока экрана, и на то, как вызывать диалоговые модули. Логика потока экрана позволяет использовать ограниченный набор операторов ABAP, который разделен на разные разделы экранных событий. Экранные события, поддерживаемые в логике потока, следующие:
PROCESS BEFORE OUTPUT
PROCESS AFTER INPUT
PROCESS ON HELP-REQUEST
PROCESS ON VALUE-REQUEST
Логика потока экрана должна содержать как минимум события PROCESS BEFORE OUTPUT и PROCESS AFTER INPUT; события PROCESS ON HELP-REQUEST и PROCESS ON VALUEREQUEST являются необязательными. Вам нужно только поддерживать события POH и POV, если вы хотите обрабатывать справку (F1) и справку (F4) для полей экрана.

Внутри каждого блока событий вы можете вызывать диалоговые модули. Некоторые из операторов, которые вы можете использовать в блоке событий логики потока, включают следующее:

MODULE
Этот оператор вызывает диалоговый модуль, поддерживаемый в основной программе. Этот оператор может использоваться во всех экранных событиях.

FIELD
Этот оператор управляет переносом данных из поля экрана в программу ABAP. Если этот оператор не используется, данные поля автоматически передаются в программу в начале события PAI. При использовании оператора FIELD соответствующее значение поля экрана передается, когда система выполняет этот оператор. Оператор FIELD используется вместе с оператором MODULE для ограничения передачи данных до тех пор, пока не будет выполнен конкретный модуль.
PROCESS AFTER INPUT.
MODULE user_command.
FIELD v_matnr MODULE get_data.
Например, поля экрана v_matnr не передаются до тех пор, пока система не выполнит оператор FIELD v_matnr MODULE get_data. Это эффективно ограничивает передачу данных поля экрана всем модулям, которые вызываются перед оператором FIELD. В нашем примере данные поля v_matnr не будут доступны в модуле user_command, который вызывается перед модулем get_data. Оператор FIELD также используется для проверки полей ввода.

Когда сообщение об ошибке отображается в модуле, который вызывается с помощью оператора FIELD, соответствующее поле будет разрешено для ввода, чтобы пользователь мог исправить ввод; в противном случае сообщение об ошибке отключает все поля ввода на экране, и пользователь не сможет исправить неправильный ввод. Всегда обрабатывайте сообщение об ошибке внутри модуля, вызываемого оператором FIELD.
PROCESS AFTER INPUT.
MODULE user_command.
FIELD v_matnr MODULE get_data ON INPUT.
FIELD v_spras MODULE check_spras ON REQUEST.
Оператор FIELD поддерживает ON INPUT и ON REQUEST (например, FIELD v_matnr MODULE get_data ON INPUT). ON INPUT ограничивает вызов модуля, если соответствующее поле пусто, тогда как ON REQUEST ограничивает вызов модуля, если значение в соответствующем поле не изменилось по сравнению с последним событием PBO. Если ни одно из этих дополнений не используется, модуль всегда вызывается в каждом событии PAI. Эти дополнения полезны, когда вы выполняете шаги внутри модуля, которые не нужно повторять, если значение поля пусто или значение поля не изменилось (например, при запросе таблицы базы данных для проверки ввода).
ON INPUT и ON REQUEST можно использовать только в событиях PAI.

CHAIN
Цель оператора CHAIN аналогична оператору FIELD, за исключением того, что оператор FIELD используется для одного поля, а оператор CHAIN — для нескольких полей. Например, если вы хотите ограничить передачу данных нескольких связанных полей. Оператор CHAIN завершается оператором ENDCHAIN.
PROCESS AFTER INPUT.
MODULE user_command.
CHAIN.
  FIELD v_matnr.
  FIELD v_spras.
  MODULE get_data.
ENDCHAIN.
Соответствующими опциями ON INPUT и ON REQUEST для оператора CHAIN являются ON CHAIN-INPUT и ON CHAIN-REQUEST (например, MODULE get_data ON CHAIN-INPUT). Дополнения ON CHAIN-INPUT и ON CHAIN-REQUEST можно использовать только в событиях PAI.

CALL
Этот оператор используется в логике потока для вызова подэкрана. Этот оператор нельзя использовать с операторами LOOP...ENDLOOP или CHAIN...ENDCHAIN.

LOOP
Этот оператор используется для зацикливания управления таблицей. Например, оператор LOOP WITH CONTROL используется для циклического управления таблицей. Пример.

Статус графического интерфейса

Каждый экран может загружать свой собственный статус GUI. Статус GUI устанавливается в модуле PBO экрана с помощью оператора SET PF-STAUS. Статус GUI определяется с помощью Menu Painter.

Тип состояния: 
Статус Диалога - Для стандартного экрана.
Диалоговое окно - Для модального.  диалогового экрана.
Контекстное меню - Если вы создаете контекстное меню (отображаемое при щелчке правой кнопкой мыши).



На экране «Введение статуса» вы можете определить состояние строки меню, панели инструментов приложения, стандартной панели инструментов и функциональных клавиш. Разверните каждый статус, чтобы сохранить код функции. Вы можете определить новые объекты для строки меню и панели инструментов приложения, но для стандартной панели инструментов вы можете только включать или отключать стандартные кнопки, сохраняя код функции для каждой кнопки.

Чтобы создать кнопку панели инструментов приложения, разверните "Строка кнопок" Укажите код функции в доступных позициях элементов и нажмите (Ввод).

В появившемся всплывающем окне «Введите функциональный текст» выберите «Статический текст» или «Динамический текст» и нажмите «Продолжить». Если вы выберете Динамический текст, система предложит вам указать объект данных или поле словаря, которое будет содержать текст. Если вы выберете Статический текст, появится окно, в котором вы можете сохранить детали вручную. Нажмите «Продолжить», чтобы установить функциональную клавишу для статуса.

Как только все статусы графического интерфейса определены, активируйте их.
Чтобы загрузить статус GUI для экрана, используйте оператор SET PF-STATUS <'status_name'> в модуле PBO экрана, как показано:
MODULE status_100 OUTPUT.
SET PF-STATUS 'GUI_100'.
ENDMODULE.
Если вы хотите динамически скрыть кнопку состояния на экране, вы можете использовать дополнение EXCLUDING с оператором SET PF-STATUS:
SET PF-STATUS 'GUI_100' EXCLUDING fcode.
Здесь fcode — это код функции, который следует исключить из экрана. Вы также можете предоставить внутреннюю таблицу с одним полем типа sy-ucomm. Все функциональные коды, хранящиеся в этой внутренней таблице, будут исключены из экрана.

Заголовок GUI

Вы можете установить заголовок для экрана, который будет отображаться в строке заголовка. Заголовок загружается в модуль PBO с помощью оператора SET TITLEBAR title_code.

Динамическое изменение полей экрана

Атрибуты полей экрана задаются статически во время разработки. Однако некоторые из этих атрибутов можно изменить во время выполнения. Доступ к атрибутам полей экрана можно получить с помощью предопределенной структуры SCREEN. Мы можем получить доступ к каждому элементу экрана, зациклив структуру экрана, как показано ниже:
LOOP AT SCREEN.
MODIFY SCREEN.
ENDLOOP.
Структура экрана имеет различные атрибуты, которые можно изменить во время выполнения программы ABAP. Компонент имени содержит имена полей экрана, которые можно проверить, чтобы применить изменения к определенным полям экрана. Если поля экрана назначены группе, имя группы можно получить, проверив поля group1, group2, group3 и group4. Сгруппировав поля экрана, мы можем последовательно применить изменения ко всем полям группы.

Например, если мы хотим динамически установить поле экрана в качестве обязательного поля, мы можем использовать структуру SCREEN, как показано ниже. Атрибуты поля экрана должны быть изменены в модуле PBO непосредственно перед отображением экрана.

MODULE modify_fields OUTPUT.
  LOOP AT SCREEN.
    IF screen-name = 'V_MATNR'.
      screen-required = abap_true.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDMODULE.
Компоненты структуры экрана
Имя поля Возможные значения Описание
NAME Имя элемента экрана Название поля экрана
GROUP1 до GROUP4 id1 to id4 Группа модификаций для применения общих настроек к связанным полям, принадлежащим к одной группе
REQUIRED 0,1,2 Обязательное или рекомендуемое поле
INPUT 0,1 Ввод
OUTPUT 0,1 Вывод
INTENSIFIED 0,1 Выделенное поле
INVISIBLE 0,1 Скрыть
LENGTH Видимая длина поля Длина поля
ACTIVE 0,1 Активное поле
DISPLAY_3D 0,1 Рамка поля
VALUE_HELP 0,1,2 Кнопка справки по вводу
REQUEST 0,1 Поле было изменено
VALUES_IN_COMBO 0,1 Выпадающий список

Положение курсора может быть установлено статически в атрибутах экрана. Чтобы динамически установить положение курсора, вы можете использовать оператор SET CURSOR, как показано ниже: 
SET CURSOR FIELD field_name.
Здесь field_name — это имя поля экрана. Оператор SET HOLD DATA ON|OFF может использоваться для динамической установки флага Hold Data для экрана. 

Справка по полям и справка по вводу

Справку по полю (F1) и справку по вводу (F4) для поля экрана можно отобразить напрямую, если они поддерживаются для поля таблицы ABAP-словаря данных, а поле экрана вставляется путем выбора из поля таблицы ABAP-словаря данных (например, документация по элементам данных для справки (F1) или справка по поиску для справки (F4)). Однако вы также можете справиться с этим в программе, поддерживая событие POH для справки по полю и событие POV для справки по вводу.

Справка по полям


Чтобы обрабатывать справку по полю, событие PROCESS ON HELP-REQUEST должно поддерживаться в логике потока экрана. В этом событии можно вызвать модуль для поля с помощью оператора FIELD имя_поля MODULE имя_модуля. Здесь имя_поля — это имя поля, для которого должна быть вызвана справка по полю, а имя_мода — модуль диалога, вызываемый в программе, например:
PROCESS ON HELP-REQUEST.
FIELD MATNR MODULE F1_MATNR.
Внутри модуля, вызываемого для справки по полю, вы можете вызывать функциональные модули HELP_OBJECT_SHOW_FOR_FIELD или HELP_OBJECT_SHOW для загрузки справки по полю. Функциональный модуль HELP_OBJECT_SHOW_FOR_FIELD отображает документацию по элементам данных, поддерживаемую для любой таблицы или компонента структуры ABAP-словаря данных. Используя функциональный модуль HELP_OBJECT_SHOW, вы можете просмотреть документ SAP.


Справка по вводу

Для обработки справки по вводу в программе необходимо использовать событие PROCESS ON VALUE-REQUEST и вызывать модуль диалога с помощью оператора FIELD аналогично событию POH, например:
PROCESS ON VALUE-REQUEST.
FIELD MATNR MODULE F4_MATNR.
В модуле, вызываемом для поля, вы можете вызвать функциональный модуль F4IF_FIELD_VALUE_REQUEST или F4IF_INT_TABLE_VALUE_REQUEST для передачи списка значений.

Последовательность экрана

Диалоговые транзакции часто включают последовательный вызов нескольких экранов. Когда транзакция вызывается, она вызывает начальный экран программы. Атрибут следующего экрана экрана может быть установлен статически для вызова следующего экрана после обработки текущего экрана (т. е. после PAI текущего экрана). Часто вызов следующего экрана в последовательности экранов зависит от действий пользователя на текущем экране.

Последовательность экранов может динамически обрабатываться с помощью таких операторов, как SET SCREEN, CALL SCREEN и LEAVE SCREEN.

SET SCREEN

Оператор SET SCREEN переопределяет атрибут следующего экрана, установленный для экрана во время разработки. Когда вы вызываете следующий экран в последовательности экранов с помощью оператора SET SCREEN, он вызывает следующий экран после выполнения всех модулей в PAI текущего экрана.

CALL SCREEN

Оператор CALL SCREEN складывает текущий экран в стек и немедленно вызывает новый экран без выполнения дополнительного кода на текущем экране. Когда экранная последовательность заканчивается, управление возвращается к оператору сразу после оператора CALL SCREEN. Например, на экране 100, если вы используете оператор CALL SCREEN 110, он немедленно вызовет экран 110. Если следующий экран для экрана 110 установлен как экран 120, то после PAI экрана 110 будет вызван PBO экрана 120.

Если оператор LEAVE TO SCREEN 0 используется на экране 120, то система завершит последовательность экранов, вернется к экрану 100 и выполнит оператор сразу после оператора CALL SCREEN, который запустил последовательность экранов. Оператор CALL SCREEN прерывает текущую последовательность экранов и запускает новую последовательность экранов. Максимальное количество экранов, которые можно сложить, равно пятидесяти, но не рекомендуется размещать более сорока экранов в последовательности, поскольку система использует внутренние дополнительные последовательности экранов, например, для отображения сообщений.

LEAVE SCREEN

Оператор LEAVE SCREEN немедленно покидает текущий экран и запускает следующий экран. Следующий экран может быть статическим следующим экраном, установленным в атрибутах экрана, или динамическим следующим экраном, установленным с помощью оператора SET SCREEN. Оператор LEAVE TO SCREEN dynnr покидает текущий экран и переходит к экрану, указанному dynnr. С оператором LEAVE SCREEN экраны не складываются, потому что этот оператор не запускает новую последовательность экранов; вместо этого он немедленно вызывает следующий экран в текущей последовательности. Последовательность экранов заканчивается, когда вы переходите к экрану 0.

Модальное диалоговое окно (всплывающий экран) вызывается с использованием синтаксиса CALL SCREEN STARTING AT XX YY END AT XX YY. Здесь XX и YY — двузначные числа, определяющие координаты, используемые для позиции на экране.

Транзакция 

Типы кодов транзакций:

Транзакционный диалога
В диалоговой транзакции ход программы определяется последовательностью экранов. Все экраны, которые вы вызываете в транзакции, являются частью общего пула модулей (программа с типом 'M').
При определении кода транзакции необходимо указать начальный экран транзакции.

Транзакционный отчет
В транзакции отчета вы запускаете программу с типом 1, используя код транзакции. Обычно отчет вначале получает данные (с помощью экрана выбора), обрабатывает их (например, с помощью логической базы данных), а затем выводит данные (список).
При определении кода транзакции можно указать экран выбора и вариант отчета.

ОО-транзакция
Запускает метод класса, используя код транзакции.

Транзакция варианта
Можно определить варианты транзакций. Они позволяют предварительно назначать значения полям внутри транзакции, определять атрибуты полей или скрывать целые экраны.

Чтобы выполнить вариант транзакции, вы определяете вариантную транзакцию. На следующем экране введите название транзакции и название варианта.

Примечание
Вариантные транзакции зависят от клиента.
Если вы пытаетесь запустить вариантную транзакцию, а соответствующий вариант не существует, транзакция выполняется без варианта.

Транзакция параметров
Транзакции с параметрами позволяют предварительно назначать значения полям на начальном экране.

Если вы предоставите все необходимые записи для начального экрана таким образом, вы сможете скрыть экран при выполнении транзакции.

Комментарии