首页 > 其他分享 >OO ALV常用功能完整简例(热键单击…

OO ALV常用功能完整简例(热键单击…

时间:2022-10-12 20:02:12浏览次数:69  
标签:OO 单击 wa cl 简例 gui grid alv toolbar


OO ALV 常用功能简介

目录

OO ALV 常用功能简介... 1

一、所用类:... 2

二、效果图:... 2

单击... 2

双击... 2

F4帮助... 3

编辑某单元格并校验... 3

三、实现过程:... 3

1、 创建一个屏幕9001,不需要画任何控件

2、 定义数据:... 3

3、 获取显示数据:... 4

4、 alv 显示数据:... 4




一、所用类:

cl_gui_alv_grid

cl_gui_docking_container

二、效果图:

    执行:


  ​

OO <wbr>ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)


单击

    单击航线单元格:

OO <wbr>ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)


双击

   双击连接号码单元格:

OO <wbr>ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)


F4帮助

  航班单元格上F4或点击 后面的小按钮


 (本功能在设置字段样式时实现DEFINE mac_fieldlog.

  "设置参考表和参考字段,为了提供搜索帮助
  wa_fieldcatalog-ref_table       = &4.            "参考表
  wa_fieldcatalog-ref_field       = &5.            "参考字段

   


    ​

OO <wbr>ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)


编辑某单元格并校验

修改价格后随便点击某个按钮或者双击某个字段,触发:handle_data_changed


三、实现过程:

1、 创建一个屏幕9001,不需要画

2、 定义数据:

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

 ALV  全局变量
*&---------------------------------------------------------------

DATA: g_alv_grid    TYPE REF TO cl_gui_alv_grid,"ALV控件
      alv_ctner     TYPE REF TO cl_gui_docking_container.


DATA: wa_fieldcatalog    TYPE lvc_s_fcat,    "显示数据列内表工作区域
      it_fieldcatalog    TYPE lvc_t_fcat.    "显示数据列内表

DATA: g_event              TYPE REF TO alv_event_receiver.
*&---------------------------------------------------------------
*&  全局变量
*&---------------------------------------------------------------
DATA:
      BEGIN OF str_spfli,
        checkbox TYPE char1,                      "复选框
        carrid   TYPE  sflight-carrid       , "航线承运人ID
        connid   TYPE  sflight-connid       , "航班连接 Id
        fldate   TYPE  sflight-fldate       , "航班日期
        price    TYPE  sflight-price        , "航空运费
      END OF  str_spfli.

DATA:
      g_it_show LIKE TABLE OF str_spfli WITH KEY checkbox carrid.
      g_wa_show LIKE str_spfli.



3、 获取显示数据:

 "获取数据
  SELECT carrid
         connid
         fldate
         price
    FROM sflight INTO CORRESPONDING FIELDS OF  TABLE g_it_show.

4、 显示数据:

BEFORE OUTPUT.
 MODULE STATUS_9001.
 "alv 显示数据
 MODULE MDL_ALV_SHOW.

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

MDL_ALV_SHOW output.
PERFORM zform_alv_show.

      

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


zform_alv_show .
  DATA:   l_style      TYPE i,
          ls_layout    TYPE lvc_s_layo,
          is_stable    TYPE lvc_s_stbl,
          l_disvariant TYPE disvariant.

* 屏幕初始化
  IF alv_ctner IS INITIAL.

    CREATE OBJECT alv_ctner
      EXPORTING
        repid                       = sy-repid
        dynnr                       = '9001'
*       side                        = cl_gui_docking_container=>dock_at_right      ”ALV贴屏幕右边,从屏幕右边开始算宽度
        side                        = cl_gui_docking_container=>dock_at_left       "ALV贴屏幕左边,从左边算屏幕宽度,
        extension                   = 900                                          "屏幕宽度
        style                       = cl_gui_control=>ws_child                     "可选参数,设置ALV是否可用手动拖动大小
      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 s001(00) WITH '屏幕初始化失败'.
      LEAVE LIST-PROCESSING.
    ENDIF.

*添加自定义工具条
    PERFORM frm_set_alv_toolbar.
*
    CREATE OBJECT g_alv_grid
      EXPORTING
        i_parent = alv_ctner.

*构建显示字段样式
    PERFORM frm_build_fieldcat.

    "Set/Reset Ready for Input Status
    CALL METHOD g_alv_grid->set_ready_for_input
      EXPORTING
        i_ready_for_input = 1.

* layout 设定样式
    CLEAR ls_layout.
    ls_layout-cwidth_opt = 'X'.     "优化列宽

    CLEAR l_disvariant.
    l_disvariant-report = sy-repid. "当前程序

* event  绑定事件
    CREATE OBJECT g_event.


     "自定义工具条
    SET HANDLER g_event->toolbar             FOR g_alv_grid. 

   "数据修改事件  

HANDLER g_event->handle_data_changed FOR g_alv_grid.

单击某一单元格事件
    SET HANDLER g_event->handle_cell_click   FOR g_alv_grid.

用户点击工具条上按钮触发的事件
    SET HANDLER g_event->handle_user_command FOR g_alv_grid.

双击某一单元格事件
    SET HANDLER g_event->handle_double_click FOR g_alv_grid.

"以下两个方法达到的效果是:光标离开正在编辑的单元格时,

就触发了handle_data_changed
    "如果不注释掉以下两个方法,

则只有执行下一操作时才会触发handle_data_changed,比如点保存、删除
    CALL METHOD g_alv_grid->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    CALL METHOD g_alv_grid->register_edit_event
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.

*   "显示内表数据
    CALL METHOD g_alv_grid->set_table_for_first_display
      EXPORTING
        is_layout            = ls_layout
        is_variant           = l_disvariant
        it_toolbar_excluding = gt_tools
      CHANGING
        it_fieldcatalog      = it_fieldcatalog[]
        it_outtab            = g_it_show[].

  ELSE.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    "ALV 控制:刷新稳定性 按行刷新,可选参数
    CLEAR is_stable.
    is_stable-col = 'X'.

    "刷新
    CALL METHOD g_alv_grid->refresh_table_display
      EXPORTING
        is_stable = is_stable
        i_soft_refresh = 'X'.

    "提交
    CALL METHOD cl_gui_cfw=>flush.

  ENDIF.
ENDFORM.                    " ZFORM_ALV_SHOW



其中:

添加工具条上常用按钮

frm_set_alv_toolbar .
  REFRESH gt_tools[].

"你也可以删除标准的功能按钮


 

 

 

 

 


 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 APPEND cl_gui_alv_grid=>mc_fc_check             TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_cut           TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_copy          TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_copy_row      TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_delete_row    TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_insert_row    TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_move_row      TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_paste         TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_paste_new_row TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_sum               TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_info              TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_refresh           TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_graph             TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_append_row    TO gt_tools.
  APPEND cl_gui_alv_grid=>mc_fc_loc_undo          TO gt_tools.
ENDFORM.                    " FRM_SET_ALV_TOOLBAR


设置显示字段和其参考字段


DEFINE mac_fieldlog.
* g_pos = g_pos + 1.                               "第几列
* wa_fieldcatalog-col_pos         = g_pos.         "列
  wa_fieldcatalog-fieldname       = &1.            "字段名称
* wa_fieldcatalog-coltext         = &2.            "显示名称,跟reptext效果基本相同
  wa_fieldcatalog-reptext         = &2.
  wa_fieldcatalog-outputlen       = &3.            "显示长度

  "设置参考表和参考字段,为了提供搜索帮助
  wa_fieldcatalog-ref_table       = &4.            "参考表
  wa_fieldcatalog-ref_field       = &5.            "参考字段

  "设置复选框可编辑
  if &1 eq 'CHECKBOX'.
    wa_fieldcatalog-checkbox      = 'X'.
    wa_fieldcatalog-edit          = 'X'.
  endif.

  "设置 价格PRICE字段 可修改
  if &1 eq 'PRICE'.
    wa_fieldcatalog-edit = 'X'.
  endif.

  "设置   航线承运人字段 CARRID 为热键
  if &1 eq 'CARRID'.
    wa_fieldcatalog-hotspot = 'X'.
  endif.

  append wa_fieldcatalog to it_fieldcatalog.
  clear wa_fieldcatalog.
END-OF-DEFINITION.

FORM frm_build_fieldcat .

'CHECKBOX' '选择'         ''    ' '     ' '  .

'CARRID'   '航线承运人'   ''    'SFLIGHT' 'CARRID'.

'CONNID'   '航班数量'     ''    'SFLIGHT' 'CONNID' .
  mac_fieldlog 'FLDATE'   '国家'         ''    'SFLIGHT' 'FLDATE '.  "最后两个字段 参考表内字段,可以作为帮助
  mac_fieldlog 'PRICE'    '起飞城市'     ''    'SFLIGHT' 'PRICE'  .
ENDFORM. " FRM_BUILD_FIELDCAT


事件的定义

*       CLASS ALV_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------

CLASS alv_event_receiver DEFINITION.
  PUBLIC SECTION.

    "添加工具条
    METHODS toolbar              FOR EVENT toolbar     OF cl_gui_alv_grid
       IMPORTING
         e_object
         e_interactive.

    "子都修改时触发
    METHODS handle_data_changed  FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING
        er_data_changed.


    "某字段设置热键后,单击此单元格时触发
    METHODS  handle_cell_click   FOR EVENT hotspot_click OF cl_gui_alv_grid
      IMPORTING
        e_row_id
        e_column_id
        es_row_no.

    "双击时触发
    METHODS handle_double_click  FOR EVENT double_click  OF cl_gui_alv_grid
      IMPORTING
        e_row
        e_column
        es_row_no.

    "按F1时触发
    METHODS handle_onf1          FOR EVENT onf1          OF cl_gui_alv_grid
       IMPORTING
        e_fieldname
        es_row_no
        er_event_data.

    "当用户按屏幕上按钮时触发
    METHODS handle_user_command  FOR EVENT user_command  OF cl_gui_alv_grid
       IMPORTING
         e_ucomm.
    .
ENDCLASS.                    "alv_event_receiver DEFINITION


*&---------------------------------------------------------------------*
*&  Class (Implementation)  ALV_EVENT_RECEIVER
*&---------------------------------------------------------------------*

CLASS alv_event_receiver IMPLEMENTATION.
  METHOD handle_data_changed.

    DATA:
          l_it_data   TYPE  lvc_t_modi,
          l_wa_data   LIKE LINE OF l_it_data.

    DATA: l_price_old TYPE string,
          l_price_new TYPE string,
          l_msg       TYPE string.

    l_it_data = er_data_changed->mt_mod_cells.


    LOOP AT er_data_changed->mt_mod_cells INTO l_wa_data WHERE  fieldname = 'PRICE'.

      READ TABLE g_it_show INTO g_wa_show INDEX l_wa_data-row_id.
      IF sy-subrc = 0.
        l_price_old = g_wa_show-price .
        l_price_new = l_wa_data-value .
        IF l_price_old <> l_price_new.
          CONCATENATE '价格由' l_price_old '改为' l_price_new INTO l_msg.
          MESSAGE l_msg TYPE 'I'.
        ENDIF.
      ENDIF.
    ENDLOOP.




  ENDMETHOD.                    "handle_data_changed
  METHOD toolbar.
    DATA: ls_toolbar  TYPE stb_button.

    CLEAR ls_toolbar.
    MOVE 3            TO ls_toolbar-butn_type.      "分隔符
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 'SEL_ALL'       TO ls_toolbar-function.      "添加两个按钮 全选  和 取消全选
    MOVE icon_select_all TO ls_toolbar-icon.
    MOVE '全选'          TO ls_toolbar-quickinfo.
    MOVE ' '             TO ls_toolbar-disabled.
    APPEND ls_toolbar    TO e_object->mt_toolbar.


    CLEAR ls_toolbar.
    MOVE 'CAN_ALL'          TO ls_toolbar-function.
    MOVE icon_deselect_all  TO ls_toolbar-icon.
    MOVE '全部取消 '         TO ls_toolbar-quickinfo.
    MOVE ' '                TO ls_toolbar-disabled.
    APPEND ls_toolbar       TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 0             TO ls_toolbar-butn_type.              "按钮
    MOVE 'DELETE'      TO ls_toolbar-function.               "功能码
    MOVE 'DELETE'      TO ls_toolbar-text.                   "显示名称
    MOVE icon_cancel   TO ls_toolbar-icon.                   "图标
    MOVE '删除选中行'   TO ls_toolbar-quickinfo.              "鼠标停留时的提示信息
    MOVE ' '           TO ls_toolbar-disabled.               "可用
    APPEND ls_toolbar  TO e_object->mt_toolbar.
  ENDMETHOD.                    "toolbar


  METHOD handle_cell_click.

    "获取单击字段
    DATA: l_msg      TYPE string,
          l_wa_click LIKE LINE OF g_it_show,
          l_row      TYPE string,
          l_field    TYPE string.


    l_row      = es_row_no-row_id.               "选中行
    l_field    = e_column_id.                    "选中的字段

    READ TABLE g_it_show INTO l_wa_click INDEX es_row_no-row_id.

    IF sy-subrc = 0.
      "得到所单击值
      CONCATENATE '您选中第' l_row  '行,字段为:' l_field  ',选中值为' l_wa_click-carrid INTO l_msg.
      MESSAGE l_msg TYPE 'I'.
    ENDIF.
  ENDMETHOD.                    "handle_cell_click


  METHOD handle_double_click.
    "获取单击字段
    DATA: l_msg      TYPE string,
          l_wa_click LIKE LINE OF g_it_show,
          l_row      TYPE string,
          l_field    TYPE string.

    l_field      = e_column-fieldname.               "选中行
    l_row        = es_row_no-row_id.                 "选中的字段

    READ TABLE g_it_show INTO l_wa_click INDEX es_row_no-row_id .

    IF sy-subrc = 0.
      "得到所单击值
      CONCATENATE '您选中第' l_row  '行,字段为:' l_field  ',选中值为:'  INTO l_msg.

      CASE l_field.
        WHEN 'CONNID'.
          CONCATENATE l_msg l_wa_click-connid INTO l_msg.
          MESSAGE l_msg TYPE 'I'.
        WHEN 'FLDATE'.
          CONCATENATE l_msg l_wa_click-fldate INTO l_msg.
          MESSAGE l_msg TYPE 'I'.
      ENDCASE.

    ENDIF.
  ENDMETHOD.                    "handle_DOUBLE_CLICK

  METHOD handle_onf1.


  ENDMETHOD.                    "handle_ONF1

*&---------------------------------------------------------------------------&*
*&                                                                            *
*&      HANDLE_USER_COMMAND                                                   *
*&---------------------------------------------------------------------------&*
  METHOD handle_user_command.

    REFRESH:lt_cols,  lt_rows.

    CALL METHOD g_alv_grid->get_selected_rows
      IMPORTING
        et_index_rows = lt_rows.

    CALL METHOD g_alv_grid->get_selected_columns
      IMPORTING
        et_index_columns = lt_cols.
    CALL METHOD cl_gui_cfw=>flush.


    CASE  e_ucomm.
      WHEN 'SEL_ALL'.
        LOOP AT g_it_show INTO g_wa_show.
          g_wa_show-checkbox = 'X'.
          MODIFY g_it_show  FROM g_wa_show.
        ENDLOOP.
      WHEN 'CAN_ALL'.
        LOOP AT g_it_show INTO g_wa_show.
          g_wa_show-checkbox = ' '.
          MODIFY g_it_show  FROM g_wa_show.
        ENDLOOP.

      WHEN 'DELETE'.
        LOOP AT g_it_show INTO g_wa_show WHERE checkbox IS NOT INITIAL.
          DELETE TABLE g_it_show FROM g_wa_show.
        ENDLOOP.
      WHEN OTHERS.
    ENDCASE.


    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.
  ENDMETHOD.                    "HANDLE_USER_COMMAND
ENDCLASS. "ALV_EVENT_RECEIVER



关于删除标准按钮,我也debug的

OO <wbr>ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)

​​

OO <wbr>ALV常用功能完整简例(热键单击,双击,帮助,编辑,自定义工具条等)

然后可以根据功能码或者quickinfo删除






标签:OO,单击,wa,cl,简例,gui,grid,alv,toolbar
From: https://blog.51cto.com/u_15680210/5751446

相关文章