ABAP - Function ALV 05 添加选择框列、全选、取消全选

本文详细介绍了如何在ABAP开发中使用Fieldcat参数控制来实现自定义选择框,并处理GUI状态,包括配置全选和全选全选按钮,以及在ALV表格中添加自定义按钮并同步数据操作。
摘要由CSDN通过智能技术生成
  • 很多用户不习惯原生GRID的选择模式,所以业务需要用到自定义的选择框来进行数据的操作,显示效果如图所示,增加一条选择列,且配置全选和全选全选的按钮功能,如下图所示。

  • 实现这种功能需要用到Fieldcat的参数控制以及GUI状态的配置和处理 
  • 1.Fieldcat参数控制,将改成设置成选择框的样式,且该列可以被编辑
** Fieldcat 变量定义
DATA:gt_fieldcat TYPE lvc_t_fcat,
     gs_fieldcat LIKE LINE OF gt_fieldcat.

** FieldCat的宏
DATA gv_pos TYPE i.

DEFINE %%add_fieldcat.
  gv_pos = gv_pos + 1.
  gs_fieldcat-col_pos = gv_pos.
  gs_fieldcat-fieldname = &1.
  gs_fieldcat-scrtext_m = &2.

  CASE &1.        "根据fieldname字段给结构做赋值控制
    WHEN 'SEL'.
      gs_fieldcat-checkbox = 'X'. "该列选择框显示
      gs_fieldcat-edit     = 'X'. "该列可以编辑
  ENDCASE.

  APPEND gs_fieldcat TO gt_fieldcat.CLEAR gs_fieldcat.
END-OF-DEFINITION.

** Fieldcat字段映射处理
  %%add_fieldcat:'EBELN'    '采购单号',  "( 前面字段值不可变 后面字段描述可变 每一行都是)
                 'EBELP'    '采购订单行号',
                 'SEL'      '选择'.
FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.

"应用方法将修改ALV的数据保存到内表中
  DATA lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA l_tabix LIKE sy-tabix.  "系统参数   行号

"此处代码将用户输入读入内表(这一步不可少)
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "自动刷新数据
    IMPORTING
      e_grid = lr_grid.

  CALL METHOD lr_grid->check_changed_data.
  rs_selfield-refresh = 'X'.   "此处代码阻止'REUSE_ALV_GRID_DISPLAY创建新的屏幕,造成屏幕多层
  rs_selfield-row_stable = 'X'. "保证行、列位置在自动刷新时不变
  rs_selfield-col_stable = 'X'.

  CASE r_ucomm.
    WHEN 'ALL'.
      LOOP AT gt_data INTO gw_data.
        gw_data-sel = 'X'.
        MODIFY gt_data FROM gw_data.
      ENDLOOP.

    WHEN 'SAL'.
      LOOP AT gt_data INTO gw_data.
        gw_data-sel = ''.
        MODIFY gt_data FROM gw_data.
      ENDLOOP.
  ENDCASE.

ENDFORM.


  • 完整代码
TYPES:BEGIN OF ty_data,
       sel TYPE char1,
       ebeln TYPE ekpo-ebeln,
       ebelp TYPE ekpo-ebelp,
       END OF ty_data.

DATA gt_data TYPE TABLE OF ty_data.
DATA gw_data TYPE ty_data.

** Layout  变量定义
DATA gs_layout   TYPE lvc_s_layo.

** Fieldcat 变量定义
DATA:gt_fieldcat TYPE lvc_t_fcat,
     gs_fieldcat LIKE LINE OF gt_fieldcat.

** FieldCat的宏
DATA gv_pos TYPE i.

DEFINE %%add_fieldcat.
  gv_pos = gv_pos + 1.
  gs_fieldcat-col_pos = gv_pos.
  gs_fieldcat-fieldname = &1.
  gs_fieldcat-scrtext_m = &2.

  CASE &1.
    WHEN 'SEL'.
      gs_fieldcat-checkbox = 'X'. "当做选择框显示
      gs_fieldcat-edit     = 'X'. "该字段可以编辑
  ENDCASE.

  APPEND gs_fieldcat TO gt_fieldcat.CLEAR gs_fieldcat.
END-OF-DEFINITION.

START-OF-SELECTION.

SELECT ekpo~ebeln  "采购订单抬头数据- 采购单号
       ekpo~ebelp  "采购订单明细数据- 采购订单行号
  INTO CORRESPONDING FIELDS OF TABLE gt_data
  FROM ekpo
  UP TO 20 ROWS.

** Fieldcat字段映射处理
  %%add_fieldcat:'EBELN'    '采购单号',  "( 前面字段值不可变 后面字段描述可变 每一行都是)
                 'EBELP'    '采购订单行号',
                 'SEL'      '选择'.

** Layout布局处理
  gs_layout-cwidth_opt = 'X'.     "自动优化列宽 (可以使用**在一行代码面前注释掉 看看ALV会有什么效果)
  gs_layout-zebra = 'X'.          "斑马纹输出

** 调用FunctionALV需要传入的参数:展示数据,FieldCat,Layout,Status
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program        = sy-repid
      i_callback_pf_status_set  = 'FRM_SET_STATUS'
      i_callback_user_command   = 'FRM_USER_COMMAND'
      is_layout_lvc             = gs_layout
      it_fieldcat_lvc           = gt_fieldcat
    TABLES
      t_outtab                 = gt_data[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

FORM frm_set_status USING p_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD'.
ENDFORM.


FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.

"应用方法将修改ALV的数据保存到内表中
  DATA lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA l_tabix LIKE sy-tabix.  "系统参数   行号

"此处代码将用户输入读入内表(这一步不可少)
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "自动刷新数据
    IMPORTING
      e_grid = lr_grid.

  CALL METHOD lr_grid->check_changed_data.
  rs_selfield-refresh = 'X'.   "此处代码阻止'REUSE_ALV_GRID_DISPLAY创建新的屏幕,造成屏幕多层
  rs_selfield-row_stable = 'X'. "保证行、列位置在自动刷新时不变
  rs_selfield-col_stable = 'X'.

  CASE r_ucomm.
    WHEN 'ALL'.
      LOOP AT gt_data INTO gw_data.
        gw_data-sel = 'X'.
        MODIFY gt_data FROM gw_data.
      ENDLOOP.

    WHEN 'SAL'.
      LOOP AT gt_data INTO gw_data.
        gw_data-sel = ''.
        MODIFY gt_data FROM gw_data.
      ENDLOOP.
  ENDCASE.

ENDFORM.

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP FUNCTION ALV添加状态栏下拉框按钮,可以使用函数模块 `REUSE_ALV_HIERSEQ_LIST_DISPLAY`。该函数模块可以在状态栏中添加下拉框按钮,用于切换不同的层次结构。 以下是添加下拉框按钮的代码示例: ``` REPORT ztest. DATA: it_list TYPE STANDARD TABLE OF sflight, wa_list TYPE sflight. DATA: it_fieldcat TYPE slis_t_fieldcat_alv. FIELD-SYMBOLS: <fs_fieldcat> TYPE slis_fieldcat_alv. * 初始化 ALV 数据 SELECT * FROM sflight INTO TABLE it_list. * 初始化字段目录 CLEAR: it_fieldcat. wa_fieldcat-fieldname = 'CARRID'. wa_fieldcat-ref_table = 'SCARR'. wa_fieldcat-ref_field = 'CARRID'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'CONNID'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'FLDATE'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'SEATSMAX'. APPEND wa_fieldcat TO it_fieldcat. wa_fieldcat-fieldname = 'SEATSOCC'. APPEND wa_fieldcat TO it_fieldcat. CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'PF_STATUS' is_layout = VALUE #( ( hierarchy_seq = 'CARRID' ) ) TABLES t_fieldcat = it_fieldcat t_outtab = it_list. * 定义层次结构下拉框的值集合 DATA: it_hier TYPE STANDARD TABLE OF lvc_s_layo WITH HEADER LINE. it_hier-fieldname = 'HIERARCHY_SEQ'. it_hier-seltext_l = '层次结构'. it_hier-selopt = 'O'. it_hier-no_out = 'X'. APPEND it_hier. it_hier-fieldname = 'CARRID'. it_hier-seltext_l = '按航空公司'. it_hier-selopt = 'C'. it_hier-no_out = ' '. APPEND it_hier. it_hier-fieldname = 'FLDATE'. it_hier-seltext_l = '按航班日期'. it_hier-selopt = 'D'. it_hier-no_out = ' '. APPEND it_hier. it_hier-fieldname = 'SEATSMAX'. it_hier-seltext_l = '按最大座位数'. it_hier-selopt = 'S'. it_hier-no_out = ' '. APPEND it_hier. it_hier-fieldname = 'SEATSOCC'. it_hier-seltext_l = '按已占用座位数'. it_hier-selopt = 'O'. it_hier-no_out = ' '. APPEND it_hier. * 设置层次结构下拉框 SET PF-STATUS 'PF_STATUS' EXCLUDING it_hier. * PF-STATUS 事件处理程序 MODULE pf_status OUTPUT. SET PF-STATUS 'PF_STATUS'. SET TITLEBAR 'TITLE'. ENDMODULE. * AT SELECTION-SCREEN 事件处理程序 AT SELECTION-SCREEN ON HIERARCHY_SEQ. LOOP AT it_hier ASSIGNING FIELD-SYMBOL(<fs_hier>). IF <fs_hier>-fieldname = 'HIERARCHY_SEQ'. CONTINUE. ENDIF. IF <fs_hier>-selopt = 'X'. CLEAR: it_list. SELECT * FROM sflight INTO TABLE it_list ORDER BY carrid. ELSE. CLEAR: it_list. SELECT * FROM sflight INTO TABLE it_list ORDER BY ( <fs_hier>-fieldname ). ENDIF. CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'PF_STATUS' is_layout = VALUE #( ( hierarchy_seq = <fs_hier>-fieldname ) ) TABLES t_fieldcat = it_fieldcat t_hierarchy = it_list. ENDLOOP. ``` 在代码中,使用了 `REUSE_ALV_HIERSEQ_LIST_DISPLAY` 函数模块来显示 ALV 报表,并在 `is_layout` 参数中指定默认的层次结构。在 `pf_status` 事件处理程序中设置状态栏的标题,并在 `AT SELECTION-SCREEN` 事件处理程序中根据用户选择的层次结构重新查询数据并刷新 ALV 报表。 通过在 `it_hier` 中定义层次结构下拉框的值集合,并在 `SET PF-STATUS` 语句中排除该值集合,即可在状态栏中添加下拉框按钮。在 `AT SELECTION-SCREEN` 事件处理程序中,根据用户选择的层次结构重新查询数据,并使用 `REUSE_ALV_HIERSEQ_LIST_DISPLAY` 函数模块刷新 ALV 报表显示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值