01
前言
角色权限字段值批量修改,通常在项目推广运维中会经常碰到,本文将介绍两种方式,一种前台操作方法,另一种是ABAP代码实现方式,希望能帮助到有需要的朋友。
02
前台操作
1. SAP提供了一个还不错的事务代码 :PFCGMASSVAL ( 权限值的批量维护 )
2.执行TCODE界面如下
3.使用方法介绍
角色:填入角色名,可多选输入
模拟/直接执行:建议先模拟,查看输出界面确认无误后,再选择执行
更改组织级别:PFCG中的组织级别的权限字段(如公司代码,工厂等,通常字段名前面有$符号
更改对象权限字段值:更改非组织级别权限字段,选择屏幕需入某个具体权限对象
更改字段权限的字段值(跨对象):更改非组织级别权限字段,选择屏幕不需要输入具体权限对象,只需要输入某个具体权限字段
为对象添加手动权限:为角色添加一个新的权限对象
4.使用方法实例
下图所示为给Z_BR_ADMINISTRATOR角色的BEH_SUBSCR权限对象的ACTVT字段增加删除权限。
b. 执行后进入到如下界面
从值比较的图标可以看出是ACTVT增加了一个06字段值
c. 确认无误后,返回,由模拟改为直接执行
d.最后一步点击生成参数文件。
03
ABAP代码实现
PFCGMASSVAL这个TCODE里面用的操作,涉及到两个非常重要的类CL_PFCG_ROLE_FACTORY和CL_PFCG_ROLE。
可以在CL_PFCG_ROLE_FACTORY类的局部测试类中找到主要的使用方法。
以下代码为第2步前台操作的ABAP代码实现方式
DATA: lt_roles TYPE if_pfcg_role=>tt_pfcg_role
ls_role TYPE if_pfcg_role=>ty_pfcg_role
lt_node_root TYPE if_pfcg_role=>node_tt_root
lr_node_root TYPE REF TO if_pfcg_role=>node_st_root
lt_messages TYPE if_spcg_msg_buffer=>tt_messages
ls_auth TYPE if_pfcg_role=>node_st_auth_auths
lt_auth_auths TYPE if_pfcg_role=>node_tt_auth_auths
ls_auth_values TYPE if_pfcg_role=>node_st_auth_values
lt_auth_values TYPE if_pfcg_role=>node_tt_auth_values
ls_timestamp TYPE if_pfcg_role=>ty_timestamp
lv_rejected TYPE abap_bool
lo_msg_buffer TYPE REF TO if_spcg_msg_buffer
lt_org_in TYPE if_pfcg_role=>node_tt_org_values
ls_org TYPE if_pfcg_role=>node_st_org_values
lv_subrc TYPE sy-subrc
.
DATA lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE.
TRY.
角色名称
'Z_BR_ADMINISTRATOR'. =
APPEND ls_role TO lt_roles.
"获取角色对象
CALL METHOD cl_pfcg_role_factory=>retrieve_for_update
EXPORTING
it_pfcg_role = lt_roles
IMPORTING
et_node_root = lt_node_root
eo_msg_buffer = lo_msg_buffer.
CALL METHOD lo_msg_buffer->get_messages
RECEIVING
et_messages = lt_messages.
IF lt_node_root IS INITIAL.
RETURN.
ENDIF.
LOOP AT lt_node_root REFERENCE INTO lr_node_root.
"获取角色下所有权限对象
CALL METHOD lr_node_root->role_ref->if_pfcg_role_authorization~get_auths
IMPORTING
et_auth_auths = lt_auth_auths
eo_msg_buffer = lo_msg_buffer.
"获取单个权限对象
READ TABLE lt_auth_auths INTO ls_auth
WITH KEY object = 'BEH_SUBSCR'.
IF sy-subrc EQ 0.
CLEAR: ls_auth_values.
'ACTVT'. =
'06'. =
'I'. " <--- INSERT =
APPEND ls_auth_values TO lt_auth_values.
"更改权限字段值
CALL METHOD lr_node_root->role_ref->if_pfcg_role_authorization~set_values_for_auth
EXPORTING
is_auth = ls_auth
it_auth_values = lt_auth_values
IMPORTING
eo_msg_buffer = lo_msg_buffer.
CALL METHOD lo_msg_buffer->get_messages
EXPORTING
iv_role = lr_node_root->role
RECEIVING
et_messages = lt_messages.
IF lt_messages IS NOT INITIAL.
lv_rejected = abap_true.
ENDIF.
" 更改组织权限字段值
CLEAR: ls_org.
ls_org-varbl = '$PLVAR'.
ls_org-low = '01'.
ls_org-change_mode = 'I'.
APPEND ls_org TO lt_org_in.
*
CALL METHOD lr_node_root->role_ref->if_pfcg_role_authorization~set_org_values
EXPORTING
it_org_values = lt_org_in
IMPORTING
eo_msg_buffer = lo_msg_buffer.
*
CALL METHOD lo_msg_buffer->get_messages
EXPORTING
iv_role = lr_node_root->role
RECEIVING
et_messages = lt_messages.
IF lt_messages IS NOT INITIAL.
lv_rejected = abap_true.
ENDIF.
ENDIF.
ENDLOOP.
CHECK lv_rejected = abap_false.
-- Check
CALL METHOD cl_pfcg_role_factory=>do_check
IMPORTING
ev_rejected = lv_rejected
eo_msg_buffer = lo_msg_buffer.
CALL METHOD lo_msg_buffer->get_messages
RECEIVING
et_messages = lt_messages.
-- Save
IF lv_rejected EQ abap_false.
CALL METHOD cl_pfcg_role_factory=>do_save
EXPORTING
iv_update_task = abap_false
IMPORTING
ev_rejected = lv_rejected
eo_msg_buffer = lo_msg_buffer
es_timestamp = ls_timestamp.
CALL METHOD lo_msg_buffer->get_messages
RECEIVING
et_messages = lt_messages.
IF lv_rejected EQ abap_false.
COMMIT WORK.
"生成角色参数文件
CALL FUNCTION 'PRGN_GEN_PROFILES_FOR_ROLES'
TABLES
it_roles = lt_roles
et_return = lt_return.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CATCH cx_pfcg_role.
ENDTRY.
04
结语
文末打个广告:有伙伴有项目合作需求可以私信联系,公司形式完整项目或者个人形式远程人天皆可。
温馨提示
如果你喜欢本文,请分享给有需要的朋友,想要获得更多信息,请关注我,若有问题以及建议,请在文末留言或者私信。