Отобразить экран транзакции вызова в Splitter-контейнере - PullRequest
0 голосов
/ 07 июля 2019

У меня есть программа, которая отображает сплиттер-контейнер с двумя столбцами:

  • С левой стороны отображается дерево управления (это нормально)

  • Правая сторона должна отображать пользовательский TCode (не уверен, как это сделать)

При двойном щелчке узла дерева вызывается транзакция, которая открывает экран, но открывается в новом окне.

Как открыть экран в правом окне?

Минимальный воспроизводимый пример:

  • Создайте код транзакции ZCALL_ZPRG1 через SE93, чтобы он вызывал программу ZPRG1
  • Создать программу ZPRG1 (минималистский экран):
REPORT zprg1.
PARAMETERS test AS CHECKBOX.
  • Создать программу ZPRG2 (сплиттер и дерево):
    REPORT zprg2.
    CLASS lcl_app DEFINITION.
      PUBLIC SECTION.
        METHODS:
          pbo,
          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,
          splitter TYPE REF TO cl_gui_splitter_container.
    ENDCLASS.
    CLASS lcl_app IMPLEMENTATION.
      METHOD pbo.
        CHECK tree IS NOT BOUND.
        CREATE OBJECT splitter
          EXPORTING
            parent  = cl_gui_container=>screen0
            rows    = 1
            columns = 2.
        itab = VALUE #(
        ( node_key = '1'
          text     = 'Double-click me' ) ).
        CREATE OBJECT tree
          EXPORTING
            parent              = splitter->get_container( row = 1 column = 1 )
            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 ) )
          EXCEPTIONS
            OTHERS = 4.
      ENDMETHOD.
      METHOD on_node_double_click.
        CALL TRANSACTION 'ZCALL_ZPRG1'.
      ENDMETHOD.
    ENDCLASS.

    DATA: app TYPE REF TO lcl_app.

    PARAMETERS dummy.

    INITIALIZATION.
      CREATE OBJECT app.

    AT SELECTION-SCREEN OUTPUT.
      app->pbo( ).

    AT SELECTION-SCREEN ON EXIT-COMMAND.
      app->splitter->free( ).
  • Запуск ZPRG2
  • Дважды щелкните узел дерева

1 Ответ

0 голосов
/ 07 июля 2019

В графическом пользовательском интерфейсе SAP можно смешивать экраны технологии dynpro и элементов управления графическим интерфейсом SAP Control Framework следующими способами:

  • экран и стыковочные контейнеры ; эти контейнеры могут отображаться на любой из 4 сторон экрана
    • В этих контейнерах могут быть размещены элементы управления графическим интерфейсом (включая контейнеры-разделители)
  • Экран, содержащий так называемую Пользовательский контейнер область, в которой можно разместить элементы управления графическим интерфейсом (включая контейнеры сплиттера)
  • Всплывающие окна могут отображаться на любом экране dynpro или в графическом интерфейсе пользователя; эти всплывающие окна могут также содержать любой (другой) экран dynpro или элемент управления GUI; они полностью независимы от экрана ниже. Всплывающие окна могут также отображаться поверх всплывающих окон.

Невозможно каким-либо образом встроить экран dynpro в элемент управления GUI (включая контейнеры).

Таким образом, в вашем случае единственным решением является использование стыковочного контейнера слева от экрана dynpro. Но только программе, которая отображает экран dynpro, разрешено «добавлять» док-контейнер (т. Е. CALL TRANSACTION или SUBMIT нельзя использовать).

Следовательно, ZPRG2 должен обрабатывать как ваш графический элемент управления, так и экран dynpro. У вас есть два варианта работы с экраном dynpro:

  1. Либо ZPRG2 обрабатывает это (все делает ZPRG2, вам не нужен ZPRG1)
  2. Или вы только определяете область подэкрана внутри экрана 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.
...