Add t-code in menu tab of PFCG with mass roles

https://me.sap.com/notes/0003379327

*&---------------------------------------------------------------------*

*& Report Z_ADD_TCODE_TO_ROLE_MENU

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

report z_add_tcode_to_role.

constants: lc_hex01 type x value '01'. "Area menu

data: role type agr_name.

select-options: selrole for role matchcode object agr_single memory id profile_generator.

parameters: tcode type tstc-tcode.

parameters: test type char01 as checkbox default 'X'.

class lcl_appgroups definition final.

public section.

methods:

start.

private section.

" Roles with app groups

types: begin of ty_s_agr_menu_groups

, agr_name type agr_name

, end of ty_s_agr_menu_groups.

types: ty_t_agr_menu_groups type standard table of ty_s_agr_menu_groups.

" TCodes

types: begin of ty_s_appl

, name type sobj_name

, type type usobtype

, end of ty_s_appl.

types: ty_t_appl type standard table of ty_s_appl.

data: mt_agr_menu_group type ty_t_agr_menu_groups.

methods:

select_roles,

process_role

importing iv_role type agr_name

iv_tcode type tstc-tcode

exporting et_return type bapirettab,

get_tcodes_of_cat

importing ir_node type ref to cl_pfcg_menu_modify=>ty_menu_node

it_nodes type cl_pfcg_menu_modify=>tt_menu_node

exporting et_tcodes type ty_t_appl,

find_create_folder

importing iv_role type agr_name

ir_role type ref to cl_pfcg_menu_modify

ir_node type ref to cl_pfcg_menu_modify=>ty_menu_node

iv_node_name type agr_buffi-url

exporting ev_folder_id type agr_hier-object_id

et_return type bapirettab,

add_tcodes

importing iv_role type agr_name

ir_role type ref to cl_pfcg_menu_modify

iv_folder_id type agr_hier-object_id

exporting et_return type bapirettab

changing ct_tcodes type ty_t_appl.

endclass.

data: gr_appgroups type ref to lcl_appgroups

.

initialization.

" In case the report is startet: Check 'PFCG'

if sy-tcode ne 'PFCG'.

call function 'AUTH_CHECK_TCODE'

exporting

tcode = 'PFCG'

exceptions

parameter_error = 1

transaction_not_found = 2

transaction_locked = 3

transaction_is_menu = 4

menu_via_parameter_transaction = 5

not_authorized = 6

others = 7.

if sy-subrc ne 0.

message id sy-msgid type 'I' number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

leave program.

endif.

endif.

start-of-selection.

create object gr_appgroups.

gr_appgroups->start( ).

class lcl_appgroups implementation.

method start.

data: lr_agr_menu_group type ref to ty_s_agr_menu_groups,

lt_return type bapirettab,

lt_messages type cl_pfcg_menu_tools=>tt_pfcg_msg_log,

lv_tcode type tstc-tcode,

lv_cinfo type tstc-cinfo.

" Check Tcode

select single tcode cinfo from tstc into (lv_tcode, lv_cinfo)

where tcode = tcode.

if sy-subrc ne 0 or lv_cinfo o lc_hex01.

message i010(01) with tcode display like 'E'.

return.

endif.

" Select roles

call method me->select_roles( ).

if mt_agr_menu_group is initial.

message s244(s#).

return.

endif.

" Add TCodes

loop at mt_agr_menu_group reference into lr_agr_menu_group.

call method process_role

exporting

iv_role = lr_agr_menu_group->agr_name

iv_tcode = lv_tcode

importing

et_return = lt_return.

call method cl_pfcg_menu_tools=>message_log_add_msg_for_role

exporting

it_return = lt_return

iv_role = lr_agr_menu_group->agr_name

changing

ct_messages = lt_messages.

endloop.

call method cl_pfcg_menu_tools=>message_log_display

exporting

iv_popup = ' '

iv_fullscreen = 'X'

changing

ct_messages = lt_messages.

endmethod.

method select_roles.

clear: mt_agr_menu_group.

" Read menu entries with app groups

select a~agr_name as agr_name

from agr_define as a inner join agr_flags as f "#EC CI_BUFFJOIN

on a~agr_name = f~agr_name

into corresponding fields of table mt_agr_menu_group

where a~agr_name in selrole

and f~flag_type eq 'COLL_AGR'

and f~flag_value eq space.

sort mt_agr_menu_group.

delete adjacent duplicates from mt_agr_menu_group.

endmethod.

method process_role.

data: lt_return type bapirettab,

lr_role type ref to cl_pfcg_menu_modify,

lt_node type cl_pfcg_menu_modify=>tt_menu_node,

lr_node type ref to cl_pfcg_menu_modify=>ty_menu_node,

ls_node_detail type cl_pfcg_menu_tools=>ty_node_detail,

lv_urltype type urltype,

lv_folder_id type agr_hier-object_id,

lt_tcodes type ty_t_appl,

lv_rejected type abap_bool.

clear: et_return.

" --- Create instance

call method cl_pfcg_menu_modify=>retrieve_for_update

exporting

iv_role = iv_role

importing

er_role = lr_role

et_return = lt_return.

append lines of lt_return to et_return.

if lr_role is initial.

return.

endif.

call method lr_role->menu_add_transaction

exporting

"iv_target_id = iv_folder_id

iv_tcode = iv_tcode

iv_first_node_in_folder = ''

importing

et_return = lt_return.

append lines of lt_return to et_return.

append: value #( type = 'S' id = 'S#' number = '252' message_v1 = 'Add tcode ' message_v2 = iv_tcode message_v3 = '' message_v4 = '' ) to et_return.

* " --- Get Fiori catalogs

* " Read and check target node if tcode is correct

* call method lr_role->menu_get_nodes

* importing

* et_nodes = lt_node.

*

* loop at lt_node reference into lr_node where url_type eq 'CAT_PROVIDER'.

* lv_urltype = lr_node->url_type.

* call method cl_pfcg_menu_tools=>get_node_detail

* exporting

* iv_reporttype = lr_node->reporttype

* iv_tcode = ''

* iv_url_type = lv_urltype

* iv_url = lr_node->url

* iv_folder = space

* importing

* es_node_detail = ls_node_detail.

*

* " Get catalog tcodes

* call method get_tcodes_of_cat

* exporting

* ir_node = lr_node

* it_nodes = lt_node

* importing

* et_tcodes = lt_tcodes.

*

* " Create or find folder on same menu level

* call method find_create_folder

* exporting

* iv_role = iv_role

* ir_role = lr_role

* ir_node = lr_node

* iv_node_name = ls_node_detail-node_name

* importing

* ev_folder_id = lv_folder_id

* et_return = lt_return.

* append lines of lt_return to et_return.

*

* " Add tcodes

* call method add_tcodes

* exporting

* iv_role = iv_role

* ir_role = lr_role

* iv_folder_id = lv_folder_id

* importing

* et_return = lt_return

* changing

* ct_tcodes = lt_tcodes.

* append lines of lt_return to et_return.

* endloop.

read table et_return with key type = 'E' transporting no fields.

if sy-subrc eq 0.

call method lr_role->cancel.

return.

endif.

if test eq 'X'.

call method lr_role->cancel.

return.

endif.

call method cl_pfcg_menu_modify=>save

importing

ev_rejected = lv_rejected

et_return = lt_return.

append lines of lt_return to et_return.

if lv_rejected eq abap_true.

rollback work.

else.

commit work.

endif.

endmethod.

method get_tcodes_of_cat.

clear: et_tcodes.

data: lv_urltype type urltype,

lr_node type ref to cl_pfcg_menu_modify=>ty_menu_node,

ls_node_detail type cl_pfcg_menu_tools=>ty_node_detail,

ls_tcode type ty_s_appl.

loop at it_nodes reference into lr_node where parent_id eq ir_node->object_id.

lv_urltype = lr_node->url_type.

call method cl_pfcg_menu_tools=>get_node_detail

exporting

iv_reporttype = lr_node->reporttype

iv_tcode = lr_node->tcode

iv_url_type = lv_urltype

iv_url = lr_node->url

iv_folder = lr_node->folder

importing

es_node_detail = ls_node_detail.

if ls_node_detail-type eq 'TR'.

ls_tcode-type = ls_node_detail-type.

ls_tcode-name = ls_node_detail-name.

append ls_tcode to et_tcodes.

endif.

endloop.

endmethod.

method find_create_folder.

data: lr_node_folder type ref to cl_pfcg_menu_modify=>ty_menu_node,

lr_text_folder type ref to agr_shiert,

lv_search_text type agr_shiert-text,

lt_nodes type cl_pfcg_menu_modify=>tt_menu_node,

lt_menu_text type cl_pfcg_menu_modify=>ty_t_agr_shiert.

clear: ev_folder_id, et_return.

lv_search_text = iv_node_name.

" Read current menu

call method ir_role->menu_get_nodes

importing

et_nodes = lt_nodes

et_menu_text = lt_menu_text.

loop at lt_nodes reference into lr_node_folder

where parent_id eq ir_node->parent_id

and reporttype is initial

and folder eq 'X'.

read table lt_menu_text reference into lr_text_folder

with key object_id = lr_node_folder->object_id

spras = sy-langu

binary search.

if sy-subrc eq 0.

if lr_text_folder->text eq lv_search_text.

ev_folder_id = lr_text_folder->object_id.

return.

endif.

endif.

endloop.

call method ir_role->menu_add_folder

exporting

iv_target_id = ir_node->object_id

iv_first_node_in_folder = ''

iv_node_text = lv_search_text

importing

ev_new_object_id = ev_folder_id

et_return = et_return.

append: value #( type = 'S' id = 'S#' number = '252' message_v1 = 'Add folder ' message_v2 = lv_search_text message_v3 = '' message_v4 = '' ) to et_return.

endmethod.

method add_tcodes.

data: lt_return type bapirettab,

lr_node type ref to cl_pfcg_menu_modify=>ty_menu_node,

lt_nodes type cl_pfcg_menu_modify=>tt_menu_node,

lr_tcode type ref to ty_s_appl,

lv_tcode type tcode.

clear: et_return.

" Read current menu

call method ir_role->menu_get_nodes

importing

et_nodes = lt_nodes.

" Delete tcodes

loop at lt_nodes reference into lr_node

where parent_id eq iv_folder_id

and tcode is not initial

and folder eq space.

read table ct_tcodes

with key name = lr_node->tcode

transporting no fields.

if sy-subrc eq 0.

delete ct_tcodes index sy-tabix.

else.

call method ir_role->menu_delete_node

exporting

iv_object_id = lr_node->object_id

importing

et_return = lt_return.

append lines of lt_return to et_return.

append: value #( type = 'S' id = 'S#' number = '252' message_v1 = 'Delete tcode ' message_v2 = lr_node->tcode message_v3 = '' message_v4 = '' ) to et_return.

endif.

endloop.

" Add tcodes

loop at ct_tcodes reference into lr_tcode.

lv_tcode = lr_tcode->name.

call method ir_role->menu_add_transaction

exporting

iv_target_id = iv_folder_id

iv_tcode = lv_tcode

iv_first_node_in_folder = ''

importing

et_return = lt_return.

append lines of lt_return to et_return.

append: value #( type = 'S' id = 'S#' number = '252' message_v1 = 'Add tcode ' message_v2 = lv_tcode message_v3 = '' message_v4 = '' ) to et_return.

endloop.

endmethod.

endclass.

相关推荐
z2014z1 小时前
系统架构设计师教程 第5章 5.4 软件测试 笔记
笔记·系统架构
&AtTiTuDe;2 小时前
如何使用IIC外设(硬件IIC)
经验分享·笔记·stm32·单片机·嵌入式硬件·硬件工程
快把我骂醒2 小时前
S-Procedure的基本形式及使用
笔记
铁匠匠匠5 小时前
【C总集篇】第八章 数组和指针
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
CZDXWX5 小时前
感知笔记4:YOLO 3D 物体定位
笔记·yolo
Wzc890204bai6 小时前
肥胖成因:饮食之外,消耗吸收慢是关键因素
经验分享·笔记·生活
L10732034826 小时前
深度学习笔记17_TensorFlow实现咖啡豆识别
笔记·深度学习·tensorflow
因为奋斗超太帅啦6 小时前
React学习笔记(三)——React 组件通讯
笔记·学习·react.js
卡戎-caryon6 小时前
【操作系统】01.冯·诺伊曼体系结构
服务器·笔记·操作系统·冯·诺伊曼体系结构
完球了7 小时前
【Day02-JS+Vue+Ajax】
javascript·vue.js·笔记·学习·ajax