Меню

Интерактивность на селекционных экранах ABAP

|

В статье рассматриваются практические приёмы использования интерактивных возможностей селекционных экранов ABAP-программ. Показано, как переход от статических форм к динамическим сценариям позволяет упростить ввод данных, снизить вероятность ошибок и сделать работу с отчётами осмысленной. Автор объясняет, что интерактивность не является украшением интерфейса, а выступает инструментом управления логикой взаимодействия между программой и пользователем. Рассуждения сопровождаются примерами типичных ситуаций и рекомендациями, где динамика оправдана, а где лучше сохранить простоту. Материал рассчитан на разработчиков, руководителей групп и тех, кто ценит в ABAP не только синтаксис, но и инженерную эстетику.

Введение

Селекционный экран — весьма частый способ общения пользователя с программой на ABAP. Через него запускают отчёты, он может использоваться в функциональных группах и модульных пулах.

SAP утверждает, что его программное обеспечение может использоваться для автоматизации обработки информации всякого бизнеса, соответствующего международным стандартам. Но, к сожалению, «всякие» бизнесы могут существенно различаться. Поэтому и от отчетов часто хотят универсальности, пригодности для использования если не и не совсем «всяким» бизнесом, то все же многими разными его вариантами. А потому приходится предусматривать возможность ввода многих разных параметров и критериев, значительная часть которых не релевантна каждому конкретному случаю использования, но может быть нужна для других. Представляется, что универсальность и эффективность конфликтуют. Эффективности следует ожидать от специализированного, а не от универсального инструмента.

Кроме того, зачастую случается, что со временем при доработках такие экраны обрастают новыми параметрами и критериями, появляются дополнительные фильтры, опции, переключатели. Все они кому-то для чего-то нужны. Но не всем пользователям и не для всех задач.

Экран разбухает, как чемодан в командировке, вроде бы всё нужное влезло, но открыть страшно.

Дело в том, что большинство селекционных экранов создаются как статичные формы. Все поля видны сразу, независимо от ситуации. Проверки выполняются после нажатия кнопки «Выполнить» (Execute), то есть уже после того, как пользователь ошибся. Программа выполняет задачу, но не очень сильно помогает вводить данные правильно (даже если используются стандартные механизмы выбора допустимых значений).

Разработчик тратит время на поддержку и дополнительные проверки. Пользователь — на уточнение, почему отчёт не запустился. Руководитель — на объяснения, почему процесс занимает больше времени, чем планировалось. А между тем в самом языке ABAP давно есть механизмы, которые позволяют сделать селекционный экран контекстно-зависимым. Он может реагировать на ввод, блокировать или скрывать лишние поля и проверять зависимые значения до выполнения отчёта.

Цель этой статьи — показать, как интерактивность помогает программе быть не только правильной, но и понятной пользователю. На практике такие решения делают работу надёжнее.

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

1. Назначение и устройство селекционных экранов

1.1 Селекционный экран как часть программы

Селекционный экран в ABAP-программах это стандартное место, где пользователь задаёт исходные условия. Обычно его воспринимают как порог перед выполнением. Вполне привычно сначала заполнить поля, а затем нажать кнопку «Выполнить» (Execute). Такой сценарий прост, но использует экран только как форму ввода — ничего больше.

Но в самом ABAP предусмотрен набор механизмов, позволяющих реагировать на действия пользователя до выполнения основной части отчёта, то есть до запуска блока обработки события START-OF-SELECTION и тем более до обхода логической базы данных, если она есть. Если эти механизмы задействовать, экран перестаёт быть просто точкой входа, а начинает реагировать на действия пользователя: проверяет правильность ввода, показывает только то, что нужно в данной ситуации. И тогда даже похоже, что он «понимает» пользователя чуть раньше, чем тот успевает ошибиться.

Такой подход уменьшает число ошибок и делает код читаемым для тех, кто придёт позже: проверка выполняется там, где появляются данные, а не там, где программа уже начала расчёт.

1.2 Перегруженность как следствие статичности

Заказчику нужен еще один режим, еще одна фильтрация. Разработчик добавляет новые параметры или критерии, и экран растёт. Когда на экране слишком много полей, пользователь тратит время на поиск нужного и чаще ошибается.

Причина же обычно в том, что экран построен статично: всё видно всем, независимо от режима работы. На этапе проектирования такое решение выглядит «универсальным», но на практике превращается в универсальный раздражитель.

В Табл. 1 показаны типичные признаки перегруженности и способы их устранения. Таблицу удобно читать построчно: каждая строка — конкретная ситуация и предпочтительный приём реагирования. Если в ней не оказалось вашего случая — значит, у вас ещё всё в порядке.

Табл. 1. Перегруженность селекционного экрана и пути её снижения

1.3 Селекционные экраны по степени интерактивности

В рабочих задачах удобно различать два подхода — статический и динамический. Статический экран всегда одинаков: состав и свойства полей не зависят от режима работы. Динамический экран меняется в зависимости от контекста — введённых данных или настроек программы.

2. Средства логической организации селекционного экрана

2.1 Блоки как средство смысловой группировки параметров

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

2.2 Событие AT SELECTION-SCREEN и блоки его обработки как основа интерактивного поведения

Событие AT SELECTION-SCREEN происходит каждый раз как пользователь нажимает кнопку Enter или выбирает орган управления, к которому привязан функциональный код. Для этого события можно создать блоки обработки, связанный со всем селекционным экраном в целом, с отдельным полем ввода, группой радиокнопок и блоком. (О, эта замечательная САП-овская терминология! Блок обработки события блока. Как замечательно это звучит.) Блоки обработки события AT SELECTION-SCREEN исполняются сверху вниз, а в пределах строки слева направо, но «отнутри» «кнаружи», то есть сначала выполняются блоки обработки, связанные с отдельными полями, потом с самыми глубоко вложенными блоками, потом с блоками, их объемлющими, и в самом конце со всем экраном. Если в блоке обработки события AT SELECTION-SCREEN программа возбудит сообщение типов E (Error) или W (Warning), то при предъявлении этого сообщения все поля ввода будут автоматически закрыты от ввода, кроме полей блока. Заметим, что экранные блоки, не выделенные визуально рамкой для того и существуют, чтобы можно было предложить пользователю изменить данные, введенные не в одно, а сразу в несколько полей (см. Табл. 2).

Табл. 2. Примеры использования AT SELECTION-SCREEN на практике

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

2.3 События AT SELECTION-SCREEN ON HELP-REQUEST и AT SELECTION-SCREEN ON VALUE-REQUEST

Запрос помощи — событие AT SELECTION-SCREEN ON HELP-REQUEST возникает, когда пользователь нажимает кнопку F1 на экранном элементе. Заголовок блока обработки этого события содержит имя элемента, на котором пользователь осуществил это нажатие. В блоках обработки этого события можно запрограммировать вывод справки специфичной именно для данного конкретного случая, а не той, что определена стандартными механизмами словаря данных.

Событие AT SELECTION-SCREEN ON VALUE-REQUEST возникает при нажатии пользователем кнопки F4 на экранном элементе. Заголовок блока обработки и этого события также содержит имя элемента, на котором пользователь осуществил это нажатие. Здесь можно запрограммировать предъявление специфичной для данного случая справки по допустимым значениям и заменить своей обработкой стандартные «словарские» механизмы. Существуют специальные функциональные модули, позволяющие предъявлять допустимые значения из динамически вычисленных наборов.

3. Интерактивные элементы и реакции пользователя

3.1 Мгновенная реакция для флажков, переключателей и кнопок

Иногда экрану стоит позволить реагировать без подтверждения действия нажатием кнопки «Выполнить» (Execute) или клавиши Enter. Это может помочь избавиться от лишних этапов ввода. Меньше движений, меньше сообщений о том, что «поле обязательное». И самое приятное — меньше писем в поддержку с тем самым вопросом: «почему опять ругается?».

Если пользователь выбрал орган управления, к которому привязан функциональный код, то этот функциональный код автоматически заносится в системную переменную SY-UCOMM и система переходит к обработке события AT SELECTION-SCREEN (см. предыдущий раздел). Привязать функциональный код к экранному элементу можно опцией USER COMMAND. Для групп зависимых переключателей (radio button group) и флажков (checkbox) эта опция факультативна, а для кнопок (pushbutton) и вкладок (tab) — облигатна.

Итак, пользователь выбрал орган управления с функциональным кодом. Функциональный код попадает в системную переменную SY-UCOMM и управление передается программе. Если этот функциональный код связан с группой зависимых переключателей или флажком, то зачастую надо просто перерисовать экран с учетом измененного значения (о том, как это делается, ниже), а сам функциональный код часто вовсе не нужен, а если он нужен или если была нажата кнопка, то в рамках блока обработки события AT SELECTION-SCREEN пишем селектор по значениям функциональных кодов и для каждого из них программируем нужную функциональность.

3.2 Дополнительные селекционные экраны и картотечные блоки

Даже самый аккуратный экран может разрастись до абсурда. Решение — вынести редко используемые поля на дополнительные экраны или в картотечные блоки (tabbed blocks). Основной экран остаётся коротким, а всё второстепенное перемещается в дополнительные вкладки.

Дополнительные селекционные экраны можно вызвать командой CALL SELECTION-SCREEN, например, в вышеупомянутом селекторе по системной переменной SY-UCOMM. Разумеется, этот дополнительный селекционный экран должен сначала быть определен, со всеми своими параметрами, критериями, строками, блоками.

Чтобы создать картотечный блок, нужно сначала определить селекционные экраны типа подэкран (опция AS SUBSCREEN команды SELECTION_SCREEB BEGIN OF SCREEN), из которых и будут формироваться карточки (закладки). После чего можно из этих селекционных поэкранов сформировать картотечный блок (блок закладок).

4. Динамические изменения структуры селекционного экрана

4.1 Использование события AT SELECTION-SCREEN OUTPUT

Событие AT SELECTION-SCREEN OUTPUT — главный инструмент динамики. Оно позволяет изменять селекционный экран «на лету», ещё до того, как пользователь нажмёт кнопку «Выполнить» (Execute). Можно скрывать поля или целые блоки совсем их содержимым, блокировать ввод значений в поля или запретить предъявление значений введённых данных, как это делается для паролей.

Событие AT SELECTION-SCREEN OUTPUT возникает всякий раз непосредственно перед тем, как селекционный экран должен быть предъявлен на рабочем месте пользователя.

Программируется это аналогично тому, как в модулях экранной обработки партиции PROCESS BEFORE OUTPUT диалоговых экранов. В рамках PBO-логики как диалоговых, так и селекционных экранов, можно организовать цикл обхода элементов экрана посредством конструкции LOOP AT SCREEN…ENDLOOP. А в этом цикле менять свойства экранных элементов, например в зависимости от значений флажков и групп переключателей, которые пользователь уже ввел на экране.

4.2 Использование объектов ENJOY SAP для интерактивных элементов

Элементы ENJOY SAP — это гриды, деревья и другие управляющие объекты, которые можно встраивать в селекционный экран. С ними появляется возможность работать с данными до запуска отчёта. Например, пользователь может сначала отобрать строки в таблице, а потом передать их в основной блок обработки.

Органы ENJOY SAP размещаются на экранах лишь внутри экранных контейнеров. Поэтому прежде всего нужно на селекционном экране разместить контейнер. Для этого в блоке обработки события AT SELECTION-SCREEN OUTPUT следует сначала создать объект класса CL_GUI_DOCKING_CONTAINER, после чего при создании органа ENJOY SAP указать ссылку на этот контейнер.

Вот, например, grid на селекционном экране (Лист. 1, результат — Рис. 1):

data
: go_cont type ref to cl_gui_docking_container
, go_grid type ref to cl_gui_alv_grid
, gt type standard table of tactt
.
parameters p_dummy.
initialization.
select * from tactt into table gt where spras = sy-langu.
at selection-screen output.
if go_grid is not bound.
go_cont = new #(
repid = sy-cprog
dynnr = sy-dynnr
ratio = 85
side = cl_gui_docking_container=>dock_at_bottom
).
go_grid = new cl_gui_alv_grid( go_cont ).
go_grid->set_table_for_first_display(
exporting i_structure_name = 'TACTT'
changing it_outtab = gt
).
endif.

Лист. 1. Грид в докинг-контейнере на селекционном экране

Рис. 1. Грид в докинг-контейнере на селекционном экране

А вот для примера предъявление сайта правительства России на селекционном в HTML-браузере экране (Лист. 2, результат — Рис. 2):

data go_cont type ref to cl_gui_docking_container.
parameters p_dummy.
at selection-screen output.
go_cont = new #(
repid = sy-cprog
dynnr = sy-dynnr
ratio = 85
side = cl_gui_docking_container=>dock_at_bottom ).
data(go_html) = new cl_gui_html_viewer( go_cont ).
go_html->SHOW_DATA( 'http://gov.ru' ).

Лист. 2. Предъявление сайта правительства России на селекционном экране

Рис. 2. Предъявление сайта правительства России в HTML-браузере на селекционном экране

Можно встроить органы ENJOY SAP не через докинг-контейнер, а с прямым присвоением полям структуры картотечного блока.

5. Когда интерактивность оправдана

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

Хороший критерий — кому и на каком этапе эта интерактивность действительно нужна. Если пользователь работает с десятком взаимосвязанных параметров, динамика оправдана: экран подсказывает, проверяет и реагирует. Если отчёт статичен и выполняется раз в неделю, лишние всплывания только замедлят работу.

Интерактивность имеет смысл там, где она уменьшает хаос, а не создаёт новый. В остальных случаях простота — лучший интерфейс. Пользователь, который видит ровно то, что ему нужно, гораздо реже задаёт вопрос: «А зачем здесь вот это поле?»

6. Заключение

Освоение интерактивности — тот самый шаг от «делаю, чтобы работало» к «проектирую, чтобы было удобно». Тот, кто использует только статические формы, ограничивает программу уровнем ввода-вывода. Разработчик, применяющий динамику, проектирует еще и логику взаимодействия с пользователем. Он управляет не просто данными, а контекстом работы пользователя.

Практическая ценность этой темы в том, что она показывает, как из тех же средств ABAP можно получить принципиально иной результат — интерфейс, который адаптируется к задаче. В итоге ввод становится короче, логика — яснее, а ошибки просто не успевают появиться. Для бизнеса это означает более надёжные и понятные инструменты, для разработчика — рост профессиональной значимости, да и просто удовольствие от отлично сделанной работы. Как заметил Пушкин, поставив последнюю точку в «Борисе Годунове»: «Ай да Пушкин, ай да сукин сын!». Программист тоже имеет право на похожее чувство.

Мастер-класс продолжает тему статьи и показывает её в практическом разрезе.

Продолжение следует.

Об авторе

Василий Ковальский — эксперт по обучению ABAP. Преподавал ABAP-курсы в московском подразделении SAP с 1998 года до закрытия московского подразделения SAP. В настоящее время сотрудничает с ExpertRP, разработал и преподает линейку авторских ABAP-курсов, проводит мастер-классы и вебинары по ABAP. Связаться с Василием можно по адресу.