SALV 状态栏按钮隐藏增强

作者:ABAP三叔 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发
SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图

前言

在标准SALV中无法对标准Toolbar按钮或者自定义按钮进行隐藏,如果想要根据不同功能显示不同的按钮,就需要定义不同的GUI状态。

如果想要使用一个GUI状态,然后根据不同的功能需要,隐藏不需要的按钮,这就需要对SALV标准功能进行增强,本文将介绍这种方法。

通用隐藏按钮方法

在标准屏幕中,隐藏按钮的方法是将要排除的按钮功能代码加入到

slis_t_extab内表中,然后再设置 PF- STATUS 的时候进行排除就可以了。

*

SET PF-STATUS 'STANDARD' EXCLUDING lt_exfcode.

在ALV中,也同样是 将要排除的按钮功能代码加入到

slis_t_extab(OOALV中为UI_FUNCTIONS)内表中,然后在显示ALV的时候,将排除的功能内表传入到对应的参数中,如下图所示

SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图

SALV增强

1\. 类CL_S ALV_MODEL_BASE增加属性Z_EXCLUDE_PF,类型为KKBLO_T_EXTAB

SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图

2\. 类CL_SALV_MODEL_BASE的SET_SCREEN_STATUS方法中增加入参EXCLUDING,类型为KKBLO_T_EXTAB

SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图

3\. 类CL_S ALV_MODEL_BASE的 SET_SCREEN_STATUS方法结尾增加隐式增强,添加如下代码

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Class CL_SALV_MODEL_BASE, Method SET_SCREEN_STATUS, End A*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 1 ZSALV_PF_EXCLUDE_02. "active versionif excluding is supplied. me->z_exclude_pf[] = excluding[].endif.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*

4\.

类CL_SALV_FULLSCREEN_ADAPTER的IF_SALV_STATUS_ADAPTER~BUILD_UIFUNCTION方法结尾增加隐式增强,代码如下

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Class CL_SALV_FULLSCREEN_ADAPTER, Interface IF_SALV_STATUS_ADAPTER, Method BUILD_UIFUNCTION, End A*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 1  ZSALV_PF_EXCLUDE_03.    "active versionif lr_model is bound and lr_model->z_exclude_pf[] is not initial. append lines of lr_model->z_exclude_pf to t_extab.endif.ENDENHANCEMENT.*$*$-End: (1)---------------------------------------------------------------------------------$*$*

5\. 注意:2020年之后SALV做了一些修改,需要去 增强类 CL_SALV_GUI_OM_ADPT_FULLSCREEN

的IF_SALV_STATUS_ADAPTER~BUILD_UIFUNCTION方法,SE24中查看,如果有

CL_SALV_GUI_OM_ADPT_FULLSCREEN这个类的,就在这个类里面做增强,代码如下:

data lr_model type ref to CL_SALV_GUI_OM_TABLE_INFO.lr_model ?= me->r_controller->r_model.if lr_model is bound and lr_model->z_exclude_pf[] is not initial. append lines of lr_model->z_exclude_pf to t_extab.endif.

程序中调用

REPORT zyxs_salv04. DATA: gt_sflight TYPE STANDARD TABLE OF sflight.DATA go_salv TYPE REF TO cl_salv_table. SELECT * UP TO 100 ROWS INTO TABLE @gt_sflight FROM sflight.
*Create alv object.TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_salv CHANGING t_table = gt_sflight. CATCH cx_salv_msg.ENDTRY."注释此句看效果go_salv->set_screen_status( pfstatus = 'SALV_TABLE_STANDARD' report = 'SAPLSALV_FUNCTIONS_STATUS' excluding = VALUE #( ( fcode = '&RNT_PREV' ) ( fcode = '%PC' ) ( fcode = '%SL' ) ) ). * 显示SALV所有标准功能.DATA(lo_functions) = go_salv->get_functions( ).lo_functions->set_all( abap_true ). * 获取所有列DATA(lo_columns) = go_salv->get_columns( ).* 设置列宽自适应lo_columns->set_optimize( abap_true ).*设置斑马线DATA(lo_dspset) = go_salv->get_display_settings( ).lo_dspset->set_striped_pattern( abap_true ). DATA: ls_key TYPE salv_s_layout_key.DATA(lo_layout) = go_salv->get_layout( ).ls_key-report = sy-repid.ls_key-handle = '1000'.* 设置默认布局lo_layout->set_key( ls_key ).lo_layout->set_default( abap_true ).* 允许保存布局lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).

• Display alvgo_salv->display( ).

SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图
SALV 状态栏按钮隐藏增强 - 封面图

可以看出来,执行以下语句后,状态栏按钮减少了三个

go_salv->set_screen_status( pfstatus = 'SALV_TABLE_STANDARD' report = 'SAPLSALV_FUNCTIONS_STATUS' excluding = VALUE #( ( fcode = '&RNT_PREV' ) ( fcode = '%PC' ) ( fcode = '%SL' ) ) ).

总结

系统中标准程序达不到自己日常使用需求,或者是使用起来不够便捷时,可以考虑对系统标准功能进行增强,但是一定要慎重,找准方法,增强后要多方测试,保证系统稳健性。

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「SALV状态栏按钮隐藏增强.md」整理生成,仅用于内部技术分享与学习交流。