批量修改角色权限字段值

文摘   2024-10-29 08:18   北京  

01

前言

角色权限字段值批量修改,通常在项目推广运维中会经常碰到,本文将介绍两种方式,一种前台操作方法,另一种是ABAP代码实现方式,希望能帮助到有需要的朋友。


02

前台操作

1. SAP提供了一个还不错的事务代码 :PFCGMASSVAL   ( 权限值的批量维护 )


2.执行TCODE界面如下


3.使用方法介绍

  • 角色:填入角色名,可多选输入

  • 模拟/直接执行:建议先模拟,查看输出界面确认无误后,再选执行

  • 更改组织级别:PFCG中的组织级别的权限字段(如公司代码,工厂等,通常字段名前面有$符号

  • 更改对象权限字段值:更改非组织级别权限字段,选择屏幕需入某个具体权限对象

  • 更改字段权限的字段值(跨对象):更改非组织级别权限字段,选择屏幕不需要输入具体权限对象,只需要输入某个具体权限字段

  • 对象添加手动权限:为角色添加一个新的权限对象


4.使用方法实例

  1.  下图所示为给Z_BR_ADMINISTRATOR角色的BEH_SUBSCR权限对象的ACTVT字段增加删除权限。

b. 执行后进入到如下界面

    从值比较的图标可以看出是ACTVT增加了一个06字段值

c. 确认无误后,返回,由模拟改为直接执行

d.最后一步点击生成参数文件。

  

03

ABAP代码实现

PFCGMASSVAL这个TCODE里面用的操作,涉及到两个非常重要的类CL_PFCG_ROLE_FACTORYCL_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.    "PFCG 角色名称    ls_role-role = '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. ls_auth_values-field = 'ACTVT'. ls_auth_values-low = '06'. ls_auth_values-change_mode = '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

结语

文末打个广告:有伙伴有项目合作需求可以私信联系,公司形式完整项目或者个人形式远程人天皆可。


 

END

 

温馨提示

如果你喜欢本文,请分享给有需要的朋友,想要获得更多信息,请关注我,若有问题以及建议,请在文末留言或者私信。





 

 

扫码关注我们

以便获取最新更新内容


 

码农干货铺
永远要保持一种无论何时何地都逼着自己更努力更优秀来享受更好生活的学习状态
 最新文章