matinal:SAP 批量修改角色权限字段值

 🚀欢迎来到本文🚀
🍉个人简介:matinal,目前职业是IT行业,一个正在慢慢前行的普通人。
🏀系列专栏:涵盖SAP各模块,Python,Excel,人工智能等
💡 其他专栏:一些平时学习的技术,感兴趣的小伙伴可以看看。

🍔公众号:matinal
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​
⛱️万物从心起,心动则万物动🏄‍♂️


 前言:SAP 批量修改角色权限字段值

🦙(工作遇到傻逼,千万要远离。道路千万条,远离傻逼第一条)


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

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

2.执行TCODE界面如下

3.使用方法介绍

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

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

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

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

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

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

4.使用方法实例

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

 

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

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

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

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

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.

 怎么样,在了解此篇文章有何感想?


如果本文对大家有所帮助的话,还望各位能给我点赞、收藏并评论一下,感谢各位💕!!! 另如果大家有什么疑问或者建议的话,欢迎评论区留言。更多精彩内容->在这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值