📜  abap alv popup - Abap (1)

📅  最后修改于: 2023-12-03 15:29:16.762000             🧑  作者: Mango

ABAP Alv Popup

在 SAP ABAP 开发中,我们经常需要使用 ALV 报表来展示数据,但有时我们需要打开一个窗口来显示一些信息或者让用户选择一些选项。这时,我们就可以使用 Alv Popup 来实现。

Alv Popup 的基本概念

Alv Popup 是将 ALV 报表嵌入到一个弹出窗口中展示。这样,我们可以在这个窗口中处理一些逻辑操作,并返回一些信息给主程序。

Alv Popup 的实现方法

下面是 Alv Popup 的实现方法:

  1. 创建一个自定义的 FCODE,用于触发打开 Popup 窗口的事件;
  2. 在程序逻辑中添加对该 FCODE 的处理逻辑,以打开 Alv Popup 窗口;
  3. 在 Popup 窗口中实现 ALV 报表,并在必要时添加一些控件,如输入框、日期选择器等;
  4. 在 Popup 窗口中处理用户交互,并将结果返回给主程序;
  5. 在主程序中接收 Alv Popup 返回的结果,并进行必要的处理。
Alv Popup 的示例代码

下面是 Alv Popup 的示例代码(使用 CL_GUI_ALV_GRID 类):

*&---------------------------------------------------------------------*
*& Report  ZALV_POPUP_DEMO
*&---------------------------------------------------------------------*

REPORT zalv_popup_demo.

*&---------------------------------------------------------------------*
*&          Selection Screen
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_carrid TYPE scarr-carrid.
SELECTION-SCREEN END OF BLOCK b1.

*&---------------------------------------------------------------------*
*&          Data Declaration
*&---------------------------------------------------------------------*

DATA: gv_out TYPE boolean.

DATA: gs_flight TYPE sflight.

*&---------------------------------------------------------------------*
*&          Start-of-Selection
*&---------------------------------------------------------------------*

START-OF-SELECTION.

  PERFORM open_popup.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&          Form  open_popup
*&---------------------------------------------------------------------*

FORM open_popup.

  DATA: gt_sflight TYPE TABLE OF sflight.

  * Select data
  SELECT * FROM sflight
    INTO TABLE gt_sflight
    WHERE carrid = p_carrid.

  * Create Alv Grid
  DATA(lo_alv) = NEW cl_gui_alv_grid( i_parent = cl_gui_container=>screen0 ).

  * Set Field Catalog
  DATA(lo_alv_fc) = lo_alv->get_structure( ).
  lo_alv_fc->set_table_for_first_display(
    EXPORTING
      i_structure_name   = 'SFLIGHT'
    CHANGING
      it_outtab          = gt_sflight ).

  * Add Button
  DATA(lo_button) = lo_alv->get_function( ).
  lo_button->set_text( 'OK' ).
  lo_button->set_position( color_column = abap_false row = 0 col = 1 ).
  SET HANDLER handle_ok FOR lo_button.
  DATA(lo_container) = lo_alv->get_container( ).
  lo_container->add_child( lo_button ).

  * Show Popup
  DATA(lo_popup) = NEW cl_gui_custom_container( )->create( 
    'POPUP' WIDTH 800 HEIGHT 600 ).
  lo_popup->add_child( lo_alv ).
  CALL METHOD lo_popup->show.

  * Wait for Popup Return Status
  CALL METHOD lo_alv->execute( ).
  WHILE gv_out IS INITIAL.
    WAIT UP TO 1 SECONDS.
  ENDWHILE.
  gv_out = abap_false.

ENDFORM.

*&---------------------------------------------------------------------*
*&          Form  handle_ok
*&---------------------------------------------------------------------*

FORM handle_ok.

  DATA(lo_event) = cl_gui_alv_grid=>get_current_event( ).

  * Retrieve Selected Row
  READ TABLE lo_event->mt_index INTO DATA(ls_index).
  READ TABLE lo_event->mt_outtab INTO gs_flight INDEX ls_index.

  * Set Return Status
  gv_out = abap_true.

ENDFORM.

在上面的示例代码中,我们首先在屏幕上添加了一个输入参数,以允许用户选择 Carrier ID。然后,我们在 Start-Of-Selection 中调用 open_popup 函数来打开 Alv Popup 窗口。

在 open_popup 函数中,我们首先获取了符合条件的数据,并创建了一个 Alv Grid 对象。然后,我们将 Alv Grid 添加到一个 Custom Container 对象中,并添加了一个"OK"按钮。最后,我们调用 Custom Container 的 show 方法来显示 Popup 窗口。

在 Popup 窗口中,我们使用 Alv Grid 来展示数据,并添加了一个"OK"按钮,用于让用户选择数据。当用户选择数据后,我们在 handle_ok 函数中设置了 gv_out 变量的值,并通过它告诉主程序 Alv Popup 窗口已关闭。

参考资料
  1. SAP Help Portal - CL_GUI_ALV_GRID Class
  2. Alv Popup and ALV Popin Issue