• 【SAP-ABAP】-权限批导-批量分配角色给具体用户


    需求:SAP期初上线的时候,业务顾问经常会遇到批量创建角色和分配角色权限的情况

    岗位需求:一般是业务顾问定义权限,BASIS进行后期运维,今天讲两个批导功能,方便期初上线

    此程序功能:给具体用户分配多角色

    代码如下

    1. *&---------------------------------------------------------------------*
    2. *& Report Y_YZD_TEST11
    3. *&
    4. *&---------------------------------------------------------------------*
    5. *&
    6. *&
    7. *&---------------------------------------------------------------------*
    8. REPORT Y_YZD_TEST11.
    9. TABLES: sscrfields.
    10. TYPES: BEGIN OF ty_list,
    11. uname TYPE usnam,
    12. pname TYPE agr_name,
    13. msg(1024),
    14. END OF ty_list.
    15. DATA: gt_list TYPE STANDARD TABLE OF ty_list,
    16. gt_usrs TYPE STANDARD TABLE OF ty_list.
    17. * OLE使用变量
    18. DATA: gv_excel TYPE ole2_object,
    19. gv_application TYPE ole2_object,
    20. gv_wbook TYPE ole2_object,
    21. gv_sheet TYPE ole2_object,
    22. go_error TYPE REF TO i_oi_error,
    23. go_document TYPE REF TO i_oi_document_proxy,
    24. go_container TYPE REF TO cl_gui_custom_container,
    25. go_control TYPE REF TO i_oi_container_control,
    26. go_spreadsheet TYPE REF TO i_oi_spreadsheet.
    27. *----------------------------------------------------------------------*
    28. * CONSTANTS
    29. *----------------------------------------------------------------------*
    30. CONSTANTS: cns_left TYPE i VALUE 1,
    31. cns_top TYPE i VALUE 2,
    32. cns_col TYPE i VALUE 2.
    33. *----------------------------------------------------------------------*
    34. * SELECTION-SCREEN
    35. *----------------------------------------------------------------------*
    36. * 选择屏幕
    37. SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-t01.
    38. PARAMETERS: p_file TYPE string OBLIGATORY.
    39. SELECTION-SCREEN FUNCTION KEY 1.
    40. PARAMETERS:p_rec TYPE i OBLIGATORY.
    41. SELECTION-SCREEN END OF BLOCK bk1.
    42. *----------------------------------------------------------------------*
    43. * INITIALIZATION
    44. *----------------------------------------------------------------------*
    45. INITIALIZATION.
    46. * 初始化对象
    47. PERFORM frm_init_prog.
    48. *----------------------------------------------------------------------*
    49. * AT SELECTION-SCREEN
    50. *----------------------------------------------------------------------*
    51. AT SELECTION-SCREEN.
    52. * 运行前的相关检查
    53. PERFORM frm_check_ref.
    54. *----------------------------------------------------------------------*
    55. * AT SELECTION-SCREEN
    56. *----------------------------------------------------------------------*
    57. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
    58. * 得到文件路径
    59. PERFORM frm_get_file_path.
    60. *&---------------------------------------------------------------------*
    61. * START-OF-SELECTION
    62. *&---------------------------------------------------------------------*
    63. START-OF-SELECTION.
    64. * 处理导入数据
    65. PERFORM frm_upload_sheets .
    66. *&---------------------------------------------------------------------*
    67. *& Form FRM_INIT_PROG
    68. *&---------------------------------------------------------------------*
    69. * text:初始化OLE对象
    70. *----------------------------------------------------------------------*
    71. FORM frm_init_prog .
    72. CALL METHOD c_oi_container_control_creator=>get_container_control
    73. IMPORTING
    74. control = go_control
    75. error = go_error.
    76. IF go_error->has_failed = abap_true.
    77. CALL METHOD go_error->raise_message
    78. EXPORTING
    79. type = 'E'.
    80. ENDIF.
    81. CREATE OBJECT go_container
    82. EXPORTING
    83. container_name = 'CONT'
    84. EXCEPTIONS
    85. cntl_error = 1
    86. cntl_system_error = 2
    87. create_error = 3
    88. lifetime_error = 4
    89. lifetime_dynpro_dynpro_link = 5
    90. OTHERS = 6.
    91. IF sy-subrc <> 0.
    92. MESSAGE 'Error while creating container' TYPE 'E'.
    93. ENDIF.
    94. CALL METHOD go_control->init_control
    95. EXPORTING
    96. inplace_enabled = abap_true
    97. r3_application_name = 'EXCEL CONTAINER'
    98. parent = go_container
    99. IMPORTING
    100. error = go_error
    101. EXCEPTIONS
    102. javabeannotsupported = 1
    103. OTHERS = 2.
    104. IF go_error->has_failed = abap_true.
    105. CALL METHOD go_error->raise_message
    106. EXPORTING
    107. type = 'E'.
    108. ENDIF.
    109. CALL METHOD go_control->get_document_proxy
    110. EXPORTING
    111. document_type = soi_doctype_excel_sheet
    112. IMPORTING
    113. document_proxy = go_document
    114. error = go_error.
    115. IF go_error->has_failed = abap_true.
    116. CALL METHOD go_error->raise_message
    117. EXPORTING
    118. type = 'E'.
    119. ENDIF.
    120. ENDFORM. " FRM_INIT_PROG
    121. *&---------------------------------------------------------------------*
    122. *& Form FRM_CHECK_REF
    123. *&---------------------------------------------------------------------*
    124. * text:检查文件是否存在
    125. *----------------------------------------------------------------------*
    126. FORM frm_check_ref .
    127. DATA lv_ret TYPE abap_bool.
    128. * 将路径全部转换为大写
    129. TRANSLATE p_file TO UPPER CASE.
    130. IF p_file IS NOT INITIAL.
    131. * 检查文件是否存在
    132. CALL METHOD cl_gui_frontend_services=>file_exist
    133. EXPORTING
    134. file = p_file
    135. RECEIVING
    136. result = lv_ret
    137. EXCEPTIONS
    138. cntl_error = 1
    139. error_no_gui = 2
    140. wrong_parameter = 3
    141. not_supported_by_gui = 4
    142. OTHERS = 5.
    143. IF sy-subrc <> 0.
    144. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    145. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    146. ENDIF.
    147. IF lv_ret NE abap_true.
    148. MESSAGE TEXT-t02 TYPE 'E'.
    149. ENDIF.
    150. ENDIF.
    151. ENDFORM. " FRM_CHECK_INPUT
    152. *&---------------------------------------------------------------------*
    153. *& Form FRM_GET_FILE_PATH
    154. *&---------------------------------------------------------------------*
    155. * text:取得文件路径
    156. *----------------------------------------------------------------------*
    157. FORM frm_get_file_path .
    158. DATA: lt_filetab TYPE filetable.
    159. DATA: lv_rc TYPE i.
    160. * 取得文件路径
    161. CALL METHOD cl_gui_frontend_services=>file_open_dialog
    162. EXPORTING
    163. window_title = '导入文件'
    164. default_extension = '*.xls'
    165. file_filter = cl_gui_frontend_services=>filetype_excel
    166. CHANGING
    167. file_table = lt_filetab
    168. rc = lv_rc
    169. EXCEPTIONS
    170. file_open_dialog_failed = 1
    171. cntl_error = 2
    172. error_no_gui = 3
    173. not_supported_by_gui = 4
    174. OTHERS = 5.
    175. IF sy-subrc <> 0.
    176. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    177. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    178. ENDIF.
    179. IF lt_filetab IS NOT INITIAL.
    180. READ TABLE lt_filetab INTO p_file INDEX 1.
    181. ENDIF.
    182. ENDFORM. " FRM_GET_FILE_PATH
    183. *&---------------------------------------------------------------------*
    184. *& Form FRM_UPLOAD_SHEETS
    185. *&---------------------------------------------------------------------*
    186. * text:上传Excel内容
    187. *----------------------------------------------------------------------*
    188. FORM frm_upload_sheets .
    189. DATA: lwa_list TYPE ty_list,
    190. lv_flag,
    191. lv_document_url TYPE c LENGTH 256,
    192. lv_sheet_name TYPE soi_field_name,
    193. lt_data TYPE soi_generic_table,
    194. lt_ranges TYPE soi_range_list,
    195. lt_range TYPE soi_dimension_table,
    196. ls_range TYPE soi_dimension_item,
    197. lv_str TYPE string.
    198. lv_sheet_name = 'Assets'.
    199. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    200. EXPORTING
    201. * percentage = progress
    202. text = TEXT-t03.
    203. " open document
    204. CONCATENATE 'FILE://' p_file INTO lv_document_url.
    205. CALL METHOD go_document->open_document
    206. EXPORTING
    207. document_title = TEXT-t05
    208. document_url = lv_document_url
    209. open_inplace = abap_true
    210. IMPORTING
    211. error = go_error.
    212. IF go_error->has_failed = abap_true.
    213. CALL METHOD go_error->raise_message
    214. EXPORTING
    215. type = 'I'.
    216. LEAVE LIST-PROCESSING.
    217. ENDIF.
    218. " get sheet interface
    219. CALL METHOD go_document->get_spreadsheet_interface
    220. EXPORTING
    221. no_flush = ' '
    222. IMPORTING
    223. error = go_error
    224. sheet_interface = go_spreadsheet.
    225. IF go_error->has_failed = abap_true.
    226. CALL METHOD go_error->raise_message
    227. EXPORTING
    228. type = 'I'.
    229. LEAVE LIST-PROCESSING.
    230. ENDIF.
    231. ls_range-row = cns_top.
    232. ls_range-column = cns_left.
    233. ls_range-rows = p_rec.
    234. ls_range-columns = cns_col.
    235. APPEND ls_range TO lt_range.
    236. " get sheet content
    237. CALL METHOD go_spreadsheet->select_sheet
    238. EXPORTING
    239. name = lv_sheet_name "lstr_sheets-sheet_name
    240. IMPORTING
    241. error = go_error.
    242. IF go_error->has_failed = abap_true.
    243. CALL METHOD go_error->raise_message
    244. EXPORTING
    245. type = 'I'.
    246. LEAVE LIST-PROCESSING.
    247. ENDIF.
    248. CALL METHOD go_spreadsheet->set_selection
    249. EXPORTING
    250. top = cns_top
    251. left = cns_left
    252. rows = p_rec
    253. columns = cns_col.
    254. CALL METHOD go_spreadsheet->insert_range
    255. EXPORTING
    256. name = TEXT-t04
    257. rows = p_rec
    258. columns = cns_col
    259. no_flush = ''
    260. IMPORTING
    261. error = go_error.
    262. IF go_error->has_failed = abap_true.
    263. CALL METHOD go_error->raise_message
    264. EXPORTING
    265. type = 'I'.
    266. LEAVE LIST-PROCESSING.
    267. ENDIF.
    268. REFRESH lt_data.
    269. CALL METHOD go_spreadsheet->get_ranges_data
    270. EXPORTING
    271. rangesdef = lt_range
    272. IMPORTING
    273. contents = lt_data
    274. error = go_error
    275. CHANGING
    276. ranges = lt_ranges.
    277. DELETE lt_data WHERE value IS INITIAL OR value = space.
    278. LOOP AT lt_data ASSIGNING FIELD-SYMBOL().
    279. " build records by selected combination
    280. PERFORM frm_build_records_by_comb USING lwa_list.
    281. AT END OF row.
    282. CLEAR lv_flag.
    283. TRANSLATE lwa_list-uname TO UPPER CASE.
    284. TRANSLATE lwa_list-pname TO UPPER CASE.
    285. * 检查用户是否存在
    286. SELECT SINGLE bname INTO @DATA(lv_bname)
    287. FROM usr01 WHERE bname = @lwa_list-uname.
    288. IF sy-subrc EQ 0.
    289. ELSE.
    290. lwa_list-msg = TEXT-t05.
    291. lv_flag = abap_true.
    292. ENDIF.
    293. * 检查角色是否存在
    294. SELECT SINGLE agr_name INTO @DATA(lv_agr)
    295. FROM agr_define WHERE agr_name = @lwa_list-pname.
    296. IF sy-subrc EQ 0.
    297. ELSE.
    298. lwa_list-msg = lwa_list-msg && '|' && TEXT-t08.
    299. lv_flag = abap_true.
    300. ENDIF.
    301. IF lv_flag IS INITIAL.
    302. APPEND lwa_list TO gt_usrs.
    303. ELSE.
    304. SHIFT lwa_list-msg LEFT DELETING LEADING '|'.
    305. APPEND lwa_list TO gt_list.
    306. ENDIF.
    307. CLEAR:lwa_list.
    308. ENDAT.
    309. ENDLOOP.
    310. * 出错的用户,直接从gt_usrs里面移到gt_list
    311. SORT gt_list BY uname.
    312. LOOP AT gt_usrs INTO lwa_list.
    313. READ TABLE gt_list ASSIGNING FIELD-SYMBOL()
    314. WITH KEY uname = lwa_list-uname BINARY SEARCH.
    315. CHECK sy-subrc EQ 0.
    316. APPEND lwa_list TO gt_list.
    317. SORT gt_list BY uname.
    318. DELETE gt_usrs.
    319. ENDLOOP.
    320. IF gt_usrs IS NOT INITIAL.
    321. * 执行修改
    322. PERFORM frm_exec_change.
    323. ENDIF.
    324. * 如果出现检查或上载错误,则将错误的下载下来
    325. SORT gt_list BY uname pname.
    326. IF gt_list IS NOT INITIAL.
    327. lwa_list-uname = 'SAP用户'.
    328. lwa_list-pname = '角色'.
    329. lwa_list-msg = '错误消息'.
    330. INSERT lwa_list INTO gt_list INDEX 1.
    331. CALL FUNCTION 'GUI_DOWNLOAD'
    332. EXPORTING
    333. * BIN_FILESIZE =
    334. filename = 'C:\code\role_error.xls'
    335. filetype = 'DAT'
    336. * APPEND = ' '
    337. write_field_separator = 'X'
    338. * HEADER = '00'
    339. * TRUNC_TRAILING_BLANKS = ' '
    340. * WRITE_LF = 'X'
    341. * COL_SELECT = ' '
    342. * COL_SELECT_MASK = ' '
    343. * DAT_MODE = ' '
    344. * CONFIRM_OVERWRITE = ' '
    345. * NO_AUTH_CHECK = ' '
    346. codepage = '4103'
    347. * IGNORE_CERR = ABAP_TRUE
    348. replacement = '#'
    349. write_bom = 'X'
    350. * TRUNC_TRAILING_BLANKS_EOL = 'X'
    351. * WK1_N_FORMAT = ' '
    352. * WK1_N_SIZE = ' '
    353. * WK1_T_FORMAT = ' '
    354. * WK1_T_SIZE = ' '
    355. * WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
    356. * SHOW_TRANSFER_STATUS = ABAP_TRUE
    357. * VIRUS_SCAN_PROFILE = '/SCET/GUI_DOWNLOAD'
    358. TABLES
    359. data_tab = gt_list
    360. * FIELDNAMES =
    361. EXCEPTIONS
    362. file_write_error = 1
    363. no_batch = 2
    364. gui_refuse_filetransfer = 3
    365. invalid_type = 4
    366. no_authority = 5
    367. unknown_error = 6
    368. header_not_allowed = 7
    369. separator_not_allowed = 8
    370. filesize_not_allowed = 9
    371. header_too_long = 10
    372. dp_error_create = 11
    373. dp_error_send = 12
    374. dp_error_write = 13
    375. unknown_dp_error = 14
    376. access_denied = 15
    377. dp_out_of_memory = 16
    378. disk_full = 17
    379. dp_timeout = 18
    380. file_not_found = 19
    381. dataprovider_exception = 20
    382. control_flush_error = 21
    383. OTHERS = 22.
    384. WRITE: TEXT-t07.
    385. ELSE.
    386. MESSAGE TEXT-t06 TYPE 'S'.
    387. ENDIF.
    388. ENDFORM. " FRM_UPLOAD_SHEETS
    389. *&---------------------------------------------------------------------*
    390. *& Form FRM_BUILD_RECORDS_BY_COMB
    391. *&---------------------------------------------------------------------*
    392. * text:将列值赋值到上传内表
    393. *----------------------------------------------------------------------*
    394. * -->U_DATA:上传的EXCEL值
    395. * -->U_UPLDATA:传入内表的行
    396. *----------------------------------------------------------------------*
    397. FORM frm_build_records_by_comb USING u_data TYPE soi_generic_item
    398. u_list TYPE ty_list.
    399. CASE u_data-column.
    400. WHEN '1'.
    401. u_list-uname = u_data-value.
    402. WHEN '2'.
    403. u_list-pname = u_data-value.
    404. WHEN OTHERS.
    405. ENDCASE.
    406. ENDFORM.
    407. *&---------------------------------------------------------------------*
    408. *& Form FRM_EXEC_CHANGE
    409. *&---------------------------------------------------------------------*
    410. * text
    411. *----------------------------------------------------------------------*
    412. * -->P_LV_FLAG text
    413. * -->P_LWA_LIST text
    414. *----------------------------------------------------------------------*
    415. FORM frm_exec_change.
    416. DATA:lt_agr TYPE TABLE OF bapiagr,
    417. ls_agr TYPE bapiagr,
    418. lt_ret TYPE TABLE OF bapiret2,
    419. lv_name TYPE bapibname-bapibname,
    420. lt_list TYPE TABLE OF ty_list,
    421. ls_list TYPE ty_list,
    422. lv_str TYPE string.
    423. SORT gt_usrs BY uname.
    424. LOOP AT gt_usrs ASSIGNING FIELD-SYMBOL().
    425. ls_agr-agr_name = -pname.
    426. ls_agr-from_dat = sy-datum.
    427. ls_agr-to_dat = '99991231'.
    428. * 取角色的描述
    429. SELECT text UP TO 1 ROWS
    430. INTO @ls_agr-agr_text
    431. FROM agr_texts
    432. WHERE agr_name = @-pname.
    433. ENDSELECT.
    434. APPEND ls_agr TO lt_agr.
    435. APPEND TO lt_list.
    436. AT END OF uname.
    437. lv_name = -uname.
    438. CALL FUNCTION 'ISAI_USER_ROLES_MAINTAIN'
    439. EXPORTING
    440. username = lv_name
    441. TABLES
    442. actgroups_new = lt_agr
    443. return = lt_ret.
    444. LOOP AT lt_ret INTO DATA(lwa_return).
    445. IF lwa_return-type = 'E' OR
    446. lwa_return-type = 'A' OR
    447. lwa_return-type = 'X'.
    448. DATA(lv_flg) = abap_true.
    449. EXIT.
    450. ENDIF.
    451. ENDLOOP.
    452. IF lv_flg IS INITIAL.
    453. * 成功
    454. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    455. EXPORTING
    456. wait = abap_true.
    457. ELSE.
    458. * 失败
    459. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    460. CLEAR lv_str.
    461. LOOP AT lt_ret INTO lwa_return
    462. WHERE type = 'E' OR type = 'A' OR type = 'X'.
    463. lv_str = lv_str && '|' && lwa_return-message.
    464. ENDLOOP.
    465. SHIFT lv_str LEFT DELETING LEADING '|'.
    466. CLEAR ls_list.
    467. ls_list-msg = lv_str.
    468. MODIFY lt_list FROM ls_list TRANSPORTING msg
    469. WHERE uname NE ''.
    470. APPEND LINES OF lt_list TO gt_list.
    471. ENDIF.
    472. CLEAR:lt_agr,lt_ret,lt_list,lv_name.
    473. ENDAT.
    474. ENDLOOP.
    475. ENDFORM.

  • 相关阅读:
    极光魔链(JMLink)使用教程
    【SparkSQL】数据的加载和保存、项目实战
    数据结构——二分查找法
    顺序表的实现和练习
    园子周边:Polo 衫效果图预览
    SRM系统能为企业带来什么好处,企业该怎么选择SRM系统供应商
    图形学插值函数理解与联系
    Spring Cloud(十一):Spring Cloud Security Oauth2
    二叉树的OJ练习题
    CentOS 7.8 kubeadm安装 k8s 1.26
  • 原文地址:https://blog.csdn.net/weixin_42400703/article/details/139655441