我试图提供一个只有少数人可以看到的一块选择屏幕的访问权限。对于其他 SAP 用户,它应该是不可见的,但我犯了一些错误。
我想隐藏的块的声明:
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-004.
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,
ls_user TYPE sy-uname.
lt_authorized_users = VALUE #( ( 'USER 1' )
( 'USER 2' ).
LOOP AT lt_authorized_users INTO ls_user.
ENDLOOP.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'BLK'.
IF sy-uname = ls_user.
screen-active = 1.
ELSE.
screen-active = 0.
ENDIF.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
LOOP AT SCREEN
在AT SELECTION-SCREEN OUTPUT
中,您走在正确的轨道上。但是要使 IF screen-group1 = 'BLK'
起作用,您实际上必须说明选择屏幕的哪些部分是哪个块的一部分。您可以使用适用于大多数选择屏幕元素的附加 MODIF ID id
来做到这一点:
SELECTION-SCREEN PUSHBUTTON 3(45) TEXT-ba5 USER-COMMAND x MODIF ID blk.
另请注意,将“活动”设置为 0 不会使对象不可见。这让他们不活跃。这意味着它们仍然存在,但无法与之交互。如果你想让它们完全消失,你需要使用
screen-invisible = 1.
然后你的代码中还有另一个问题,这不是一个真正的技术问题,而是一个非常糟糕的做法:构建你自己的授权系统! SAP 已经有一个授权系统。它围绕 tcode
PFCG
中定义的角色构建,其中包含对 tcode SU21
中定义的授权对象的授权,并分配给具有 tcode SU01
的用户。您可以检查用户是否有权使用 ABAP 指令执行某些操作AUTHORITY-CHECK
。无论何时处理用户授权,都应该在这个系统上构建。自己的授权系统是维护、管理和合规性的噩梦。只有当你有一个真的很好的理由时才建造它们。
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-004.
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN PUSHBUTTON 3(45) TEXT-ba5 USER-COMMAND x MODIF ID blk.
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN PUSHBUTTON 3(45) TEXT-bb3 USER-COMMAND y MODIF ID blk.
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN END OF BLOCK b3.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'BLK'.
AUTHORITY-CHECK OBJECT Z_SEEBUTTONS
ID ACTVT = '03'
IF sy-subrc <> 0.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
您可能想知道
BLOCK
和 SKIP
是什么意思。他们不需要修改器 ID 吗?不,他们没有。他们不能有一个。但他们也不需要一个,因为当一个块不包含可见元素时,整个块就会消失而不占用选择屏幕上的任何空间。