Abap/4控制ALV表格(3)

来源:互联网 发布:dreamweaver cs4 mac 编辑:程序博客网 时间:2024/05/12 14:32

*&---------------------------------------------------------------------*
*& Report  Z_CPT9_3                                                    *
*&                                                                     *
*&---------------------------------------------------------------------*
*1 在屏幕上使用ALV控件
*2 在ALV控件上添加自己的按钮
*3 为添加的按钮赋予行选择事件
*4 双击事件

*&---------------------------------------------------------------------*

REPORT  Z_CPT9_3                                                    .

INCLUDE <ICON>.

 

START-OF-SELECTION.
DATA: OK_CODE TYPE SY-UCOMM,
      SAVE_OK TYPE SY-UCOMM.
DATA: WA_SPFLI TYPE TABLE OF SPFLI,
      A_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.

*定义ALV控件类型
DATA:WA_CONTAINER TYPE SCRFNAME VALUE 'CONTAINER1',
     ALV_GRID TYPE REF TO CL_GUI_ALV_GRID,
     WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

"这行是声明
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.

DATA:EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.

"执行代码
SELECT * FROM SPFLI INTO TABLE WA_SPFLI.
CALL SCREEN 100.

 

"类定义
CLASS LCL_EVENT_RECEIVER DEFINITION.
    PUBLIC SECTION.
        METHODS:
            HANDLE_TOOLBAR
                FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
                    IMPORTING E_OBJECT E_INTERACTIVE,
            HANDLE_USER_COMMAND
                FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
                    IMPORTING E_UCOMM,
            HANDLE_DOUBLE_CLICK
                FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
                    IMPORTING E_ROW E_COLUMN.

ENDCLASS.

CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
    "PUBLIC SECTION.
    METHOD HANDLE_TOOLBAR.
        "创建一个按钮
        DATA:LS_TOOLBAR TYPE STB_BUTTON.
*        CLEAR LS_TOOLBAR-BUTN_TYPE.
*        APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
*        CLEAR LS_TOOLBAR.

        MOVE 'SHOW_DETA' TO LS_TOOLBAR-FUNCTION.
        MOVE ICON_PPE_VNODE TO LS_TOOLBAR-ICON.
        MOVE '航班明细显示' TO LS_TOOLBAR-QUICKINFO.
        MOVE '航班明细显示'(112) TO LS_TOOLBAR-TEXT.
        MOVE '' TO LS_TOOLBAR-DISABLED.
        APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
    ENDMETHOD.
    METHOD HANDLE_USER_COMMAND.
        DATA: LT_ROWS TYPE LVC_T_ROW.
        CASE E_UCOMM.
            WHEN 'SHOW_DETA'.
                "获取被选择的行
                CALL METHOD ALV_GRID->GET_SELECTED_ROWS
                    IMPORTING
                        ET_INDEX_ROWS = LT_ROWS.
                "这行代码是干啥用的?
                CALL METHOD CL_GUI_CFW=>FLUSH.
                IF SY-SUBRC = 0.
                    MESSAGE s003(YMESS) WITH '已选择行!'.
                    PERFORM MESSDETA TABLES LT_ROWS.
                ENDIF.
        ENDCASE.
    ENDMETHOD.
    METHOD HANDLE_DOUBLE_CLICK.
        "读取被双击的行
        DATA:LI_SPFLI LIKE LINE OF WA_SPFLI.
        READ TABLE WA_SPFLI INDEX E_ROW-INDEX INTO LI_SPFLI.
        "拼接显示的数据
        DATA:S1(100) TYPE C.
        CONCATENATE '行:' E_ROW-INDEX '列名:' E_COLUMN-FIELDNAME
               INTO S1.
        CONCATENATE S1 'connid:' LI_SPFLI-CONNID INTO S1.
        CONCATENATE S1 'carrid' LI_SPFLI-CARRID INTO S1.
        "显示信息
        "MESSAGE S208(00) WITH S1.
        MESSAGE i003(YMESS) WITH S1.
    ENDMETHOD.
ENDCLASS.

 

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.
"如果窗口没有创建ALV对象就创建它
IF WA_CUSTOM_CONTAINER IS INITIAL.
    CREATE OBJECT WA_CUSTOM_CONTAINER
        EXPORTING
            CONTAINER_NAME = WA_CONTAINER.
    CREATE OBJECT ALV_GRID
        EXPORTING
            I_PARENT = WA_CUSTOM_CONTAINER.
    CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
            I_STRUCTURE_NAME = 'SPFLI'
        CHANGING
            IT_OUTTAB = WA_SPFLI.
    CREATE OBJECT EVENT_RECEIVER.
    SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR ALV_GRID.
    SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR FOR ALV_GRID.
    SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR ALV_GRID.
    CALL METHOD ALV_GRID->SET_TOOLBAR_INTERACTIVE.
ENDIF.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  CANCEL  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE CANCEL INPUT.
    LEAVE PROGRAM.
ENDMODULE.                 " CANCEL  INPUT


FORM MESSDETA TABLES P_ET_INDEX_ROWS STRUCTURE LVC_S_ROW.
    DATA:LS_SELECTED_LINE LIKE LVC_S_ROW,
         LF_ROW_INDEX TYPE LVC_INDEX.
    DATA:S1(200) TYPE C,
         S2(3) TYPE C.
    S2 = '-'.
    LOOP AT P_ET_INDEX_ROWS INTO LS_SELECTED_LINE.
        LF_ROW_INDEX = LS_SELECTED_LINE-INDEX.
        READ TABLE WA_SPFLI INDEX LF_ROW_INDEX INTO A_SPFLI.
        S1 = '选择行内容'.
        CONCATENATE S1
                    A_SPFLI-CONNID
                    A_SPFLI-CARRID
                    A_SPFLI-CITYFROM
                 INTO S1 SEPARATED BY S2.
       MESSAGE i003(YMESS) WITH S1.
    ENDLOOP.
ENDFORM.

 

 

 

 

 

 

 

*子屏幕100的逻辑流代码
PROCESS BEFORE OUTPUT.
 MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0100.
 MODULE CANCEL AT EXIT-COMMAND.