📅  最后修改于: 2023-12-03 15:29:16.762000             🧑  作者: Mango
在 SAP ABAP 开发中,我们经常需要使用 ALV 报表来展示数据,但有时我们需要打开一个窗口来显示一些信息或者让用户选择一些选项。这时,我们就可以使用 Alv Popup 来实现。
Alv Popup 是将 ALV 报表嵌入到一个弹出窗口中展示。这样,我们可以在这个窗口中处理一些逻辑操作,并返回一些信息给主程序。
下面是 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 窗口已关闭。