批量创建用户 分配权限

 导入模板

*&---------------------------------------------------------------------*
*& Report ZTEST_GUO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_GUO.
*&---------------------------------------------------------------------*
*& Report Y4_A2_R01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*

****************************************************************
TABLES:sscrfields.    "定义按钮

***********************************************************************
*
*数据类型定义逻辑块
*
************************************************************************
"导入数据
DATA: BEGIN OF gt_itab OCCURS 0,
        bname       LIKE suid_st_bname-bname,                           "账户名
        name_last   LIKE suid_st_node_person_name-name_last,            "用户名
        password    LIKE suid_st_node_password_ext-password,            "密码
        function    LIKE suid_st_node_workplace-function,               "岗位
        department  LIKE suid_st_node_workplace-department,             "部门
        profile     LIKE suid_st_node_profile-profile,                  "参数文件名
        state(1),                                                       "状态
        message     TYPE  string,                                       "消息文本
        checkbox(1),
      END OF gt_itab.

"定义指针
FIELD-SYMBOLS <fs_itab> LIKE gt_itab.

"ALV
DATA:
  "主要属性
  gt_fieldcat TYPE lvc_t_fcat,    "字段目录
  gs_fieldcat TYPE lvc_s_fcat,    "字段目录
  gs_layout   TYPE lvc_s_layo,    "布局结构
  "次要属性
  gs_glay     TYPE lvc_s_glay.    "网格设置

************************************************************************
*
*选择界面程序逻辑块
*
************************************************************************

PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY.                     "选择路径

"事件
SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.
  "点击下载模板
  sscrfields-functxt_01 = VALUE smp_dyntxt(
    icon_id = icon_mapped_relation
    icon_text = 'EXCEL下载模板'
    quickinfo = '点击下载'
  ).

AT SELECTION-SCREEN OUTPUT.
  "是一个PBO事件(Process before output,屏幕加载前的事件)。
  LOOP AT SCREEN.
    IF matches( val = screen-name regex = 'P_FILE' ).
      screen-required = 2.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_f4_help CHANGING p_file.

AT SELECTION-SCREEN.
  "选择文件路径
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_download_excel USING 'Y4_A2_006'.                     "下载 EXCEL 文件
    WHEN OTHERS.
      IF p_file IS INITIAL.
        MESSAGE s001(00) WITH '导入文件路径必须填写!' DISPLAY LIKE 'E'.
        STOP.
      ELSE.
        PERFORM frm_read_excel TABLES gt_itab[] USING p_file 1 2 6 10000 CHANGING gt_itab.
*        PERFORM frm_jiaoyan.                                           "校验数据
        PERFORM frm_set_fieldcat CHANGING gt_fieldcat.                  "设置字段目录   给ALV FIELDCAT 赋值
        PERFORM frm_layout.                                             "设置布局
        PERFORM frm_display.                                            "显示ALV
      ENDIF.
  ENDCASE.

*&---------------------------------------------------------------------*
*&      FORM  FRM_F4_HELP
*&---------------------------------------------------------------------*
*       打开文件路径
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_f4_help CHANGING o_fname TYPE rlgrap-filename.
  DATA: lv_filetab TYPE filetable,
        lv_waftab  LIKE LINE OF lv_filetab,
        lv_rc      TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '打开文件'
      initial_directory       = 'C:/'
    CHANGING
      file_table              = lv_filetab
      rc                      = lv_rc
*     USER_ACTION             =
*     FILE_ENCODING           =
    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.
    EXIT.
  ELSE.
    READ TABLE lv_filetab INTO lv_waftab INDEX 1.
    o_fname = lv_waftab-filename.
    CLEAR: lv_filetab,
           lv_waftab.
  ENDIF.

ENDFORM. " FRM_F4_HELP
*&---------------------------------------------------------------------*
*&      FORM  FRM_DOWNLOAD_EXCEL
*&---------------------------------------------------------------------*
*       下载EXCEL模版
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM frm_download_excel USING lv_objid TYPE wwwdatatab-objid.
  DATA: l_filename  TYPE string,
        lv_filename TYPE string,
        lv_path     TYPE string,
        lv_fullpath TYPE string.

  DATA: lv_obj         LIKE wwwdatatab,
        lv_destination LIKE rlgrap-filename.
  DATA: lv_rc  LIKE sy-subrc.
  DATA: lv_error TYPE char255.

  SELECT SINGLE * FROM wwwdata
    INTO CORRESPONDING FIELDS OF lv_obj
    WHERE objid = lv_objid.

  CONCATENATE lv_obj-text '.XLSX' INTO l_filename.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_file_name         = l_filename
      file_filter               = cl_gui_frontend_services=>filetype_excel
      prompt_on_overwrite       = 'X'
    CHANGING
      filename                  = lv_filename
      path                      = lv_path
      fullpath                  = lv_fullpath
    EXCEPTIONS
      cntl_error                = 1
      error_no_gui              = 2
      not_supported_by_gui      = 3
      invalid_default_file_name = 4
      OTHERS                    = 5.

  IF lv_fullpath <> ''.
    lv_destination = lv_fullpath.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lv_obj
        destination = lv_destination
      IMPORTING
        rc          = lv_rc.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  FRM_READ_EXCEL
*&---------------------------------------------------------------------*
*       调用上传文件函数
*----------------------------------------------------------------------*
*FORM frm_read_excel TABLES l_tab
*  USING pv_file TYPE rlgrap-filename
*        lv_i_begin_col TYPE i
*        lv_i_begin_row TYPE i
*        lv_i_end_col TYPE i
*        lv_i_end_row TYPE i
*  CHANGING l_wa TYPE any.
*
*  DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
*  FIELD-SYMBOLS <lfs_value> TYPE any.
*
*  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
*    EXPORTING
*      filename                = pv_file                                  "文件路径
*      i_begin_col             = lv_i_begin_col                           "开始列
*      i_begin_row             = lv_i_begin_row                           "开始行
*      i_end_col               = lv_i_end_col                             "结束列
*      i_end_row               = lv_i_end_row                             "结束行
*    TABLES
*      intern                  = lt_excel
*    EXCEPTIONS
*      inconsistent_parameters = 1
*      upload_ole              = 2
*      OTHERS                  = 3.
*  IF sy-subrc <> 0.
*    MESSAGE s001(00) WITH '读取 EXCEL 文件失败' DISPLAY LIKE 'E'.
*    STOP.
*  ENDIF.
*
*  "对固定格式的数据进一步处理,以存放至数据库表格中。
*  LOOP AT lt_excel.
*    ASSIGN COMPONENT lt_excel-col OF STRUCTURE l_wa TO <lfs_value>.
*    "系统将字符串lt_excel-col的组件l_wa分配给字段符号<lfs_value>
*    IF sy-subrc = 0 .
*      <lfs_value> = lt_excel-value.
*    ENDIF.
*    AT END OF row.
*      APPEND l_wa TO l_tab.
*      CLEAR l_wa.
*    ENDAT.
*  ENDLOOP.
*ENDFORM.


FORM frm_read_excel TABLES l_tab
  USING pv_file TYPE rlgrap-filename
        lv_i_begin_col TYPE i
        lv_i_begin_row TYPE i
        lv_i_end_col TYPE i
        lv_i_end_row TYPE i
  CHANGING l_wa TYPE any.

  DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
  FIELD-SYMBOLS <lfs_value> TYPE any.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = pv_file                                 "文件路径
      i_begin_col             = lv_i_begin_col                          "开始列
      i_begin_row             = lv_i_begin_row                          "开始行
      i_end_col               = lv_i_end_col                            "结束列
      i_end_row               = lv_i_end_row                            "结束行
    TABLES
      intern                  = lt_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE s001(00) WITH '读取 EXCEL 文件失败' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  "对固定格式的数据进一步处理,以存放至数据库表格中。
  LOOP AT lt_excel.
    ASSIGN COMPONENT lt_excel-col OF STRUCTURE l_wa TO <lfs_value>.
    "系统将字符串LT_EXCEL-COL的组件L_WA分配给字段符号<LFS_VALUE>
    IF sy-subrc = 0 .
      <lfs_value> = lt_excel-value.
    ENDIF.
    AT END OF row.
      APPEND l_wa TO l_tab.
      CLEAR l_wa.
    ENDAT.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& ALV字段显示
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat CHANGING VALUE(ot_fieldcat) TYPE lvc_t_fcat.
  DATA:lv_Unit_price TYPE char20.
  DATA:l_pos       TYPE i VALUE 2,
       ls_fieldcat TYPE lvc_s_fcat.
  DEFINE alv_append_field.
    CLEAR ls_fieldcat.
    ls_fieldcat-col_pos = l_pos.
    ls_fieldcat-fieldname = &1 .
    ls_fieldcat-reptext = &2 .
    APPEND ls_fieldcat TO ot_fieldcat.
    l_pos = l_pos + 1 .
  END-OF-DEFINITION.
  "拼接 Unit_price
  REFRESH ot_fieldcat.
  CLEAR gs_fieldcat.
  ls_fieldcat-fieldname = 'CHECKBOX'.   "多选框
  ls_fieldcat-reptext   = '请选择'.     "文本
  ls_fieldcat-edit      = 'X'.          "可编辑
  ls_fieldcat-checkbox  = 'X'.          "多选
  APPEND ls_fieldcat TO ot_fieldcat.
*ALV显示EXCEL模板字段值
  ALV_APPEND_FIELD 'STATE'           '状态' .
  ALV_APPEND_FIELD 'MESSAGE'         '消息' .
  ALV_APPEND_FIELD 'BNAME'           '账号名' .
  ALV_APPEND_FIELD 'NAME_LAST'       '用户名' .
  ALV_APPEND_FIELD 'PASSWORD'        '密码' .
  ALV_APPEND_FIELD 'FUNCTION'        '职能' .
  ALV_APPEND_FIELD 'DEPARTMENT'      '部门' .
  ALV_APPEND_FIELD 'PROFILE'         '权限' .
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_layout
*&---------------------------------------------------------------------*
*& ALV页面显示
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  CLEAR gs_layout.
  gs_layout-zebra      = 'X'.                                           "斑马线显示
  gs_layout-cwidth_opt = 'X'.                                           "自适应宽度
  gs_layout-sel_mode   = 'A'.                                           "选择模式:多选/单选
ENDFORM.

*&---------------------------------------------------------------------*
*& Form fem_display
*&---------------------------------------------------------------------*
*& 调用ALV函数
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid                               "按钮
      i_callback_pf_status_set = 'SET_PF_STATUS'                        "按钮
      i_callback_user_command  = 'ALV_USER_COMMAND'                     "按钮
      is_layout_lvc            = gs_layout                              "layout工作区
      it_fieldcat_lvc          = gt_fieldcat                            "fieldcat结构
      i_save                   = 'A'                                    "保存
    TABLES
      t_outtab                 = gt_itab[]                              "取gt_itab取数
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*       "添加STANDARD  GUI
*----------------------------------------------------------------------*
FORM set_pf_status USING pt_exclude TYPE kkblo_t_extab.
  DATA:lt_exclude TYPE kkblo_t_extab WITH HEADER LINE.
  SET PF-STATUS 'STANDARD' EXCLUDING lt_exclude[].
ENDFORM.

*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*       按钮事件
*----------------------------------------------------------------------*
FORM alv_user_command USING r_ucomm LIKE sy-ucomm
                rs_selfield TYPE slis_selfield.
  DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.
  CALL METHOD ref_grid->check_changed_data. "更改
  CALL METHOD ref_grid->refresh_table_display. "刷新内表

  CASE r_ucomm.
    WHEN '&ALL1'.                                                       "全选
      LOOP AT gt_itab[] ASSIGNING <fs_itab>." INTO gt_itab."
        <fs_itab>-checkbox  = 'X'.
      ENDLOOP.
    WHEN '&SAL1'.                                                       "取消全选
      LOOP AT gt_itab[] ASSIGNING <fs_itab>.
        <fs_itab>-checkbox  = ''.
      ENDLOOP.
    WHEN 'SET'.
      PERFORM frm_bipi.                                                 "调用BAPI
      PERFORM re_alv.                                                   "刷新ALV
  ENDCASE.

  CALL METHOD ref_grid->check_changed_data.
  CALL METHOD ref_grid->refresh_table_display. " 刷新
  rs_selfield-refresh = 'X'.                                            "刷新内表

ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  FRM_CO01_BIPI
*&---------------------------------------------------------------------*
*       BAPI
*----------------------------------------------------------------------*
FORM frm_bipi.

  "声明BAPI相关参数
  DATA: ls_username  LIKE bapibname,                                         "账户名
        ls_password  LIKE bapipwd,                                           "密码
        ls_logondata LIKE bapilogond,                                        "登录数据
        ls_address   LIKE bapiaddr3,                                         "用户名
        lt_profile   TYPE TABLE OF bapiprof,
        ls_profile   LIKE LINE OF lt_profile,
        lt_return    LIKE STANDARD TABLE OF bapiret2 WITH HEADER LINE,       "返回值
        ls_return    LIKE LINE OF lt_return.
  DATA: lv_username  LIKE bapibname-bapibname.
  DATA: lv_dest      TYPE rfcdest.

  DATA: lv_errmsg TYPE string,
        lv_msg    TYPE string,
        message1  TYPE string.

  "循环gt_itab中checkbox = 'X' AND state <> 'E'条件的值
  LOOP AT gt_itab ASSIGNING <fs_itab> WHERE checkbox = 'X'." AND state <> 'E'.

    "数据赋值
    ls_username-bapibname     = <fs_itab>-bname.                            "账户名
    ls_logondata-ustyp        = 'A'.                                        "用户类型
    ls_password-bapipwd       = <fs_itab>-password.                         "密码
    ls_address-lastname       = <fs_itab>-name_last.                        "姓名
    ls_address-function       = <fs_itab>-function.                         "职能
    ls_address-department     = <fs_itab>-department.                       "部门

*初始化相应的变量
    CLEAR: lt_return[] , ls_return , lt_profile[] , ls_profile.
    CLEAR:<fs_itab>-state.
    CLEAR:<fs_itab>-message.                                                "清空消息字段

*创建用户
    CALL FUNCTION 'BAPI_USER_CREATE1'
      EXPORTING
        username  = ls_username
        logondata = ls_logondata
        password  = ls_password
        address   = ls_address
      TABLES
        return    = lt_return.

    "执行结果信息处理
    CLEAR lv_errmsg.
    LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
      CLEAR lv_msg.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'                                   "调用消息函数
        EXPORTING
          msgid               = lt_return-id
          msgnr               = lt_return-number
          msgv1               = lt_return-message_v1
          msgv2               = lt_return-message_v2
          msgv3               = lt_return-message_v3
          msgv4               = lt_return-message_v4
        IMPORTING
          message_text_output = lv_msg.

      lv_errmsg = |{ lv_errmsg }{ lv_msg };|.
    ENDLOOP.

    READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
    IF sy-subrc = 0.
        "回滚事务
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        <fs_itab>-state   = ls_return-type.
        <fs_itab>-message = lv_errmsg.
    ELSE.
      REFRESH:lt_return.
        lv_username = <fs_itab>-bname.
        ls_profile-bapiprof  = <fs_itab>-profile.
        ls_profile-bapitype  = 'C'.
        ls_profile-bapiaktps = 'X'.
        APPEND ls_profile TO lt_profile.
        "用户权限
        CALL FUNCTION 'BAPI_USER_PROFILES_ASSIGN' DESTINATION lv_dest
          EXPORTING
            username = lv_username
          TABLES
            profiles = lt_profile
            return   = lt_return.
        READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
        IF sy-subrc = 0.
          WRITE '将配置文件分配给用户错误'.
        ELSE.
        ENDIF.
    ENDIF.
    IF lv_errmsg IS NOT INITIAL.
      "回滚事务
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      <fs_itab>-state   = ls_return-type.
      <fs_itab>-message = lv_errmsg.
    ELSE.
      "提交事务
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
      <fs_itab>-state    = 'S'.
      <fs_itab>-message  = '创建成功'.
    ENDIF.

  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  re_alv
*&---------------------------------------------------------------------*
*       ALV按钮事件后自动刷新列宽度
*----------------------------------------------------------------------*
FORM re_alv.
  DATA:lv_grid   TYPE REF TO cl_gui_alv_grid,
       ls_layout TYPE lvc_s_layo. "这一句很关键
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lv_grid.
* 获取ALV变化过后的布局参数
  CALL METHOD lv_grid->get_frontend_layout
    IMPORTING
      es_layout = ls_layout.

* 重新回写自适应宽度
  ls_layout-cwidth_opt = 'X'.
* 回写ALV变化过后的布局参数
  CALL METHOD lv_grid->set_frontend_layout
    EXPORTING
      is_layout = ls_layout.

* 刷新ALV布局
  CALL METHOD lv_grid->refresh_table_display.

ENDFORM.


*Messages
*----------------------------------------------------------
*
* Message class: 00
*001   &1&2&3&4&5&6&7&8

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值