如何仅向特定用户显示SAP选择屏幕指定块?现有代码存在问题
SAP选择屏幕块权限控制问题排查与修复
原代码错误点
- 内表初始化语法错误:
VALUE #( ... )缺少闭合括号,导致编译报错 - 无效循环:遍历授权用户列表但未执行任何逻辑,最终
ls_user仅保留最后一个用户,导致只有该用户能看到块 - 选择屏幕块未绑定屏幕组:原块声明未指定
GROUP1 BLK,后续screen-group1 = 'BLK'的判断永远不成立,无法控制块的显示/隐藏 - 用户判断逻辑错误:直接用当前用户等于
ls_user(仅最后一个授权用户),无法覆盖所有授权用户
修正后的完整代码
选择屏幕块声明(添加屏幕组)
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-004 GROUP1 BLK. SELECTION-SCREEN SKIP 2. SELECTION-SCREEN PUSHBUTTON 3(45) TEXT-ba5 USER-COMMAND x. SELECTION-SCREEN SKIP 2. SELECTION-SCREEN PUSHBUTTON 3(45) TEXT-bb3 USER-COMMAND y. SELECTION-SCREEN SKIP 2. SELECTION-SCREEN END OF BLOCK b3.
权限控制逻辑
DATA: lt_authorized_users TYPE STANDARD TABLE OF sy-uname, lv_is_authorized TYPE abap_bool. * 初始化授权用户列表(修正语法错误) lt_authorized_users = VALUE #( ( 'USER1' ) ( 'USER2' ) ). AT SELECTION-SCREEN OUTPUT. * 判断当前用户是否在授权列表中 lv_is_authorized = abap_false. IF lt_authorized_users IS NOT INITIAL. READ TABLE lt_authorized_users TRANSPORTING NO FIELDS WITH KEY table_line = sy-uname. IF sy-subrc = 0. lv_is_authorized = abap_true. ENDIF. ENDIF. * 控制屏幕块显示/隐藏 LOOP AT SCREEN. IF screen-group1 = 'BLK'. screen-active = COND #( WHEN lv_is_authorized = abap_true THEN 1 ELSE 0 ). MODIFY SCREEN. ENDIF. ENDLOOP.
代码说明
- 屏幕组绑定:给块
b3添加GROUP1 BLK,确保后续能通过screen-group1定位到该块的所有元素 - 语法修正:补全内表初始化的闭合括号,消除编译错误
- 高效用户判断:用
READ TABLE替代循环判断,检查当前用户是否在授权列表中,性能更优 - 逻辑简化:用条件表达式
COND直接设置screen-active的值,代码更简洁
内容的提问来源于stack exchange,提问作者user14674462
相关产品推荐
相关产品推荐

