datie

OO ALV中经常会用的行单击,行双击,application tool bar上添加按钮以及按钮的相应事件,如下:

1,单击:handle_hotspot_click 事件

2,双击:handle_double_click

3,工具栏上添加自定按钮: handle_toolbar,其中,butn_type = 3. 是分隔符详细参照下面代码

4, 自定义按钮相应事件:handle_command

这些事件需要用SET HANDLER先注册,然后再在类中实现,添加自己的逻辑。

下面是个完整代码以及相关屏幕的创建过程:

1) 创建0100屏幕

屏幕PAI,PBO中流逻辑代码

PROCESS BEFORE OUTPUT.
  MODULE STATUS_0100.
  MODULE INIT_CON.
 
PROCESS AFTER INPUT.
 MODULE USER_EXIT_0100 AT EXIT-COMMAND.

2017-02-27_13-52-59

2)  在0100屏幕上画自定义控件,命名为CUS01

在屏幕点击下面红框内的按钮创建控件CUS01.

2017-02-27_13-21-07

3,程序中的Status

2017-02-27_13-47-59

4,程序代码

REPORT ZTEST_OO_ALV_EVENT.

DATA: gs_data TYPE spfli.

DATA: gt_data LIKE TABLE OF gs_data.

DATA: g_con01  TYPE REF TO cl_gui_custom_container.

DATA: g_grid01 TYPE REF TO cl_gui_alv_grid.

DATA: gs_fieldcat TYPE lvc_s_fcat.
DATA: gt_fieldcat TYPE lvc_t_fcat.

CONSTANTS: g_cus01 TYPE scrfname VALUE \'CUS01\'.

*----------------------------------------------------------------------*
*       CLASS cl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_receiver DEFINITION.
  PUBLIC SECTION.
    " 声明单击事件的方法
    METHODS handle_hotspot_click
      FOR EVENT hotspot_click OF cl_gui_alv_grid
      IMPORTING e_row_id e_column_id.
    " 声明双击事件方法
    METHODS handle_double_click
      FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column.
    " 声明Toolbar事件方法
    METHODS handle_toolbar
      FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.
    " 声明USER-COMMAND 事件方法
    METHODS handle_command
      FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm.
ENDCLASS.                    "cl_event_receiver DEFINITION

*----------------------------------------------------------------------*
*       CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_event_receiver IMPLEMENTATION.
  " 单击事件方法的实现
  METHOD handle_hotspot_click.
    CONDENSE e_row_id     NO-GAPS.
    CONDENSE e_column_id  NO-GAPS.
    MESSAGE i001(00) WITH \'单击事件->行号:\' e_row_id  \'、列名:\' e_column_id.
  ENDMETHOD.                    "handle_HOTSPOT_CLICK
  " 双击事件方法的实现
  METHOD handle_double_click.
    CONDENSE e_row     NO-GAPS.
    CONDENSE e_column  NO-GAPS.
    MESSAGE i001(00) WITH \'双击事件->行号:\' e_row  \'、列名:\' e_column.
  ENDMETHOD.                    "handle_double_click
  " 实现Toolbar事件方法
  METHOD handle_toolbar.
    DATA: ls_toolbar TYPE stb_button.
    CLEAR: ls_toolbar.
    ls_toolbar-butn_type = 3. " 分隔符
    APPEND ls_toolbar TO e_object->mt_toolbar.
    CLEAR: ls_toolbar.
    ls_toolbar-function = \'DISP\'.    " 功能码
    ls_toolbar-icon = icon_display.  " 图标名称
    ls_toolbar-quickinfo = \'显示\'.   " 图标的提示信息
    ls_toolbar-butn_type = 0.        " 0表示正常按钮
    ls_toolbar-disabled = \'\'.        " X表示灰色,不可用
    ls_toolbar-text = \'按钮1\'.       " 按钮上显示的文本
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar
  " 实现USER-COMMAND 事件方法
  METHOD handle_command.
    CASE e_ucomm.
      WHEN \'DISP\'.
        MESSAGE i001(00) WITH \'Toolbar事件 + USER-COMMAND事件 \'.
    ENDCASE.
  ENDMETHOD.                    "HANDLE_COMMAND

ENDCLASS.                    "cl_event_receiver IMPLEMENTATION
DATA: event_receiver TYPE REF TO cl_event_receiver.

START-OF-SELECTION.
  PERFORM get_data.

  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text  获取数据
*----------------------------------------------------------------------*
FORM get_data.
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE gt_data
    UP TO 30 ROWS
    FROM spfli.

ENDFORM.                    "GET_DATA

*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text  ALV显示字段文本
*----------------------------------------------------------------------*
FORM set_fieldcat.
  CLEAR: gt_fieldcat[].
  DEFINE macro_fieldcat.
    clear gs_fieldcat.
    gs_fieldcat-fieldname = &1.
    gs_fieldcat-coltext   = &2.
    gs_fieldcat-hotspot   = &3.
    append gs_fieldcat to gt_fieldcat.
  END-OF-DEFINITION.

  macro_fieldcat \'CARRID\'     \'航线代码\'   \'X\'.
  macro_fieldcat \'CONNID\'     \'航班连接Id\' \'\'.
  macro_fieldcat \'COUNTRYFR\'  \'起飞国家\'   \'\'.
  macro_fieldcat \'CITYFROM\'   \'起飞城市\'   \'\'.
  macro_fieldcat \'AIRPFROM\'   \'起飞机场\'   \'\'.
  macro_fieldcat \'COUNTRYTO\'  \'目标国家\'   \'\'.
  macro_fieldcat \'CITYTO\'     \'目标城市\'   \'\'.
  macro_fieldcat \'AIRPTO\'     \'目标机场\'   \'\'.
  macro_fieldcat \'FLTIME\'     \'航班时间\'   \'\'.
  macro_fieldcat \'DEPTIME\'    \'启程时间\'   \'\'.
  macro_fieldcat \'ARRTIME\'    \'到达时间\'   \'\'.
  macro_fieldcat \'DISTANCE\'   \'距离\'       \'\'.

ENDFORM.                    "SET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT
*&---------------------------------------------------------------------*
*       text  布局
*----------------------------------------------------------------------*
*      -->P_LAYOUT   text
*----------------------------------------------------------------------*
FORM set_layout CHANGING p_layout TYPE lvc_s_layo.
  p_layout-cwidth_opt = \'X\'.   " 自动调节字段长度
  p_layout-sel_mode   = \'D\'.   " 选择模式,可选择多行
  p_layout-zebra      = \'X\'.   " 颜色交替显示
ENDFORM.                      "SET_LAYOUT

*&---------------------------------------------------------------------*
*&      Module  INIT_CON  OUTPUT
*&---------------------------------------------------------------------*
*       text  创建ALV
*----------------------------------------------------------------------*
MODULE init_con OUTPUT.

  DATA: ls_layout TYPE lvc_s_layo.

  IF g_con01 IS INITIAL.
    PERFORM set_fieldcat.
    PERFORM set_layout CHANGING ls_layout.

    " 创建SAP容器实例
    CREATE OBJECT g_con01
      EXPORTING
        container_name              = g_cus01 " 自定义控件名称
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    " 创建GRID实例
    CREATE OBJECT g_grid01
      EXPORTING
        i_parent          = g_con01
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 4
        OTHERS            = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    CREATE OBJECT event_receiver.
    " 注册事件handler方法
    SET HANDLER event_receiver->handle_hotspot_click  FOR g_grid01.
    SET HANDLER event_receiver->handle_double_click   FOR g_grid01.
    SET HANDLER event_receiver->handle_toolbar FOR g_grid01.
    SET HANDLER event_receiver->handle_command FOR g_grid01.

    " 调用ALV 显示方法
    CALL METHOD g_grid01->set_table_for_first_display
      EXPORTING
*       i_structure_name              = \'SPFLI\' " 参照表结构字段显示
        is_layout                     = ls_layout " 布局
      CHANGING
        it_fieldcatalog               = gt_fieldcat " 显示字段
        it_outtab                     = gt_data[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

  ENDIF.

ENDMODULE.                 " INIT_CON  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text  工具条
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS \'S0001\'.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*       text  取消事件
*----------------------------------------------------------------------*
MODULE user_exit_0100 INPUT.
  LEAVE TO SCREEN 0.
ENDMODULE.                 " USER_EXIT_0100  INPUT

5,运行效果

2017-02-27_13-49-33

2017-02-27_13-50-06

2017-02-27_13-50-33

以上

分类:

技术点:

相关文章:

  • 2021-11-30
  • 2022-01-23
  • 2022-12-23
  • 2022-03-05
  • 2022-12-23
  • 2022-12-23
  • 2021-06-12
  • 2018-02-23
猜你喜欢
  • 2021-08-14
  • 2021-08-18
  • 2022-12-23
  • 2021-05-01
  • 2022-02-10
相关资源
相似解决方案