User Tools

Site Tools


programming:abap:create_standard_user

Create Standard User

If you have no a central user administration, this report can help. It can create users reading one of the two sources:

  • a CSV file
  • another SAP system

CSV as source

The CSV layout is quite simple and it's possible to specify many different roles for each user.
In the table below the record layout:

Field Note
LogonID Can be simple (userid) or in User Principal Name format (userid@my_domain)
First Name
Last Name
Email address
Role List Roles separated by $ - e.g. ROLE1$ROLE2$ROLE3

SAP system as source

Another way is to get the user list from a SAP system - this is useful to replicate the same R/3 users in BW, for example.
In this case the roles must be specified in the selection screen, because it's quite sure that R/3 and BW roles will be different.
Obviously all created users will have the same roles - you can specify only common roles and refine every single user after they will be created.

Below the parameters:


Here the source code:

*&---------------------------------------------------------------------*
*& Report  Z_CREATE_STANDARD_USER
*&---------------------------------------------------------------------*
*&  Create Standard User
*&---------------------------------------------------------------------*
*&  IperCube 2008
*&---------------------------------------------------------------------*
 
REPORT  z_create_standard_user.
 
DATA: tab_users         TYPE STANDARD TABLE OF txt255.
DATA: tab_portal_users  TYPE STANDARD TABLE OF txt255.
 
DATA: v_file TYPE string.
DATA: w_area TYPE txt255.
DATA: wa_bname TYPE xubname.
DATA: wa_agr_name TYPE agr_name.
 
* Strutture for passing params to form
DATA: BEGIN OF zuser_list_str,
  logon_id   TYPE	xubname,
  firstname  TYPE  ad_namefir,
  lastname   TYPE	ad_namelas,
  e_mail     TYPE	ad_smtpadr,
  fullname   TYPE	ad_namtext,
  department TYPE	ad_dprtmnt,
END OF zuser_list_str.
 
DATA: szmessage(100).
 
DATA: logon_id   TYPE string,
      firstname  TYPE string,
      lastname   TYPE string,
      email      TYPE string,
      role_list  TYPE string.
 
***********************************************************************
*  Parameters and Checks
***********************************************************************
 
* Source User list params
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title_b1.
 
SELECTION-SCREEN SKIP.
PARAMETERS: p_txt     RADIOBUTTON GROUP rad1 DEFAULT 'X'.
SELECTION-SCREEN ULINE /1(79).
PARAMETERS: p_file(100) LOWER CASE.
SELECTION-SCREEN COMMENT /33(79) comm1 FOR FIELD p_file.
PARAMETERS: p_dept TYPE ad_dprtmnt LOWER CASE.
 
SELECTION-SCREEN SKIP.
PARAMETERS: p_r3      RADIOBUTTON GROUP rad1.
SELECTION-SCREEN ULINE /1(79).
PARAMETERS: p_date TYPE sy-datum DEFAULT sy-datum.
SELECT-OPTIONS s_users FOR wa_bname NO INTERVALS.
PARAMETERS: p_dest TYPE rfcdes-rfcdest.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN ULINE /1(79).
PARAMETERS: p_test AS CHECKBOX DEFAULT 'X'.
 
SELECTION-SCREEN END OF BLOCK b1.
 
* User params
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE title_b2.
 
PARAMETERS: p_role AS CHECKBOX DEFAULT 'X'.
SELECT-OPTIONS s_roles FOR wa_agr_name NO INTERVALS DEFAULT 'Z_SERVICE'.
PARAMETERS: p_ustyp TYPE xuustyp LOWER CASE DEFAULT 'C'.
PARAMETERS: p_pwd TYPE xuncode LOWER CASE DEFAULT 'init123456'.
 
SELECTION-SCREEN END OF BLOCK b2.
 
* File for SAP Portal
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE title_b3.
SELECTION-SCREEN SKIP.
PARAMETERS: p_file1(100) LOWER CASE.
SELECTION-SCREEN COMMENT /33(79) comm2 FOR FIELD p_file1.
SELECTION-SCREEN END OF BLOCK b3.
 
* Init Costants
INITIALIZATION.
  title_b1 = 'Select the Source for user creation'.
  title_b2 = 'Additional parameters for user creation'.
  title_b3 = 'Text file for SAP Portal (language), blank = don''t create'.
  comm1 = 'Record layout: LogonID;FirstName;LastName;Email;Roles List(separated by $)'.
  comm2 = 'Upload in SAP Portal via function "User Administration-->Import"'.
 
  CONCATENATE 'C:\Profiles\Portal_Users_' sy-datum '_' sy-uzeit '.txt' INTO p_file1.
 
* Check on Source for user creation
AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1.
 
* Check on text CSV file
  IF p_txt = 'X'.
    IF p_file IS INITIAL.
      MESSAGE w888(sabapdocu) WITH 'Users list file mandatory !'.
    ENDIF.
  ENDIF.
 
* Check on User List from SAP
  IF p_r3 = 'X'.
 
    IF p_date IS INITIAL AND s_users[] IS INITIAL.
      MESSAGE w888(sabapdocu) WITH 'Insert the starting date or the user list !'.
    ENDIF.
    IF p_date IS NOT INITIAL AND s_users[] IS NOT INITIAL.
      MESSAGE w888(sabapdocu) WITH 'Insert the starting date OR the user list !'.
    ENDIF.
 
    IF p_dest IS INITIAL.
      MESSAGE w888(sabapdocu) WITH 'Insert an RFC Destination !'.
    ENDIF.
 
  ENDIF.
 
* If roles entered, clear flag "Roles from CSV"
AT SELECTION-SCREEN.
  IF s_roles[] IS NOT INITIAL.
    CLEAR p_role.
  ENDIF.
 
* Help CSV file upload
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM help_file USING 'O' CHANGING p_file.
 
* Help for Date
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_date.
  PERFORM help_data.
 
* Help for RFC Destination
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dest.
  PERFORM help_rfcdest.
 
* Help for SAP Portal Text file download
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1.
  PERFORM help_file USING 'S' CHANGING p_file1.
 
***********************************************************************
START-OF-SELECTION.
***********************************************************************
 
* Get User List from CSV file
  IF p_txt = 'X' AND p_file IS NOT INITIAL.
    PERFORM load_users_file.
  ENDIF.
 
* Get User List from SAP
  IF p_r3 = 'X'.
    PERFORM load_sap_users.
  ENDIF.
 
*  Download Text file for SAP Portal if requested
  IF p_file1 IS NOT INITIAL.
    PERFORM download_portal_file.
  ENDIF.
 
*&---------------------------------------------------------------------*
*&      Form  load_users_file
*&---------------------------------------------------------------------*
*       Upload File
*----------------------------------------------------------------------*
FORM load_users_file.
 
  DATA: user_domain TYPE string.
  DATA: domain      TYPE string.
  DATA: p_get_user(1) VALUE 'N'.
 
  DATA: wa_user LIKE zuser_list_str.
 
  v_file = p_file.
 
  CALL METHOD cl_gui_frontend_services=>gui_upload
    EXPORTING
      filename                = v_file
      filetype                = 'ASC'
    CHANGING
      data_tab                = tab_users
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      not_supported_by_gui    = 17
      error_no_gui            = 18
      OTHERS                  = 19.
 
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 
  " List header
  IF p_test IS NOT INITIAL.
    WRITE / '**** TEST MODE ****  User List from CSV file'.
  ELSE.
    WRITE / '**** PRODUCTION MODE ****  User List CSV file'.
  ENDIF.
  ULINE.
 
* Split fields, create users
  LOOP AT tab_users INTO w_area.
 
    SPLIT w_area AT ';' INTO user_domain firstname lastname email role_list.
    SPLIT user_domain AT '@' INTO logon_id domain.
    TRANSLATE logon_id TO UPPER CASE.
 
    " Create users
    CLEAR wa_user.
    wa_user-logon_id = logon_id.
    wa_user-firstname  = firstname.
    wa_user-lastname = lastname.
    wa_user-e_mail = email.
    wa_user-department = p_dept.
    CONCATENATE wa_user-firstname  wa_user-lastname INTO wa_user-fullname SEPARATED BY space.
 
    IF p_test IS INITIAL.
      " Create User
      PERFORM create_user USING wa_user p_get_user.
      " Add entry to text file for SAP Portal
      PERFORM build_portal_entry USING wa_user-logon_id.
    ELSE.
      WRITE: / wa_user-logon_id, wa_user-firstname, wa_user-lastname, wa_user-e_mail, wa_user-department.
    ENDIF.
 
  ENDLOOP.
 
ENDFORM.                    " load_file
 
 
*&---------------------------------------------------------------------*
*&      Form  load_sap_users
*&---------------------------------------------------------------------*
*       Get Users List from SAP System
*----------------------------------------------------------------------*
FORM load_sap_users.
 
  DATA: user_detail     TYPE TABLE OF usr02 WITH HEADER LINE.
  DATA: wa_user         LIKE zuser_list_str.
  DATA: address         LIKE  bapiaddr3.
  DATA: defaults        LIKE  bapidefaul.
  DATA: activitygroups  TYPE TABLE OF  bapiagr    WITH HEADER LINE.
  DATA: groups          TYPE TABLE OF  bapigroups WITH HEADER LINE.
  DATA: return          TYPE TABLE OF  bapiret2   WITH HEADER LINE.
  DATA: tab_param       TYPE TABLE OF  bapiparam1 WITH HEADER LINE.
  DATA: p_get_user(1)  VALUE 'Y'.
 
  " Get User List
  CALL FUNCTION 'Z_USER_LIST_GET' DESTINATION p_dest
    EXPORTING
      creation_date_start = p_date
    TABLES
      user_list           = s_users
      user_detail         = user_detail.
 
  " List header
  IF p_test IS NOT INITIAL.
    WRITE / '**** TEST MODE ****  User List from SAP'.
  ELSE.
    WRITE / '**** PRODUCTION MODE ****  User List from SAP'.
  ENDIF.
  ULINE.
 
  " Loop on User list
  LOOP AT user_detail.
 
    MOVE-CORRESPONDING user_detail TO wa_user.
    wa_user-logon_id = user_detail-bname.
 
    IF p_test IS INITIAL.
      " Create User
      PERFORM create_user USING wa_user p_get_user.
      " Add entry to text file for SAP Portal
      PERFORM build_portal_entry USING user_detail-bname.
    ELSE.
      WRITE / user_detail-bname.
    ENDIF.
 
  ENDLOOP.
 
ENDFORM.                    "load_sap_users
 
*&---------------------------------------------------------------------*
*&      Form  Create_User
*&---------------------------------------------------------------------*
*       Create User
*----------------------------------------------------------------------*
FORM create_user USING p_user STRUCTURE zuser_list_str
                       p_get_user.
 
  DATA: wa_usr02     LIKE usr02.
  DATA: address   LIKE bapiaddr3.
  DATA: logondata LIKE bapilogond.
  DATA: defaults  TYPE bapidefaul.
 
  DATA: username TYPE xubname.
  DATA: password TYPE bapipwd.
  DATA: wa_activitygroups TYPE bapiagr.
  DATA: activitygroups TYPE TABLE OF bapiagr    WITH HEADER LINE.
  DATA: groups         TYPE TABLE OF bapigroups WITH HEADER LINE.
  DATA: tab_param      TYPE TABLE OF bapiparam1 WITH HEADER LINE.
  DATA: return         TYPE TABLE OF bapiret2   WITH HEADER LINE.
 
 
* Test if user already created
  SELECT SINGLE * FROM usr02 INTO wa_usr02 WHERE bname = p_user-logon_id.
  IF sy-subrc IS INITIAL.
    CONCATENATE '******* User' p_user-logon_id
                'already created !! Anyway, added entry to file for SAP Portal (if specified).'
           INTO szmessage SEPARATED BY space.
    WRITE / szmessage.
    SKIP.
    EXIT.
  ENDIF.
 
  "If requested, gets user info from SAP, otherwise uses the received
  IF p_get_user = 'Y'.
 
    "I need only a subset of info from SAP
    CALL FUNCTION 'BAPI_USER_GET_DETAIL' DESTINATION p_dest
      EXPORTING
        username = p_user-logon_id
      IMPORTING
        defaults = defaults
        address  = address
      TABLES
        return   = return.
 
  ELSE.
 
    " Address
    MOVE-CORRESPONDING  p_user TO address.
  ENDIF.
 
  " Logon Data
  logondata-ustyp = p_ustyp.   "User Type
  username = p_user-logon_id.
  password = p_pwd.
 
  " Check Groups (received form SAP), remove if non existent
  DATA w_usergroup TYPE xuclass.
  LOOP AT groups.
    SELECT SINGLE usergroup FROM usgrp INTO w_usergroup
           WHERE usergroup = groups-usergroup.
    IF sy-subrc IS NOT INITIAL.
      DELETE groups.
    ENDIF.
  ENDLOOP.
 
  " Defaults values - override some values if received from SAP
  defaults-langu = 'E'.
  defaults-spld = 'LOCL'.
 
  address-langu_p = 'E'.
  address-langup_iso = 'EN'.
 
  IF address-lastname IS INITIAL.
    address-lastname = username.
  ENDIF.
 
  " Default Parameters - If needed
*  REFRESH tab_param.
*  tab_param-parid = 'MY_PARAMETER'.
*  tab_param-parva = 'X'.
*  APPEND tab_param.
 
  " Create User - Only with Info I need
  CALL FUNCTION 'SUSR_BAPI_USER_CREATE'
    EXPORTING
      username  = username
      logondata = logondata
      password  = password
      address   = address
      defaults  = defaults
    TABLES
      parameter = tab_param
      return    = return
      groups    = groups.
 
  "Progress
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 50
      text       = return-message.
 
  WRITE / return-message.
 
  " Assign Roles
  REFRESH activitygroups.
 
  " Check Roles source
  IF p_role IS INITIAL.                     "from Parameters
 
    LOOP AT s_roles.
      IF s_roles-low IS NOT INITIAL.
        activitygroups-agr_name = s_roles-low.
        APPEND activitygroups.
      ENDIF.
    ENDLOOP.
 
  ELSE.                                     "from Text File
 
    DATA: tab_roles  TYPE STANDARD TABLE OF txt255.
    DATA: w_role     TYPE txt255.
 
    SPLIT role_list AT '$' INTO TABLE tab_roles.
 
    LOOP AT tab_roles INTO w_role.
      IF w_role IS NOT INITIAL.
        activitygroups-agr_name = w_role.
        APPEND activitygroups.
      ENDIF.
    ENDLOOP.
 
  ENDIF.
 
  " Assign Roles
  CALL FUNCTION 'SUSR_BAPI_USER_ACTGROUPS_ASSIG'
    EXPORTING
      username       = username
    TABLES
      activitygroups = activitygroups
      return         = return.
 
  WRITE / return-message.
  SKIP.
 
  "Commit
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
 
  "Progress
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 100
      text       = return-message.
 
ENDFORM.                    "Create_User
 
*&---------------------------------------------------------------------*
*&      Form  Build_Portal_Entry
*&---------------------------------------------------------------------*
*       Add User to File for import in SAP Portal
*----------------------------------------------------------------------*
FORM build_portal_entry USING p_logon_id.
 
  w_area = '[User]'.
  APPEND w_area TO tab_portal_users.
 
  CONCATENATE 'uid=' p_logon_id INTO w_area.
  TRANSLATE w_area TO LOWER CASE.
  APPEND w_area TO tab_portal_users.
 
  "Force Language EN for users
  w_area = 'language=EN'.
  APPEND w_area TO tab_portal_users.
 
ENDFORM.                    "Build_Portal_Entry
 
*&---------------------------------------------------------------------*
*&      Form  Download_portal_file
*&---------------------------------------------------------------------*
*       Download File for import in SAP Portal
*----------------------------------------------------------------------*
FORM download_portal_file.
 
  v_file = p_file1.
 
  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      filename                = v_file
      filetype                = 'ASC'
    CHANGING
      data_tab                = tab_portal_users
    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
      not_supported_by_gui    = 22
      error_no_gui            = 23
      OTHERS                  = 24.
 
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 
ENDFORM.                    " Download_portal_file
 
*&---------------------------------------------------------------------*
*&      Form  help_file
*&---------------------------------------------------------------------*
*       Get FileName from Popup
*----------------------------------------------------------------------*
FORM help_file USING p_mode CHANGING v_file.
 
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '
      def_path         = 'C:\'
      mask             = ',Text files,*.txt;*.csv*,All files,*.*.'
      mode             = p_mode       "S=Save, O=Open
      title            = 'User List file'
    IMPORTING
      filename         = v_file
*     RC               =
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
 
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 
ENDFORM.                    " help_file
 
*&---------------------------------------------------------------------*
*&      Form  help_data
*&---------------------------------------------------------------------*
*       Get Date from Popup
*----------------------------------------------------------------------*
FORM help_data .
 
  CALL FUNCTION 'F4_DATE'
    IMPORTING
      select_date = p_date.
 
ENDFORM.                    " help_file
 
*&---------------------------------------------------------------------*
*&      Form  help_rfcdest
*&---------------------------------------------------------------------*
*       Get RFC Destination from Popup
*----------------------------------------------------------------------*
FORM help_rfcdest.
 
  CALL FUNCTION 'SCT2_GET_RFC_DESTINATION_F4'
    CHANGING
      cv_rfc_dest           = p_dest
    EXCEPTIONS
      rfc_dest_not_found    = 1
      cancel_button_pressed = 2
      OTHERS                = 3.
 
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 
ENDFORM.                    "help_rfcdest
programming/abap/create_standard_user.txt · Last modified: 2013/07/31 18:14 by IperCube