批量修改角色权限字段值

01

前言

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

02

前台操作

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

2.执行TCODE界面如下

15c2bbea102b8ffb5442710f44dbd2f6.png

3.使用方法介绍

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

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

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

d731c44703c70c1d55adabe6a3d03245.png

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

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

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

4.使用方法实例

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

80ed5ba85688fc42f0d8f77b0db4d673.png

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

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

d52f4e2ab44bd5862f93effa34aa590a.png

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

6d53ea61801a77b758bebeb622d934a2.png

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

03

ABAP代码实现

PFCGMASSVAL这个TCODE里面用的操作,涉及到两个非常重要的类CL_PFCG_ROLE_FACTORYCL_PFCG_ROLE

可以在CL_PFCG_ROLE_FACTORY类的局部测试类中找到主要的使用方法。

d759fd0a9d36343e8cc5d4d2682dd9f2.png

以下代码为第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

结语

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

298a7baafb8306aafa3d2bc8b1ab20dd.png

—END—

 2ae19e5792e8c7a22b39ccc430c9bdab.gif

9b9516544618c01a42ca82149df49437.png

温馨提示

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

 4148bd7a6569782c3f5e5382e6523630.jpeg

7cb8a2fd732ef32fca7b3638fc08456f.png

扫码关注我们

以便获取最新更新内容。

3062a00788d07cf68e5d719419351fb6.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值