【问题标题】:Display call transaction screen in a Splitter-container在拆分器容器中显示呼叫交易屏幕
【发布时间】:2019-07-07 10:37:12
【问题描述】:

我有一个程序,它显示一个包含两列的拆分容器:

  • 左侧显示一棵控制树(可以)

  • 右侧应显示自定义 TCode(不知道如何执行此位)

双击树节点时,它会调用一个打开屏幕的事务,但它会在新窗口中打开。

如何在右侧窗口中打开屏幕?

最小的可重现示例:

  • 通过SE93创建事务代码ZCALL_ZPRG1,使其调用程序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
  • 双击树节点

【问题讨论】:

  • 我已经改写了这个问题,使其符合更多的stackoverflow原则(特别是添加Minimal Reproducible Example)。请确认它是否适合您的问题,或进行编辑。谢谢。 PS:重要的是ask good questions 即符合stackoverflow原则的,我下次不做。
  • 我是博客新手,因此学习如何构建问题和答案。希望尽快上车。非常感谢 Sandra 的帮助和耐心。 !!您的代码确实有帮助并且可以正常工作,但是单击节点时,事务应该在同一窗口的右侧面板中打开,而不是在新窗口中打开。感谢您的宝贵意见/建议。

标签: abap docking splitter


【解决方案1】:

在 SAP GUI 中,可以通过以下方式混合dynpro 技术和GUI controls 的屏幕SAP Control Framework

  • 屏幕和Docking Containers;这些容器可以显示在屏幕的 4 个侧面中的任何一个
    • 在这些容器中可以放置 GUI 控件(包括拆分器容器)
  • 包含所谓的Custom Container 区域的屏幕,其中可以放置 GUI 控件(包括拆分器容器)
  • 可以在任何 dynpro 屏幕或 GUI 控件上显示弹出窗口;这些弹出窗口还可能包含任何(其他)dynpro 屏幕或 GUI 控件;它们完全独立于下面的屏幕。弹出窗口也可以显示在弹出窗口之上。

不能以任何方式将 dynpro 屏幕嵌入到 GUI 控件(包括容器)中。

因此,就您而言,唯一的解决方案是使用 dynpro 屏幕左侧的 停靠容器。但只有显示 dynpro 屏幕的程序才允许“添加”停靠容器(即不能使用CALL TRANSACTIONSUBMIT)。

因此,ZPRG2 必须同时处理您的 GUI 控件和 dynpro 屏幕。处理 dynpro 屏幕有两种选择:

  1. 要么ZPRG2处理它(一切都由ZPRG2完成,你不需要ZPRG1)
  2. 或者您只在ZPRG2 的dynpro 屏幕内定义一个subscreen area,并包含来自ZPRG1 的一个子屏幕,用于处理子屏幕的所有初始化和交互。

推荐第二种解决方案,因为它允许Separation Of Concerns"

下面的代码是一个演示它如何工作的最小示例,这将使您能够更好地调试和理解;要解释的东西太多了,我更喜欢让你在 cmets 中提问(或新问题);请注意,不建议使用下面的许多算法、语句和技巧,我使用它们只是因为它们要短得多。你最终会得到一个比这个复杂得多的程序。

  • 程序ZPRG1(右侧,显示/隐藏UI元素以响应左侧的双击):
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.
  • 程序 ZPRG2 的 Dynpro 0200
    • 布局包含一个巨大的子屏幕区域,名为SUBAREAOKCODE元素将被命名为OKCODE(映射到 ZPRG2 的同名全局变量)
    • 流程逻辑包含以下代码:
PROCESS BEFORE OUTPUT.
  MODULE status_0200.
  CALL SUBSCREEN subarea INCLUDING 'ZPRG1' '0100'.

PROCESS AFTER INPUT.
  CALL SUBSCREEN subarea.
  MODULE user_command_0200.

【讨论】:

  • 非常有用的最小示例,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多