ALV 动态批量修改列信息


前言

因为看小飞猪猪猪猪猪猪猪_开发知识点,ALV知识点,SAP增强-CSDN博客博主的一篇批量修改列信息的博客,感觉很实用,因为以往的方法确实是画一个屏幕来进行输入批量修改的列,并且不能动态修改多列,项目也出现了这种需求,效果如下所示:

可以批量修改多列信息!

选中一列效果:

选中多列效果:

一、相关函数

POPUP_GET_VALUES

二、相关类

cl_gui_alv_grid->get_selected_columns  获取ALV选中列信息

三、代码如下

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_001
*& 程序描述:ALV批量修改列的数据
*& 创 建 者:JIANGYH
*& 创建日期:2023/11/22
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*
REPORT ytest_001.

*&---------------------------------------------------------------------*
* TYPES
*&---------------------------------------------------------------------*
TABLES:sflight.
TYPES:
  BEGIN OF ty_alv,
    carrid     TYPE sflight-carrid,     " 航线代码
    fldate     TYPE sflight-fldate,     " 航班日期
    price      TYPE sflight-price,      " 航空运费
    planetype  TYPE sflight-planetype,  " 飞机类型
    paymentsum TYPE sflight-paymentsum, " 当前预定总数
  END OF ty_alv,
  tt_alv TYPE STANDARD TABLE OF ty_alv.

*&---------------------------------------------------------------------*
* CONSTANTS
*&---------------------------------------------------------------------*
CONSTANTS:
  BEGIN OF c_fcat,
    name01 TYPE fieldname VALUE 'CARRID     ',text01 TYPE fieldtext VALUE '航线代码',
    name02 TYPE fieldname VALUE 'FLDATE     ',text02 TYPE fieldtext VALUE '航班日期',
    name03 TYPE fieldname VALUE 'PRICE      ',text03 TYPE fieldtext VALUE '航空运费',
    name04 TYPE fieldname VALUE 'PLANETYPE  ',text04 TYPE fieldtext VALUE '飞机类型',
    name05 TYPE fieldname VALUE 'PAYMENTSUM ',text05 TYPE fieldtext VALUE '当前预定总数',
  END OF c_fcat.

*&---------------------------------------------------------------------*
* DEFIEN ALV
*&---------------------------------------------------------------------*
DATA:go_container TYPE REF TO cl_gui_docking_container,
     go_grid      TYPE REF TO cl_gui_alv_grid,
     gt_exclude   TYPE ui_functions,
     gt_fieldcat  TYPE lvc_t_fcat,
     gs_layout    TYPE lvc_s_layo,
     gs_variant   TYPE disvariant,
     gv_save,
     ok_code      TYPE sy-ucomm,
     save_code    TYPE sy-ucomm.

*&---------------------------------------------------------------------*
* GLOBAL INTERNAL TABLES
*&---------------------------------------------------------------------*
DATA:
  gt_out TYPE tt_alv.

*&---------------------------------------------------------------------*
* GLOBAL MACROS
*&---------------------------------------------------------------------*
DEFINE macro_fcat.
  ls_fieldcat-fieldname = &1.
  ls_fieldcat-reptext   = &2.
  ls_fieldcat-edit      = &3.
  APPEND ls_fieldcat TO ct_fieldcat.
  CLEAR ls_fieldcat.
END-OF-DEFINITION.

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_HANDLER DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_event_handler 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.
ENDCLASS.
*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_HANDLER IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
*--增加自定义按钮
  METHOD handle_toolbar.
    PERFORM frm_handle_toolbar USING e_object e_interactive.
  ENDMETHOD.
*--按钮触发事件
  METHOD handle_user_command.
    PERFORM frm_user_command USING e_ucomm.
  ENDMETHOD.
ENDCLASS.

*&---------------------------------------------------------------------*
* SELECTION-SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
  s_carrid FOR sflight-carrid.
SELECTION-SCREEN END OF BLOCK b01.

*&----------------------------------------------------------------------
*& INITIALIZATION.
*&----------------------------------------------------------------------
INITIALIZATION.
* 初始化
  PERFORM frm_initial_data.

*&----------------------------------------------------------------------
*& AT SELECTION-SCREEN OUTPUT
*&----------------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.

*&----------------------------------------------------------------------
*& AT SELECTION-SCREEN
*&----------------------------------------------------------------------
AT SELECTION-SCREEN.

*&----------------------------------------------------------------------
*& START-OF-SELECTION
*&----------------------------------------------------------------------
START-OF-SELECTION.
* 数据处理
  PERFORM frm_get_data.
  PERFORM frm_show_alv.

*&---------------------------------------------------------------------*
*& Form FRM_INITIAL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_initial_data .
  CLEAR gt_out.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data.

  DATA:ls_stylelin TYPE lvc_s_styl.

  SELECT
    carrid,
    fldate,
    price,
    planetype,
    paymentsum
    FROM sflight
    WHERE carrid IN @s_carrid
    INTO CORRESPONDING FIELDS OF TABLE @gt_out
    UP TO 20 ROWS.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_show_alv .

  CALL SCREEN 9000.

ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.

  DATA:lv_title TYPE string.
  CLEAR lv_title.

  lv_title = 'ALV批量修改列的数据'.

  SET PF-STATUS '9000'.               " 定义gui状态
  SET TITLEBAR '9000'  WITH lv_title. " 定义gui标题

ENDMODULE.
*&---------------------------------------------------------------------*
*& Module ALV_DES OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE alv_des OUTPUT.

  DATA:lt_sort TYPE lvc_t_sort.

  IF go_grid IS INITIAL .
    CREATE OBJECT go_container
      EXPORTING
        repid     = sy-repid
        dynnr     = '9000'
        extension = 2050
        side      = cl_gui_docking_container=>property_floating.
    CREATE OBJECT go_grid
      EXPORTING
        i_parent = go_container.

*   获取字段目录
    PERFORM prepare_field_catalog CHANGING gt_fieldcat .

*   获取样式
    PERFORM prepare_layout CHANGING gs_layout .

    "取消没用的按钮
    PERFORM exclude_tb_functions CHANGING gt_exclude.

*   响应事件
    PERFORM eventload.

*   锚定ALV变式标记
    CLEAR gs_variant.
    gs_variant = sy-repid.
    gv_save = 'A'.
    gs_variant-report = |{ sy-repid }{ sy-dynnr }|.

*-----显示ALV-------------------------------------------
    PERFORM frm_alv_display USING gt_out.
  ELSE .
*----------------------------刷新ALV----------------------
    " 刷新ALV
    PERFORM frm_refresh_alv.
  ENDIF .
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Form  PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PS_LAYOUT  text
*----------------------------------------------------------------------*
FORM prepare_layout
  CHANGING ps_layout TYPE lvc_s_layo.
  ps_layout-cwidth_opt      = 'X'.               " 优化行宽度
  ps_layout-zebra           = 'X'.               " 斑马纹
  ps_layout-sel_mode        = 'D'.               " 选择方式
  ps_layout-box_fname       = 'SEL'.             " 指定行选择字段

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GT_OUT
*&---------------------------------------------------------------------*
FORM frm_alv_display
  USING pt_table.

  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      is_layout            = gs_layout
      it_toolbar_excluding = gt_exclude
      is_variant           = gs_variant
      i_save               = gv_save
    CHANGING
      it_outtab            = pt_table
      it_fieldcatalog      = gt_fieldcat.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_refresh_alv .

  DATA:ls_stable TYPE lvc_s_stbl.
  "刷新ALV
  ls_stable-row = 'X'.
  ls_stable-col = 'X'.
  CALL METHOD go_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stable.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  save_code = ok_code.
  CLEAR ok_code.
  CASE save_code.
*   定义返回按钮
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT' OR 'EXIT2'.
      LEAVE PROGRAM.
    WHEN 'SAVE'.
    WHEN OTHERS.
      CALL METHOD go_grid->set_function_code
        CHANGING
          c_ucomm = save_code.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_FIELDCAT
*&---------------------------------------------------------------------*
FORM prepare_field_catalog
  CHANGING ct_fieldcat TYPE lvc_t_fcat.
  DATA:
    ls_fieldcat TYPE lvc_s_fcat.
  macro_fcat:
    c_fcat-name01 c_fcat-text01 abap_false,
    c_fcat-name03 c_fcat-text03 abap_false,
    c_fcat-name05 c_fcat-text05 abap_false,
    c_fcat-name04 c_fcat-text04 abap_true,
    c_fcat-name02 c_fcat-text02 abap_true.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  exclude_tb_functions
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_EXCLUDE text
*----------------------------------------------------------------------*
FORM exclude_tb_functions
  CHANGING pt_exclude TYPE ui_functions .
  DATA ls_exclude TYPE ui_func.
  ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row .
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo .
  APPEND ls_exclude TO pt_exclude.

ENDFORM .
*&---------------------------------------------------------------------*
*& Form EVENTLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM eventload .
  DATA: gr_event_handler TYPE REF TO lcl_event_handler .  "事件响应
  CREATE OBJECT gr_event_handler.
  SET HANDLER gr_event_handler->handle_toolbar      FOR go_grid .
  SET HANDLER gr_event_handler->handle_user_command FOR go_grid.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_OBJECT
*&      --> E_INTERACTIVE
*&---------------------------------------------------------------------*
FORM frm_handle_toolbar
  USING p_object TYPE REF TO cl_alv_event_toolbar_set
        p_interactive.
  DATA: ls_toolbar TYPE stb_button.

* 增加按钮
  APPEND VALUE #( function = 'ZBUT01' icon = icon_create_text butn_type = '0' text = '批量修改列数据' ) TO p_object->mt_toolbar.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_UCOMM
*&---------------------------------------------------------------------*
FORM frm_user_command
  USING p_ucomm.

  CASE p_ucomm.
    WHEN 'ZBUT01'.
      PERFORM frm_buten_data.
    WHEN OTHERS.
  ENDCASE.

* 重新回写自适应宽度
  gs_layout-cwidth_opt = 'X'.
* 回写ALV变化过后的布局参数
  CALL METHOD go_grid->set_frontend_layout
    EXPORTING
      is_layout = gs_layout.
* 刷新ALV
  PERFORM frm_refresh_alv.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BUTEN_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_buten_data .

  DATA: lt_fields TYPE TABLE OF sval,
        lv_rtn_cd.

  DATA:lt_col_no TYPE lvc_t_col.

  FIELD-SYMBOLS <fs_value>.

  CLEAR lt_col_no.
* 获取选择列数据
  CALL METHOD go_grid->get_selected_columns
    IMPORTING
      et_index_columns = lt_col_no.

  IF lt_col_no IS NOT INITIAL.
    LOOP AT lt_col_no ASSIGNING FIELD-SYMBOL(<fs_col>) WHERE fieldname = 'PLANETYPE'
                                                          OR fieldname = 'FLDATE'.
      APPEND INITIAL LINE TO lt_fields ASSIGNING FIELD-SYMBOL(<fs_fields>).
      <fs_fields>-tabname   = 'SFLIGHT'.
      <fs_fields>-fieldname = <fs_col>-fieldname.
    ENDLOOP.
  ELSE.
    MESSAGE e001(00) WITH '请选择要操作的列!'.
  ENDIF.

  IF lt_fields IS INITIAL.
    MESSAGE e001(00) WITH '请选择正确的列信息!'.
  ENDIF.

* 弹出窗口
  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = '批量修改列数据'
    TABLES
      fields          = lt_fields
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

* 数据处理
  LOOP AT lt_fields ASSIGNING <fs_fields>.
    LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
      ASSIGN COMPONENT <fs_fields>-fieldname OF STRUCTURE <fs_out> TO <fs_value>.
      <fs_value> = <fs_fields>-value.
    ENDLOOP.
  ENDLOOP.

ENDFORM.

总结

用起来很方便,很简洁,希望能帮助需要的人!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值