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

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

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

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

代码如下

bash 复制代码
*&---------------------------------------------------------------------*
*& Report  Y_YZD_TEST11
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  Y_YZD_TEST11.

TABLES: sscrfields.

TYPES: BEGIN OF ty_list,
         uname     TYPE usnam,
         pname     TYPE agr_name,
         msg(1024),
       END OF ty_list.

DATA: gt_list TYPE STANDARD TABLE OF ty_list,
      gt_usrs TYPE STANDARD TABLE OF ty_list.
* OLE使用变量
DATA: gv_excel       TYPE ole2_object,
      gv_application TYPE ole2_object,
      gv_wbook       TYPE ole2_object,
      gv_sheet       TYPE ole2_object,
      go_error       TYPE REF TO i_oi_error,
      go_document    TYPE REF TO i_oi_document_proxy,
      go_container   TYPE REF TO cl_gui_custom_container,
      go_control     TYPE REF TO i_oi_container_control,
      go_spreadsheet TYPE REF TO i_oi_spreadsheet.

*----------------------------------------------------------------------*
* CONSTANTS
*----------------------------------------------------------------------*
CONSTANTS: cns_left TYPE i VALUE 1,
           cns_top  TYPE i VALUE 2,
           cns_col  TYPE i VALUE 2.

*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
* 选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_file  TYPE string OBLIGATORY.
SELECTION-SCREEN FUNCTION KEY 1.
PARAMETERS:p_rec TYPE i OBLIGATORY.
SELECTION-SCREEN END OF BLOCK bk1.

*----------------------------------------------------------------------*
* INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
* 初始化对象
  PERFORM frm_init_prog.

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
* 运行前的相关检查
  PERFORM frm_check_ref.

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* 得到文件路径
  PERFORM frm_get_file_path.

*&---------------------------------------------------------------------*
* START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* 处理导入数据
  PERFORM frm_upload_sheets .

*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_PROG
*&---------------------------------------------------------------------*
*       text:初始化OLE对象
*----------------------------------------------------------------------*
FORM frm_init_prog .

  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = go_control
      error   = go_error.
  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'E'.
  ENDIF.

  CREATE OBJECT go_container
    EXPORTING
      container_name              = 'CONT'
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.
  IF sy-subrc <> 0.
    MESSAGE  'Error while creating container' TYPE 'E'.
  ENDIF.

  CALL METHOD go_control->init_control
    EXPORTING
      inplace_enabled      = abap_true
      r3_application_name  = 'EXCEL CONTAINER'
      parent               = go_container
    IMPORTING
      error                = go_error
    EXCEPTIONS
      javabeannotsupported = 1
      OTHERS               = 2.
  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'E'.
  ENDIF.

  CALL METHOD go_control->get_document_proxy
    EXPORTING
      document_type  = soi_doctype_excel_sheet
    IMPORTING
      document_proxy = go_document
      error          = go_error.
  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'E'.
  ENDIF.

ENDFORM.                    " FRM_INIT_PROG

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_REF
*&---------------------------------------------------------------------*
*       text:检查文件是否存在
*----------------------------------------------------------------------*
FORM frm_check_ref .

  DATA lv_ret TYPE abap_bool.

*   将路径全部转换为大写
  TRANSLATE p_file TO UPPER CASE.
  IF p_file IS NOT INITIAL.
*     检查文件是否存在
    CALL METHOD cl_gui_frontend_services=>file_exist
      EXPORTING
        file                 = p_file
      RECEIVING
        result               = lv_ret
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        wrong_parameter      = 3
        not_supported_by_gui = 4
        OTHERS               = 5.

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    IF lv_ret NE abap_true.
      MESSAGE TEXT-t02 TYPE 'E'.
    ENDIF.
  ENDIF.

ENDFORM.                    " FRM_CHECK_INPUT

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILE_PATH
*&---------------------------------------------------------------------*
*       text:取得文件路径
*----------------------------------------------------------------------*
FORM frm_get_file_path .

  DATA: lt_filetab TYPE filetable.
  DATA: lv_rc TYPE i.

* 取得文件路径
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '导入文件'
      default_extension       = '*.xls'
      file_filter             = cl_gui_frontend_services=>filetype_excel
    CHANGING
      file_table              = lt_filetab
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  IF lt_filetab IS NOT INITIAL.
    READ TABLE lt_filetab INTO p_file INDEX 1.
  ENDIF.

ENDFORM.                    " FRM_GET_FILE_PATH

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_SHEETS
*&---------------------------------------------------------------------*
*       text:上传Excel内容
*----------------------------------------------------------------------*
FORM frm_upload_sheets .

  DATA: lwa_list        TYPE ty_list,
        lv_flag,
        lv_document_url TYPE c LENGTH 256,
        lv_sheet_name   TYPE soi_field_name,
        lt_data         TYPE soi_generic_table,
        lt_ranges       TYPE soi_range_list,
        lt_range        TYPE soi_dimension_table,
        ls_range        TYPE soi_dimension_item,
        lv_str          TYPE string.

  lv_sheet_name = 'Assets'.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
*     percentage = progress
      text = TEXT-t03.

  " open document
  CONCATENATE 'FILE://' p_file INTO lv_document_url.
  CALL METHOD go_document->open_document
    EXPORTING
      document_title = TEXT-t05
      document_url   = lv_document_url
      open_inplace   = abap_true
    IMPORTING
      error          = go_error.
  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'I'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  " get sheet interface
  CALL METHOD go_document->get_spreadsheet_interface
    EXPORTING
      no_flush        = ' '
    IMPORTING
      error           = go_error
      sheet_interface = go_spreadsheet.

  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'I'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  ls_range-row     = cns_top.
  ls_range-column  = cns_left.
  ls_range-rows    = p_rec.
  ls_range-columns = cns_col.
  APPEND ls_range TO lt_range.

  " get sheet content
  CALL METHOD go_spreadsheet->select_sheet
    EXPORTING
      name  = lv_sheet_name "lstr_sheets-sheet_name
    IMPORTING
      error = go_error.
  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'I'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  CALL METHOD go_spreadsheet->set_selection
    EXPORTING
      top     = cns_top
      left    = cns_left
      rows    = p_rec
      columns = cns_col.

  CALL METHOD go_spreadsheet->insert_range
    EXPORTING
      name     = TEXT-t04
      rows     = p_rec
      columns  = cns_col
      no_flush = ''
    IMPORTING
      error    = go_error.
  IF go_error->has_failed = abap_true.
    CALL METHOD go_error->raise_message
      EXPORTING
        type = 'I'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  REFRESH lt_data.
  CALL METHOD go_spreadsheet->get_ranges_data
    EXPORTING
      rangesdef = lt_range
    IMPORTING
      contents  = lt_data
      error     = go_error
    CHANGING
      ranges    = lt_ranges.
  DELETE lt_data WHERE value IS INITIAL OR value = space.

  LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
    " build records by selected combination
    PERFORM frm_build_records_by_comb USING <lfs_data> lwa_list.
    AT END OF row.
      CLEAR lv_flag.
      TRANSLATE lwa_list-uname TO UPPER CASE.
      TRANSLATE lwa_list-pname TO UPPER CASE.

*     检查用户是否存在
      SELECT SINGLE bname INTO @DATA(lv_bname)
        FROM usr01 WHERE bname = @lwa_list-uname.
      IF sy-subrc EQ 0.

      ELSE.
        lwa_list-msg = TEXT-t05.
        lv_flag = abap_true.
      ENDIF.

*     检查角色是否存在
      SELECT SINGLE agr_name INTO @DATA(lv_agr)
        FROM agr_define WHERE agr_name = @lwa_list-pname.
      IF sy-subrc EQ 0.

      ELSE.
        lwa_list-msg = lwa_list-msg && '|' && TEXT-t08.
        lv_flag = abap_true.
      ENDIF.

      IF lv_flag IS INITIAL.
        APPEND lwa_list TO gt_usrs.
      ELSE.
        SHIFT lwa_list-msg LEFT DELETING LEADING '|'.
        APPEND lwa_list TO gt_list.
      ENDIF.

      CLEAR:lwa_list.
    ENDAT.
  ENDLOOP.

* 出错的用户,直接从gt_usrs里面移到gt_list
  SORT gt_list BY uname.
  LOOP AT gt_usrs INTO lwa_list.
    READ TABLE gt_list ASSIGNING FIELD-SYMBOL(<lfs_list>)
      WITH KEY uname = lwa_list-uname BINARY SEARCH.
    CHECK sy-subrc EQ 0.
    APPEND lwa_list TO gt_list.
    SORT gt_list BY uname.
    DELETE gt_usrs.
  ENDLOOP.

  IF gt_usrs IS NOT INITIAL.
*   执行修改
    PERFORM frm_exec_change.
  ENDIF.

* 如果出现检查或上载错误,则将错误的下载下来
  SORT gt_list BY uname pname.
  IF gt_list IS NOT INITIAL.
    lwa_list-uname = 'SAP用户'.
    lwa_list-pname = '角色'.
    lwa_list-msg   = '错误消息'.
    INSERT lwa_list INTO gt_list INDEX 1.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
*       BIN_FILESIZE            =
        filename                = 'C:\code\role_error.xls'
        filetype                = 'DAT'
*       APPEND                  = ' '
        write_field_separator   = 'X'
*       HEADER                  = '00'
*       TRUNC_TRAILING_BLANKS   = ' '
*       WRITE_LF                = 'X'
*       COL_SELECT              = ' '
*       COL_SELECT_MASK         = ' '
*       DAT_MODE                = ' '
*       CONFIRM_OVERWRITE       = ' '
*       NO_AUTH_CHECK           = ' '
        codepage                = '4103'
*       IGNORE_CERR             = ABAP_TRUE
        replacement             = '#'
        write_bom               = 'X'
*       TRUNC_TRAILING_BLANKS_EOL       = 'X'
*       WK1_N_FORMAT            = ' '
*       WK1_N_SIZE              = ' '
*       WK1_T_FORMAT            = ' '
*       WK1_T_SIZE              = ' '
*       WRITE_LF_AFTER_LAST_LINE        = ABAP_TRUE
*       SHOW_TRANSFER_STATUS    = ABAP_TRUE
*       VIRUS_SCAN_PROFILE      = '/SCET/GUI_DOWNLOAD'
      TABLES
        data_tab                = gt_list
*       FIELDNAMES              =
      EXCEPTIONS
        file_write_error        = 1
        no_batch                = 2
        gui_refuse_filetransfer = 3
        invalid_type            = 4
        no_authority            = 5
        unknown_error           = 6
        header_not_allowed      = 7
        separator_not_allowed   = 8
        filesize_not_allowed    = 9
        header_too_long         = 10
        dp_error_create         = 11
        dp_error_send           = 12
        dp_error_write          = 13
        unknown_dp_error        = 14
        access_denied           = 15
        dp_out_of_memory        = 16
        disk_full               = 17
        dp_timeout              = 18
        file_not_found          = 19
        dataprovider_exception  = 20
        control_flush_error     = 21
        OTHERS                  = 22.

    WRITE: TEXT-t07.

  ELSE.
    MESSAGE TEXT-t06 TYPE 'S'.
  ENDIF.

ENDFORM.                    " FRM_UPLOAD_SHEETS

*&---------------------------------------------------------------------*
*&      Form  FRM_BUILD_RECORDS_BY_COMB
*&---------------------------------------------------------------------*
*       text:将列值赋值到上传内表
*----------------------------------------------------------------------*
*      -->U_DATA:上传的EXCEL值
*      -->U_UPLDATA:传入内表的行
*----------------------------------------------------------------------*
FORM frm_build_records_by_comb USING u_data  TYPE soi_generic_item
                                      u_list TYPE ty_list.

  CASE u_data-column.
    WHEN '1'.
      u_list-uname = u_data-value.
    WHEN '2'.
      u_list-pname = u_data-value.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_EXEC_CHANGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_FLAG  text
*      -->P_LWA_LIST  text
*----------------------------------------------------------------------*
FORM frm_exec_change.

  DATA:lt_agr  TYPE TABLE OF bapiagr,
       ls_agr  TYPE bapiagr,
       lt_ret  TYPE TABLE OF bapiret2,
       lv_name TYPE bapibname-bapibname,
       lt_list TYPE TABLE OF ty_list,
       ls_list TYPE ty_list,
       lv_str  TYPE string.

  SORT gt_usrs BY uname.
  LOOP AT gt_usrs ASSIGNING FIELD-SYMBOL(<lfs_list>).
    ls_agr-agr_name = <lfs_list>-pname.
    ls_agr-from_dat = sy-datum.
    ls_agr-to_dat   = '99991231'.

*   取角色的描述
    SELECT text UP TO 1 ROWS
      INTO @ls_agr-agr_text
      FROM agr_texts
      WHERE agr_name = @<lfs_list>-pname.
    ENDSELECT.
    APPEND ls_agr TO lt_agr.
    APPEND <lfs_list> TO lt_list.

    AT END OF uname.
      lv_name = <lfs_list>-uname.
      CALL FUNCTION 'ISAI_USER_ROLES_MAINTAIN'
        EXPORTING
          username      = lv_name
        TABLES
          actgroups_new = lt_agr
          return        = lt_ret.
      LOOP AT lt_ret INTO DATA(lwa_return).
        IF lwa_return-type = 'E' OR
            lwa_return-type = 'A' OR
            lwa_return-type = 'X'.
          DATA(lv_flg) = abap_true.
          EXIT.
        ENDIF.
      ENDLOOP.

      IF lv_flg IS INITIAL.
*       成功
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = abap_true.

      ELSE.
*       失败
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        CLEAR lv_str.
        LOOP AT lt_ret INTO lwa_return
          WHERE type = 'E' OR type = 'A' OR type = 'X'.
          lv_str = lv_str && '|' && lwa_return-message.
        ENDLOOP.
        SHIFT lv_str LEFT DELETING LEADING '|'.
        CLEAR ls_list.
        ls_list-msg = lv_str.
        MODIFY lt_list FROM ls_list TRANSPORTING msg
           WHERE uname NE ''.
        APPEND LINES OF lt_list TO gt_list.

      ENDIF.

      CLEAR:lt_agr,lt_ret,lt_list,lv_name.
    ENDAT.
  ENDLOOP.

ENDFORM.
相关推荐
lu_rong_qq4 天前
SAP B1 登陆报错解决方案 - 系统架构目录服务器选择
sap
斌将军4 天前
BP新增页签增强
abap
LilySesy6 天前
SAP+Internet主题HTML样式选择
前端·html·sap·abap·internet服务·its·扫码枪
SAP学习成长之路7 天前
如何在SM30生成的维护表中增加选择框 CheckBox
开发语言·数据库·sap·健康医疗·abap·代码规范
SAPABAP东芝9 天前
【SAP-ABAP】MIRO--界面增强增加数据导出导入按钮
sap·abap·fico
cyqweqe12310 天前
SAP采购发票税额总额非自动计算。TAX不写行号
abap
SAP学习成长之路10 天前
【翻译】伯明翰市议会因 Oracle 系统崩溃而面临 £216.5M 的损失
数据库·oracle·sap
乐乐823413 天前
ABAP:SET CURSOR FIELD设置鼠标焦点
abap
向上的车轮13 天前
ODOO学习笔记(4):Odoo与SAP的主要区别是什么?
笔记·学习·sap·odoo
哲讯智能科技14 天前
SAP Business One市场价格解析
运维·sap·erp