В графическом пользовательском интерфейсе SAP можно смешивать экраны технологии dynpro и элементов управления графическим интерфейсом SAP Control Framework следующими способами:
- экран и стыковочные контейнеры ; эти контейнеры могут отображаться на любой из 4 сторон экрана
- В этих контейнерах могут быть размещены элементы управления графическим интерфейсом (включая контейнеры-разделители)
- Экран, содержащий так называемую Пользовательский контейнер область, в которой можно разместить элементы управления графическим интерфейсом (включая контейнеры сплиттера)
- Всплывающие окна могут отображаться на любом экране dynpro или в графическом интерфейсе пользователя; эти всплывающие окна могут также содержать любой (другой) экран dynpro или элемент управления GUI; они полностью независимы от экрана ниже. Всплывающие окна могут также отображаться поверх всплывающих окон.
Невозможно каким-либо образом встроить экран dynpro в элемент управления GUI (включая контейнеры).
Таким образом, в вашем случае единственным решением является использование стыковочного контейнера слева от экрана dynpro. Но только программе, которая отображает экран dynpro, разрешено «добавлять» док-контейнер (т. Е. CALL TRANSACTION
или SUBMIT
нельзя использовать).
Следовательно, ZPRG2
должен обрабатывать как ваш графический элемент управления, так и экран dynpro. У вас есть два варианта работы с экраном dynpro:
- Либо
ZPRG2
обрабатывает это (все делает ZPRG2, вам не нужен ZPRG1)
- Или вы только определяете область подэкрана внутри экрана dynpro
ZPRG2
, и вы включаете подэкран из ZPRG1
, который обрабатывает все инициализации и взаимодействия подэкрана.
Второе решение рекомендуется, поскольку оно разрешает Разделение проблем ".
Приведенный ниже код является минимальным примером, демонстрирующим, как он может работать, что позволит вам лучше отлаживать и понимать; Есть так много вещей, чтобы объяснить, что я предпочитаю, чтобы вы задавали вопросы в комментариях (или новые вопросы); Имейте в виду, что многие из приведенных ниже алгоритмов, операторов и приемов не рекомендуются, я использую их только потому, что они намного короче В итоге вы получите гораздо более сложную программу, чем эта.
- Программа ZPRG1 (правая сторона, показать / скрыть элементы пользовательского интерфейса, чтобы реагировать на двойной щелчок на левой стороне):
REPORT zprg1.
DATA display TYPE abap_bool VALUE abap_false.
SELECTION-SCREEN BEGIN OF SCREEN 0100 AS SUBSCREEN.
PARAMETERS test AS CHECKBOX.
SELECTION-SCREEN END OF SCREEN 0100.
AT SELECTION-SCREEN OUTPUT.
IF display = abap_false.
LOOP AT SCREEN.
screen-active = '0'.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
FORM toggle_display.
IF display = abap_false.
display = abap_true.
ELSE.
display = abap_false.
ENDIF.
ENDFORM.
- Программа ZPRG2 (дерево с левой стороны + обработка области подэкрана справа, чтобы включить экран ZPRG1):
REPORT zprg2.
DATA okcode TYPE syucomm. " global variable for dynpro 0200 "OKCODE" element
CLASS lcl_app DEFINITION.
PUBLIC SECTION.
METHODS:
pbo,
pai,
on_node_double_click FOR EVENT node_double_click OF cl_gui_simple_tree.
DATA:
tree TYPE REF TO cl_gui_simple_tree,
itab TYPE TABLE OF mtreesnode,
docking TYPE REF TO cl_gui_docking_container.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
METHOD pbo.
SET PF-STATUS space. " <=== trick to activate buttons in the system toolbar
CHECK tree IS NOT BOUND.
CREATE OBJECT docking
EXPORTING
repid = sy-repid
dynnr = sy-dynnr
side = docking->dock_at_left
extension = 400 " pixels
EXCEPTIONS
OTHERS = 6.
itab = VALUE #(
( node_key = '1'
text = 'Double-click me' ) ).
CREATE OBJECT tree
EXPORTING
parent = docking
node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single.
tree->add_nodes(
table_structure_name = 'MTREESNODE'
node_table = itab ).
SET HANDLER on_node_double_click FOR tree.
DATA events TYPE cntl_simple_events.
CALL METHOD tree->set_registered_events
EXPORTING
events = VALUE #( ( eventid = tree->eventid_node_double_click
appl_event = 'X' ) ) " <=== to trigger the PAI
EXCEPTIONS
OTHERS = 4.
ENDMETHOD.
METHOD on_node_double_click.
PERFORM toggle_display IN PROGRAM zprg1.
ENDMETHOD.
METHOD pai.
CASE okcode.
WHEN 'BACK' OR 'RW' OR '%EX'. " one of the exit buttons in system toolbar
docking->free( ). " free container and inner controls
SET SCREEN 0. " to return after the current CALL SCREEN
ENDCASE.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: app TYPE REF TO lcl_app.
CREATE OBJECT app.
CALL SCREEN 200.
MODULE status_0200 OUTPUT.
app->pbo( ).
ENDMODULE.
MODULE user_command_0200 INPUT.
app->pai( ).
ENDMODULE.
- Dynpro 0200 программы ZPRG2 :
- Макет содержит огромную область подэкрана с именем
SUBAREA
, а элементу OKCODE должно быть присвоено имя OKCODE
(которое отображается к глобальной переменной ZPRG2 с тем же именем)
- Логика потока содержит этот код:
PROCESS BEFORE OUTPUT.
MODULE status_0200.
CALL SUBSCREEN subarea INCLUDING 'ZPRG1' '0100'.
PROCESS AFTER INPUT.
CALL SUBSCREEN subarea.
MODULE user_command_0200.