加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OOALV用户过滤数据后点全选全部取消选择的处理方法

(2020-04-05 13:50:48)
标签:

abap

alv

bapi

sap

oo

杂谈

分类: ALV

有人留言,想要个过滤器的demo,就应读者要求,发篇简单的:


我也偷懒直接找个已有的程序修改的。


效果如下(有点丑~):

执行:



OOALV用户过滤数据后点全选全部取消选择的处理方法

OOALV用户过滤数据后点全选全部取消选择的处理方法

OOALV用户过滤数据后点全选全部取消选择的处理方法

OOALV用户过滤数据后点全选全部取消选择的处理方法

OOALV用户过滤数据后点全选全部取消选择的处理方法

下面是代码:

首先建了个屏幕:空屏幕

OOALV用户过滤数据后点全选全部取消选择的处理方法

OOALV用户过滤数据后点全选全部取消选择的处理方法

OOALV用户过滤数据后点全选全部取消选择的处理方法


在PBO里 设置状态栏,然后加个ALV展示:

MODULE mdl_alv_show OUTPUT.
  SET PF-STATUS 'TEST_STATUS'.
SET TITLEBAR 'xxx'.

  PERFORM zform_alv_show.
ENDMODULE. 



剩下的代码都在一起:

*&---------------------------------------------------------------------*
*& Report ZLM_ALV001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zlm_alv001.



*&---------------------------------------------------------------
*&  全局变量
*&---------------------------------------------------------------
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.

*&---------------------------------------------------------------
*&  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   "显示数据列内表

*----------------------------------------------------------------
   事件的定义   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.

      ENDIF.
    ENDLOOP.




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

    CLEAR ls_toolbar.
    MOVE            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             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.

    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.

*&Start by liumeng    r
    DATA: lv_cont  TYPE i,
          lv_tabix TYPE sy-tabix.

    DATA: lt_filtered        TYPE lvc_t_fidx.
*&End :liumeng  

    DATA: lt_rows  TYPE lvc_t_row.
    DATA: lt_cols  TYPE lvc_t_col.

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


        CALL METHOD g_alv_grid->get_filtered_entries
          IMPORTING
            et_filtered_entries lt_filtered.

        LOOP AT g_it_show INTO g_wa_show.
          lv_tabix sy-tabix.
          READ TABLE lt_filtered WITH KEY table_line lv_tabix TRANSPORTING NO FIELDS.
          IF sy-subrc NE 0.
            g_wa_show-checkbox 'X'.
            MODIFY g_it_show FROM g_wa_show INDEX lv_tabix.
          ENDIF.
        ENDLOOP.


      WHEN 'CAN_ALL'.

        CALL METHOD g_alv_grid->get_filtered_entries
          IMPORTING
            et_filtered_entries lt_filtered.

        LOOP AT g_it_show INTO g_wa_show.
          lv_tabix sy-tabix.
          READ TABLE lt_filtered WITH KEY table_line lv_tabix TRANSPORTING NO FIELDS.
          IF sy-subrc NE 0.
            g_wa_show-checkbox '.
            MODIFY g_it_show FROM g_wa_show INDEX lv_tabix.
          ENDIF.
        ENDLOOP.
*&End :liumeng  

      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



DATA: g_event              TYPE REF TO alv_event_receiver.



START-OF-SELECTION.
  SELECT carrid
         connid
         fldate
         price
    FROM sflight INTO CORRESPONDING FIELDS OF  TABLE g_it_show .

  CALL SCREEN 9001.




  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 .
  mac_fieldlog 'CHECKBOX' '选择'         ''         .
  mac_fieldlog 'CARRID'   '航线承运人'   ''    'SFLIGHT' 'CARRID'.
  mac_fieldlog 'CONNID'   '航班数量'     ''    'SFLIGHT' 'CONNID' .
  mac_fieldlog 'FLDATE'   '国家'         ''    'SFLIGHT' 'FLDATE '.  "最后两个字段 参考表内字段,可以作为帮助
  mac_fieldlog 'PRICE'    '起飞城市'     ''    'SFLIGHT' 'PRICE'  .
ENDFORM. FRM_BUILD_FIELDCAT


FORM 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.
    "数据修改事件
    SET 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






*&---------------------------------------------------------------------*
*& Module MDL_ALV_SHOW OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE mdl_alv_show OUTPUT.
  SET PF-STATUS 'TEST_STATUS'.
SET TITLEBAR 'xxx'.

  PERFORM zform_alv_show.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  MDL_EXIT  INPUT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
MODULE mdl_exit INPUT.
  LEAVE PROGRAM.
ENDMODULE. 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有