以dynpro序列返回两个屏幕

时间:2017-11-15 13:09:08

标签: sap abap

我想开发以下逻辑:

PASS 2 SCREENS BACK

使用LEAVE TO SCREEN 0我无法直接传递给DISPLAY ALV。有可能吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

不,您不能返回到FM,因为您打算这样做,因为FM是一个特殊的可调用单位,而LEAVE TO SCREEN语句仅对屏幕<<>>有效/ strong>即可。但是,您可以返回显示ALV的屏幕100。

请考虑以下编码,您应该为其设置屏幕100和300,其中包含自定义容器100_CONT300_CONT

屏幕100 PBO

MODULE pbo_100 OUTPUT.
  SET PF-STATUS 'YOUR_PF_STATUS'.
  IF custom_container1 IS INITIAL.

    SELECT *
      FROM mara AS m
      INTO TABLE gt_mara
      WHERE EXISTS ( SELECT * FROM vbrp WHERE matnr = m~matnr ).

    CREATE OBJECT custom_container1
      EXPORTING
        container_name = cont_on_main.

    CREATE OBJECT grid1
      EXPORTING
        i_parent = custom_container1.

    CALL METHOD grid1->set_table_for_first_display
      EXPORTING
        i_structure_name = 'mara'
        is_layout        = gs_layout
      CHANGING
        it_outtab        = gt_mara.

    CREATE OBJECT event_receiver.
    SET HANDLER event_receiver->handle_double_click FOR grid1.

  ENDIF.
ENDMODULE.                             " PBO_100  OUTPUT

屏幕300 PBO

MODULE pbo_0300 OUTPUT.
  IF custom_container2 IS INITIAL.
    CREATE OBJECT custom_container2
      EXPORTING
        container_name = cont_on_dialog.

    CREATE OBJECT grid2
      EXPORTING
        i_parent = custom_container2.

    gs_layout-grid_title = 'Orders'.

    CALL METHOD grid2->set_table_for_first_display
      EXPORTING
        i_structure_name = 'VBRP'
        is_layout        = gs_layout
      CHANGING
        it_outtab        = gt_vbrp.

  ELSE.
    CALL METHOD grid2->refresh_table_display.
  ENDIF.

ENDMODULE.                             " PBO_0300  OUTPUT

屏幕300 PAI

MODULE pai_0300 INPUT.
  CASE ok_code.
    WHEN 'RETURN'.
      DATA: ans.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          titlebar              = 'SO sample'
          text_question         = 'Select next action'
          text_button_1         = 'Yes'
          icon_button_1         = 'ICON_CHECKED'
          text_button_2         = 'No'
          icon_button_2         = 'ICON_CANCEL'
          display_cancel_button = ' '
        IMPORTING
          answer                = ans.

      CASE ans.
        WHEN 1.
          LEAVE TO SCREEN 0.
        WHEN 2.
          LEAVE PROGRAM.
        WHEN OTHERS.
      ENDCASE.

  ENDCASE.
  CLEAR ok_code.
ENDMODULE.

主程序

CLASS lcl_event_receiver DEFINITION DEFERRED.

DATA: ok_code           LIKE sy-ucomm,
      gt_mara           TYPE TABLE OF mara,
      gt_vbrp           TYPE TABLE OF vbrp,
      grid1             TYPE REF TO cl_gui_alv_grid,
      grid2             TYPE REF TO cl_gui_alv_grid,
      cont_on_main      TYPE scrfname VALUE '100_CONT',
      cont_on_dialog    TYPE scrfname VALUE '300_CONT',
      custom_container1 TYPE REF TO cl_gui_custom_container,
      custom_container2 TYPE REF TO cl_gui_custom_container,
      event_receiver    TYPE REF TO lcl_event_receiver.

START-OF-SELECTION.

  CALL SCREEN 100.

CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS: handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column.
ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_double_click.
    READ TABLE gt_mara INDEX e_row-index ASSIGNING FIELD-SYMBOL(<fs_mara>).

    SELECT *
      INTO TABLE gt_vbrp
      FROM vbrp
      WHERE matnr = <fs_mara>-matnr.

    CALL SCREEN 300 STARTING AT 10 5.
  ENDMETHOD.

ENDCLASS.

在程序开始时,我们在系统中获取带有销售订单的物料清单,然后双击屏幕100,这些订单显示在屏幕300中。

通过功能代码RETURN的特殊按钮(您应将其放在屏幕300上),我们调用弹出窗口与用户进行交互。按,返回初始屏幕100,按,程序完全中断。

在这里你应该注意语句LEAVE TO SCREEN 0,它终止当前的dynpro序列(即300),从而返回100。

答案 1 :(得分:0)

我不能确定这是否有效,但您应该尝试'设置屏幕0'。在将“刷新”按钮编程到我的ALV报告中后,我最近不得不这样做,因为在刷新并重新显示数据后,需要多次“绿色箭头”点击才能退出报告。