SAP Dialog屏幕开发(八)

        1.1、ALV工具栏按钮及行项目双击事件的控制
       
Dialog ALV工具栏是和控制整合在一起的,可以通过以下方法在工具栏中增加菜单或按钮。
        STEP | 01 为了方便代码的分类管理,首先建立一个Include程序,用于存放ALV的控制代码,Include程序的命名的命名尽量与主程序的命名接近,以方便程序的统计及管理,如本例中的主程序名为“ZSCREEN06”,Include程序命名为“ZSCREEN06ALV”。
        增加工具栏中的按钮首先需要定义一个工具栏对象,对象参考类型STB_BUTTON,属性如下:

       属性字段

                                                                        功能描述
     FUNCTION为按钮分配功能代码
         ICON图标的名称
     QUICKINFO关于图标的简要信息
     BUTN_TYPE

工具栏按钮类型,用1位代码来表示,代码及类型描述如下:
0 按钮(正常按钮,默认值)
1 菜单和缺省按钮

2 菜单

3 分割符

4 单选按钮

5 复选框

6 菜单项

       DISABLED设置该按钮的状态为不可用
          TEXT注释(40个字符)
        CHECKED设置为选中时的状态

        STEP | 02 ALV操作的对象仍然为系统类接口CL_GUI_ALV_GRID,在Include程序中需要维护相关类及方法的代码,如下图所示,代码中介绍了具体的方法定义及属性描述。

*&---------------------------------------------------------------------*
*& Report ZSCREEN07
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zscreen07.

TABLES : spfli.

DATA : BEGIN OF lspfli OCCURS 0.  "在内表中新增COLOR作为颜色属性存放字段
    INCLUDE STRUCTURE spfli.
DATA : color TYPE char10,
       END OF lspfli.

DATA : fieldcat           TYPE lvc_t_fcat,  "定义Fieldcat对象
       grid               TYPE REF TO cl_gui_alv_grid,  "定义ALV控件名
       g_container        TYPE scrfname VALUE 'CONT1', "定义本地容器的对象名
       is_layout          TYPE lvc_s_layo,
       g_custom_container TYPE REF TO cl_gui_custom_container.  "定义容器对象名

SELECTION-SCREEN BEGIN OF SCREEN 0101 AS SUBSCREEN.

SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS : s_carrid FOR spfli-carrid,
                 s_connid FOR spfli-connid.

SELECTION-SCREEN END OF BLOCK 10.

SELECTION-SCREEN END OF SCREEN 0101.

START-OF-SELECTION.

  CALL SCREEN '1001'.

  INCLUDE zscreen07ialv.

FORM alvshow.

  CREATE OBJECT g_custom_container   "创建容器对象
    EXPORTING
      container_name = g_container.
  CREATE OBJECT grid
    EXPORTING
      i_parent = g_custom_container. "创建控件对象
  is_layout-info_fname = 'COLOR'.    "定义颜色属性字段
  CALL METHOD grid->set_table_for_first_display
    EXPORTING
      i_structure_name = 'SPFLI'
      is_layout        = is_layout
      i_save           = 'X'
    CHANGING
      it_outtab        = lspfli[]
      it_fieldcatalog  = fieldcat[].

*注册ALV中引用的事件

  SET HANDLER alv_event_receiver=>handle_toolbar
              alv_event_receiver=>handle_menu_button
              alv_event_receiver=>handle_user_command
              alv_event_receiver=>handle_double_click
            FOR ALL INSTANCES.

*调用方法激活自定义工具栏对象

  CALL METHOD grid->set_toolbar_interactive.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.

  CASE sy-ucomm.

    WHEN '&EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'EXEC'.
      SELECT * FROM spfli
        INTO CORRESPONDING FIELDS OF TABLE lspfli
        WHERE carrid IN s_carrid
        AND   connid IN s_connid.

      lspfli-color = 'C610'.
      MODIFY lspfli TRANSPORTING color WHERE distance <= '3000'. "当distance为空时,显示更改属性

      IF g_custom_container IS INITIAL.   "检查是否创建容器对象

        PERFORM alvshow.

      ELSE.

        CALL METHOD grid->refresh_table_display.

      ENDIF.

  ENDCASE.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
  SET PF-STATUS 'T001'.
*  SET TITLEBAR 'xxx'.
ENDMODULE.

        ZSCREEN07IALV代码

*&---------------------------------------------------------------------*
*&  Include           ZSCREEN07IALV
*&---------------------------------------------------------------------*

DATA : gs_toolbar TYPE stb_button.

CLASS alv_event_receiver DEFINITION DEFERRED.  "声明类对象

CLASS alv_event_receiver DEFINITION.  "声明类成员的可见性

  PUBLIC SECTION. "定义相关类成员可以被程序中的所有对象调用

    CLASS-METHODS :   "定义方法类

      handle_toolbar  "初始化工具栏对象事件,如增加按钮并设定其属性
                    FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object e_interactive,

      handle_menu_button    "该事件用于在下拉菜单中增加选项
                    FOR EVENT menu_button OF cl_gui_alv_grid
        IMPORTING e_object e_ucomm,

      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 es_row_no.

ENDCLASS.
CLASS alv_event_receiver IMPLEMENTATION.    "实现方法类

  METHOD handle_toolbar.
    gs_toolbar-function  = 'B_SUM'.    "为按钮分配功能代码
    gs_toolbar-icon      = icon_display.    "为按钮分配图标
    gs_toolbar-text      = '总行数'.    "为按钮分配文本
    gs_toolbar-butn_type = '0'.    "定义按钮类型,不填时为0
    APPEND gs_toolbar TO e_object->mt_toolbar.   "添加到按钮工具栏

    gs_toolbar-function  = 'B_LIST'.    "为按钮分配功能代码
    gs_toolbar-quickinfo = '自定义下拉菜单'. "
    gs_toolbar-icon      = icon_biw_report_view.    "为按钮分配图标
    gs_toolbar-text      = '下拉菜单'.    "为按钮分配文本
    gs_toolbar-butn_type = '1'.    "定义按钮类型,不填时为0
    APPEND gs_toolbar TO e_object->mt_toolbar.   "添加到按钮工具栏
  ENDMETHOD.
  METHOD handle_menu_button.

    IF e_ucomm = 'B_LIST'.   "在菜单中增加选项,可以多次用该方法以增加多行

      CALL METHOD e_object->add_function
        EXPORTING
          icon  = icon_display
          fcode = 'B_SUM'
          text  = '显示ALV总行数'.

    ENDIF.

  ENDMETHOD.
  METHOD handle_user_command.   "获取单击ALV工具栏按钮时的功能码

    DATA : sum TYPE i.

    IF e_ucomm = 'B_SUM'.

      DESCRIBE TABLE lspfli[] LINES sum.
      MESSAGE i001(00) WITH '当前ALV表格的总行数是:' sum.

    ENDIF.

  ENDMETHOD.
  METHOD handle_double_click.

    DATA : ls_spfli TYPE spfli.    "获取当前行号,与内表一致
    READ TABLE lspfli INTO ls_spfli INDEX es_row_no-row_id.
    MESSAGE i001(00) WITH '当前行:' es_row_no-row_id ',航线代码:' ls_spfli-carrid.

  ENDMETHOD.
ENDCLASS.

        执行后的结果


 

 

 

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP扫地僧

你的鼓励将是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值