0

我想开发以下逻辑:

传回 2 个屏幕

方框“ DISPLAY ALV”对应功能模块REUSE_ALV_GRID_DISPLAY

LEAVE TO SCREEN 0不能直接传递给DISPLAY ALV. 是否可以?

谢谢你。

4

2 回答 2

1

不,您不能像您打算那样返回FM,因为 FM 是一个特殊的可调用单元,并且LEAVE TO SCREEN语句仅适用于屏幕。但是,您可以返回显示该 ALV 的屏幕 100。

考虑以下编码,您应该有屏幕 100 和 300 以及自定义100_CONT容器300_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 的语句。

于 2017-12-05T16:42:35.107 回答
0

我不能确定这是否可行,但您应该尝试“设置屏幕 0”。我最近在我的 ALV 报告中编写了一个“刷新”按钮后不得不这样做,因为在刷新和重新显示数据之后,需要多次单击“绿色箭头”才能退出报告。

于 2017-11-16T19:55:52.560 回答