You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅向特定用户显示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.

代码说明

  1. 屏幕组绑定:给块b3添加GROUP1 BLK,确保后续能通过screen-group1定位到该块的所有元素
  2. 语法修正:补全内表初始化的闭合括号,消除编译错误
  3. 高效用户判断:用READ TABLE替代循环判断,检查当前用户是否在授权列表中,性能更优
  4. 逻辑简化:用条件表达式COND直接设置screen-active的值,代码更简洁

内容的提问来源于stack exchange,提问作者user14674462

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:15:14