ABAP 批量创建用户 分配权限

  1 *&---------------------------------------------------------------------*
  2 *& Report ZTEST_GUO
  3 *&---------------------------------------------------------------------*
  4 *&
  5 *&---------------------------------------------------------------------*
  6 REPORT ZTEST_GUO.
  7 *&---------------------------------------------------------------------*
  8 *& Report Y4_A2_R01
  9 *&---------------------------------------------------------------------*
 10 *&
 11 *&---------------------------------------------------------------------*
 12 
 13 ****************************************************************
 14 TABLES:sscrfields.    "定义按钮
 15 
 16 ***********************************************************************
 17 *
 18 *数据类型定义逻辑块
 19 *
 20 ************************************************************************
 21 "导入数据
 22 DATA: BEGIN OF gt_itab OCCURS 0,
 23         bname       LIKE suid_st_bname-bname,                           "账户名
 24         name_last   LIKE suid_st_node_person_name-name_last,            "用户名
 25         password    LIKE suid_st_node_password_ext-password,            "密码
 26         function    LIKE suid_st_node_workplace-function,               "岗位
 27         department  LIKE suid_st_node_workplace-department,             "部门
 28         profile     LIKE suid_st_node_profile-profile,                  "参数文件名
 29         state(1),                                                       "状态
 30         message     TYPE  string,                                       "消息文本
 31         checkbox(1),
 32       END OF gt_itab.
 33 
 34 "定义指针
 35 FIELD-SYMBOLS <fs_itab> LIKE gt_itab.
 36 
 37 "ALV
 38 DATA:
 39   "主要属性
 40   gt_fieldcat TYPE lvc_t_fcat,    "字段目录
 41   gs_fieldcat TYPE lvc_s_fcat,    "字段目录
 42   gs_layout   TYPE lvc_s_layo,    "布局结构
 43   "次要属性
 44   gs_glay     TYPE lvc_s_glay.    "网格设置
 45 
 46 ************************************************************************
 47 *
 48 *选择界面程序逻辑块
 49 *
 50 ************************************************************************
 51 
 52 PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY.                     "选择路径
 53 
 54 "事件
 55 SELECTION-SCREEN FUNCTION KEY 1.
 56 
 57 INITIALIZATION.
 58   "点击下载模板
 59   sscrfields-functxt_01 = VALUE smp_dyntxt(
 60     icon_id = icon_mapped_relation
 61     icon_text = 'EXCEL下载模板'
 62     quickinfo = '点击下载'
 63   ).
 64 
 65 AT SELECTION-SCREEN OUTPUT.
 66   "是一个PBO事件(Process before output,屏幕加载前的事件)。
 67   LOOP AT SCREEN.
 68     IF matches( val = screen-name regex = 'P_FILE' ).
 69       screen-required = 2.
 70     ENDIF.
 71     MODIFY SCREEN.
 72   ENDLOOP.
 73 
 74 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
 75   PERFORM frm_f4_help CHANGING p_file.
 76 
 77 AT SELECTION-SCREEN.
 78   "选择文件路径
 79   CASE sscrfields-ucomm.
 80     WHEN 'FC01'.
 81       PERFORM frm_download_excel USING 'Y4_A2_006'.                     "下载 EXCEL 文件
 82     WHEN OTHERS.
 83       IF p_file IS INITIAL.
 84         MESSAGE s001(00) WITH '导入文件路径必须填写!' DISPLAY LIKE 'E'.
 85         STOP.
 86       ELSE.
 87         PERFORM frm_read_excel TABLES gt_itab[] USING p_file 1 2 6 10000 CHANGING gt_itab.
 88 *        PERFORM frm_jiaoyan.                                           "校验数据
 89         PERFORM frm_set_fieldcat CHANGING gt_fieldcat.                  "设置字段目录   给ALV FIELDCAT 赋值
 90         PERFORM frm_layout.                                             "设置布局
 91         PERFORM frm_display.                                            "显示ALV
 92       ENDIF.
 93   ENDCASE.
 94 
 95 *&---------------------------------------------------------------------*
 96 *&      FORM  FRM_F4_HELP
 97 *&---------------------------------------------------------------------*
 98 *       打开文件路径
 99 *----------------------------------------------------------------------*
100 *  -->  P1        TEXT
101 *  <--  P2        TEXT
102 *----------------------------------------------------------------------*
103 FORM frm_f4_help CHANGING o_fname TYPE rlgrap-filename.
104   DATA: lv_filetab TYPE filetable,
105         lv_waftab  LIKE LINE OF lv_filetab,
106         lv_rc      TYPE i.
107 
108   CALL METHOD cl_gui_frontend_services=>file_open_dialog
109     EXPORTING
110       window_title            = '打开文件'
111       initial_directory       = 'C:/'
112     CHANGING
113       file_table              = lv_filetab
114       rc                      = lv_rc
115 *     USER_ACTION             =
116 *     FILE_ENCODING           =
117     EXCEPTIONS
118       file_open_dialog_failed = 1
119       cntl_error              = 2
120       error_no_gui            = 3
121       not_supported_by_gui    = 4
122       OTHERS                  = 5.
123   IF sy-subrc <> 0.
124     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
125                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
126     EXIT.
127   ELSE.
128     READ TABLE lv_filetab INTO lv_waftab INDEX 1.
129     o_fname = lv_waftab-filename.
130     CLEAR: lv_filetab,
131            lv_waftab.
132   ENDIF.
133 
134 ENDFORM. " FRM_F4_HELP
135 *&---------------------------------------------------------------------*
136 *&      FORM  FRM_DOWNLOAD_EXCEL
137 *&---------------------------------------------------------------------*
138 *       下载EXCEL模版
139 *----------------------------------------------------------------------*
140 *  -->  P1        TEXT
141 *  <--  P2        TEXT
142 *----------------------------------------------------------------------*
143 FORM frm_download_excel USING lv_objid TYPE wwwdatatab-objid.
144   DATA: l_filename  TYPE string,
145         lv_filename TYPE string,
146         lv_path     TYPE string,
147         lv_fullpath TYPE string.
148 
149   DATA: lv_obj         LIKE wwwdatatab,
150         lv_destination LIKE rlgrap-filename.
151   DATA: lv_rc  LIKE sy-subrc.
152   DATA: lv_error TYPE char255.
153 
154   SELECT SINGLE * FROM wwwdata
155     INTO CORRESPONDING FIELDS OF lv_obj
156     WHERE objid = lv_objid.
157 
158   CONCATENATE lv_obj-text '.XLSX' INTO l_filename.
159 
160   CALL METHOD cl_gui_frontend_services=>file_save_dialog
161     EXPORTING
162       default_file_name         = l_filename
163       file_filter               = cl_gui_frontend_services=>filetype_excel
164       prompt_on_overwrite       = 'X'
165     CHANGING
166       filename                  = lv_filename
167       path                      = lv_path
168       fullpath                  = lv_fullpath
169     EXCEPTIONS
170       cntl_error                = 1
171       error_no_gui              = 2
172       not_supported_by_gui      = 3
173       invalid_default_file_name = 4
174       OTHERS                    = 5.
175 
176   IF lv_fullpath <> ''.
177     lv_destination = lv_fullpath.
178     CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
179       EXPORTING
180         key         = lv_obj
181         destination = lv_destination
182       IMPORTING
183         rc          = lv_rc.
184   ENDIF.
185 
186 ENDFORM.
187 
188 *&---------------------------------------------------------------------*
189 *&      FORM  FRM_READ_EXCEL
190 *&---------------------------------------------------------------------*
191 *       调用上传文件函数
192 *----------------------------------------------------------------------*
193 *FORM frm_read_excel TABLES l_tab
194 *  USING pv_file TYPE rlgrap-filename
195 *        lv_i_begin_col TYPE i
196 *        lv_i_begin_row TYPE i
197 *        lv_i_end_col TYPE i
198 *        lv_i_end_row TYPE i
199 *  CHANGING l_wa TYPE any.
200 *
201 *  DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
202 *  FIELD-SYMBOLS <lfs_value> TYPE any.
203 *
204 *  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
205 *    EXPORTING
206 *      filename                = pv_file                                  "文件路径
207 *      i_begin_col             = lv_i_begin_col                           "开始列
208 *      i_begin_row             = lv_i_begin_row                           "开始行
209 *      i_end_col               = lv_i_end_col                             "结束列
210 *      i_end_row               = lv_i_end_row                             "结束行
211 *    TABLES
212 *      intern                  = lt_excel
213 *    EXCEPTIONS
214 *      inconsistent_parameters = 1
215 *      upload_ole              = 2
216 *      OTHERS                  = 3.
217 *  IF sy-subrc <> 0.
218 *    MESSAGE s001(00) WITH '读取 EXCEL 文件失败' DISPLAY LIKE 'E'.
219 *    STOP.
220 *  ENDIF.
221 *
222 *  "对固定格式的数据进一步处理,以存放至数据库表格中。
223 *  LOOP AT lt_excel.
224 *    ASSIGN COMPONENT lt_excel-col OF STRUCTURE l_wa TO <lfs_value>.
225 *    "系统将字符串lt_excel-col的组件l_wa分配给字段符号<lfs_value>
226 *    IF sy-subrc = 0 .
227 *      <lfs_value> = lt_excel-value.
228 *    ENDIF.
229 *    AT END OF row.
230 *      APPEND l_wa TO l_tab.
231 *      CLEAR l_wa.
232 *    ENDAT.
233 *  ENDLOOP.
234 *ENDFORM.
235 
236 
237 FORM frm_read_excel TABLES l_tab
238   USING pv_file TYPE rlgrap-filename
239         lv_i_begin_col TYPE i
240         lv_i_begin_row TYPE i
241         lv_i_end_col TYPE i
242         lv_i_end_row TYPE i
243   CHANGING l_wa TYPE any.
244 
245   DATA: lt_excel TYPE TABLE OF alsmex_tabline WITH HEADER LINE.
246   FIELD-SYMBOLS <lfs_value> TYPE any.
247 
248   CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
249     EXPORTING
250       filename                = pv_file                                 "文件路径
251       i_begin_col             = lv_i_begin_col                          "开始列
252       i_begin_row             = lv_i_begin_row                          "开始行
253       i_end_col               = lv_i_end_col                            "结束列
254       i_end_row               = lv_i_end_row                            "结束行
255     TABLES
256       intern                  = lt_excel
257     EXCEPTIONS
258       inconsistent_parameters = 1
259       upload_ole              = 2
260       OTHERS                  = 3.
261   IF sy-subrc <> 0.
262     MESSAGE s001(00) WITH '读取 EXCEL 文件失败' DISPLAY LIKE 'E'.
263     STOP.
264   ENDIF.
265 
266   "对固定格式的数据进一步处理,以存放至数据库表格中。
267   LOOP AT lt_excel.
268     ASSIGN COMPONENT lt_excel-col OF STRUCTURE l_wa TO <lfs_value>.
269     "系统将字符串LT_EXCEL-COL的组件L_WA分配给字段符号<LFS_VALUE>
270     IF sy-subrc = 0 .
271       <lfs_value> = lt_excel-value.
272     ENDIF.
273     AT END OF row.
274       APPEND l_wa TO l_tab.
275       CLEAR l_wa.
276     ENDAT.
277   ENDLOOP.
278 ENDFORM.
279 
280 *&---------------------------------------------------------------------*
281 *& Form FRM_FIELDCAT
282 *&---------------------------------------------------------------------*
283 *& ALV字段显示
284 *&---------------------------------------------------------------------*
285 *& -->  p1        text
286 *& <--  p2        text
287 *&---------------------------------------------------------------------*
288 FORM frm_set_fieldcat CHANGING VALUE(ot_fieldcat) TYPE lvc_t_fcat.
289   DATA:lv_Unit_price TYPE char20.
290   DATA:l_pos       TYPE i VALUE 2,
291        ls_fieldcat TYPE lvc_s_fcat.
292   DEFINE alv_append_field.
293     CLEAR ls_fieldcat.
294     ls_fieldcat-col_pos = l_pos.
295     ls_fieldcat-fieldname = &1 .
296     ls_fieldcat-reptext = &2 .
297     APPEND ls_fieldcat TO ot_fieldcat.
298     l_pos = l_pos + 1 .
299   END-OF-DEFINITION.
300   "拼接 Unit_price
301   REFRESH ot_fieldcat.
302   CLEAR gs_fieldcat.
303   ls_fieldcat-fieldname = 'CHECKBOX'.   "多选框
304   ls_fieldcat-reptext   = '请选择'.     "文本
305   ls_fieldcat-edit      = 'X'.          "可编辑
306   ls_fieldcat-checkbox  = 'X'.          "多选
307   APPEND ls_fieldcat TO ot_fieldcat.
308 *ALV显示EXCEL模板字段值
309   ALV_APPEND_FIELD 'STATE'           '状态' .
310   ALV_APPEND_FIELD 'MESSAGE'         '消息' .
311   ALV_APPEND_FIELD 'BNAME'           '账号名' .
312   ALV_APPEND_FIELD 'NAME_LAST'       '用户名' .
313   ALV_APPEND_FIELD 'PASSWORD'        '密码' .
314   ALV_APPEND_FIELD 'FUNCTION'        '职能' .
315   ALV_APPEND_FIELD 'DEPARTMENT'      '部门' .
316   ALV_APPEND_FIELD 'PROFILE'         '权限' .
317 ENDFORM.
318 
319 *&---------------------------------------------------------------------*
320 *& Form frm_layout
321 *&---------------------------------------------------------------------*
322 *& ALV页面显示
323 *&---------------------------------------------------------------------*
324 *& -->  p1        text
325 *& <--  p2        text
326 *&---------------------------------------------------------------------*
327 FORM frm_layout .
328   CLEAR gs_layout.
329   gs_layout-zebra      = 'X'.                                           "斑马线显示
330   gs_layout-cwidth_opt = 'X'.                                           "自适应宽度
331   gs_layout-sel_mode   = 'A'.                                           "选择模式:多选/单选
332 ENDFORM.
333 
334 *&---------------------------------------------------------------------*
335 *& Form fem_display
336 *&---------------------------------------------------------------------*
337 *& 调用ALV函数
338 *&---------------------------------------------------------------------*
339 *& -->  p1        text
340 *& <--  p2        text
341 *&---------------------------------------------------------------------*
342 FORM frm_display .
343   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
344     EXPORTING
345       i_callback_program       = sy-repid                               "按钮
346       i_callback_pf_status_set = 'SET_PF_STATUS'                        "按钮
347       i_callback_user_command  = 'ALV_USER_COMMAND'                     "按钮
348       is_layout_lvc            = gs_layout                              "layout工作区
349       it_fieldcat_lvc          = gt_fieldcat                            "fieldcat结构
350       i_save                   = 'A'                                    "保存
351     TABLES
352       t_outtab                 = gt_itab[]                              "取gt_itab取数
353     EXCEPTIONS
354       program_error            = 1
355       OTHERS                   = 2.
356   IF sy-subrc <> 0.
357 * Implement suitable error handling here
358   ENDIF.
359 
360 ENDFORM.
361 
362 *&---------------------------------------------------------------------*
363 *&
364 *&---------------------------------------------------------------------*
365 *       "添加STANDARD  GUI
366 *----------------------------------------------------------------------*
367 FORM set_pf_status USING pt_exclude TYPE kkblo_t_extab.
368   DATA:lt_exclude TYPE kkblo_t_extab WITH HEADER LINE.
369   SET PF-STATUS 'STANDARD' EXCLUDING lt_exclude[].
370 ENDFORM.
371 
372 *&---------------------------------------------------------------------*
373 *&
374 *&---------------------------------------------------------------------*
375 *       按钮事件
376 *----------------------------------------------------------------------*
377 FORM alv_user_command USING r_ucomm LIKE sy-ucomm
378                 rs_selfield TYPE slis_selfield.
379   DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
380   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
381     IMPORTING
382       e_grid = ref_grid.
383   CALL METHOD ref_grid->check_changed_data. "更改
384   CALL METHOD ref_grid->refresh_table_display. "刷新内表
385 
386   CASE r_ucomm.
387     WHEN '&ALL1'.                                                       "全选
388       LOOP AT gt_itab[] ASSIGNING <fs_itab>." INTO gt_itab."
389         <fs_itab>-checkbox  = 'X'.
390       ENDLOOP.
391     WHEN '&SAL1'.                                                       "取消全选
392       LOOP AT gt_itab[] ASSIGNING <fs_itab>.
393         <fs_itab>-checkbox  = ''.
394       ENDLOOP.
395     WHEN 'SET'.
396       PERFORM frm_bipi.                                                 "调用BAPI
397       PERFORM re_alv.                                                   "刷新ALV
398   ENDCASE.
399 
400   CALL METHOD ref_grid->check_changed_data.
401   CALL METHOD ref_grid->refresh_table_display. " 刷新
402   rs_selfield-refresh = 'X'.                                            "刷新内表
403 
404 ENDFORM.
405 
406 *&---------------------------------------------------------------------*
407 *&      FORM  FRM_CO01_BIPI
408 *&---------------------------------------------------------------------*
409 *       BAPI
410 *----------------------------------------------------------------------*
411 FORM frm_bipi.
412 
413   "声明BAPI相关参数
414   DATA: ls_username  LIKE bapibname,                                         "账户名
415         ls_password  LIKE bapipwd,                                           "密码
416         ls_logondata LIKE bapilogond,                                        "登录数据
417         ls_address   LIKE bapiaddr3,                                         "用户名
418         lt_profile   TYPE TABLE OF bapiprof,
419         ls_profile   LIKE LINE OF lt_profile,
420         lt_return    LIKE STANDARD TABLE OF bapiret2 WITH HEADER LINE,       "返回值
421         ls_return    LIKE LINE OF lt_return.
422   DATA: lv_username  LIKE bapibname-bapibname.
423   DATA: lv_dest      TYPE rfcdest.
424 
425   DATA: lv_errmsg TYPE string,
426         lv_msg    TYPE string,
427         message1  TYPE string.
428 
429   "循环gt_itab中checkbox = 'X' AND state <> 'E'条件的值
430   LOOP AT gt_itab ASSIGNING <fs_itab> WHERE checkbox = 'X'." AND state <> 'E'.
431 
432     "数据赋值
433     ls_username-bapibname     = <fs_itab>-bname.                            "账户名
434     ls_logondata-ustyp        = 'A'.                                        "用户类型
435     ls_password-bapipwd       = <fs_itab>-password.                         "密码
436     ls_address-lastname       = <fs_itab>-name_last.                        "姓名
437     ls_address-function       = <fs_itab>-function.                         "职能
438     ls_address-department     = <fs_itab>-department.                       "部门
439 
440 *初始化相应的变量
441     CLEAR: lt_return[] , ls_return , lt_profile[] , ls_profile.
442     CLEAR:<fs_itab>-state.
443     CLEAR:<fs_itab>-message.                                                "清空消息字段
444 
445 *创建用户
446     CALL FUNCTION 'BAPI_USER_CREATE1'
447       EXPORTING
448         username  = ls_username
449         logondata = ls_logondata
450         password  = ls_password
451         address   = ls_address
452       TABLES
453         return    = lt_return.
454 
455     "执行结果信息处理
456     CLEAR lv_errmsg.
457     LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
458       CLEAR lv_msg.
459       CALL FUNCTION 'MESSAGE_TEXT_BUILD'                                   "调用消息函数
460         EXPORTING
461           msgid               = lt_return-id
462           msgnr               = lt_return-number
463           msgv1               = lt_return-message_v1
464           msgv2               = lt_return-message_v2
465           msgv3               = lt_return-message_v3
466           msgv4               = lt_return-message_v4
467         IMPORTING
468           message_text_output = lv_msg.
469 
470       lv_errmsg = |{ lv_errmsg }{ lv_msg };|.
471     ENDLOOP.
472 
473     READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
474     IF sy-subrc = 0.
475         "回滚事务
476         CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
477         <fs_itab>-state   = ls_return-type.
478         <fs_itab>-message = lv_errmsg.
479     ELSE.
480       REFRESH:lt_return.
481         lv_username = <fs_itab>-bname.
482         ls_profile-bapiprof  = <fs_itab>-profile.
483         ls_profile-bapitype  = 'C'.
484         ls_profile-bapiaktps = 'X'.
485         APPEND ls_profile TO lt_profile.
486         "用户权限
487         CALL FUNCTION 'BAPI_USER_PROFILES_ASSIGN' DESTINATION lv_dest
488           EXPORTING
489             username = lv_username
490           TABLES
491             profiles = lt_profile
492             return   = lt_return.
493         READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
494         IF sy-subrc = 0.
495           WRITE '将配置文件分配给用户错误'.
496         ELSE.
497         ENDIF.
498     ENDIF.
499     IF lv_errmsg IS NOT INITIAL.
500       "回滚事务
501       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
502       <fs_itab>-state   = ls_return-type.
503       <fs_itab>-message = lv_errmsg.
504     ELSE.
505       "提交事务
506       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
507         EXPORTING
508           wait = 'X'.
509       <fs_itab>-state    = 'S'.
510       <fs_itab>-message  = '创建成功'.
511     ENDIF.
512 
513   ENDLOOP.
514 ENDFORM.
515 
516 *&---------------------------------------------------------------------*
517 *&      FORM  re_alv
518 *&---------------------------------------------------------------------*
519 *       ALV按钮事件后自动刷新列宽度
520 *----------------------------------------------------------------------*
521 FORM re_alv.
522   DATA:lv_grid   TYPE REF TO cl_gui_alv_grid,
523        ls_layout TYPE lvc_s_layo. "这一句很关键
524   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
525     IMPORTING
526       e_grid = lv_grid.
527 * 获取ALV变化过后的布局参数
528   CALL METHOD lv_grid->get_frontend_layout
529     IMPORTING
530       es_layout = ls_layout.
531 
532 * 重新回写自适应宽度
533   ls_layout-cwidth_opt = 'X'.
534 * 回写ALV变化过后的布局参数
535   CALL METHOD lv_grid->set_frontend_layout
536     EXPORTING
537       is_layout = ls_layout.
538 
539 * 刷新ALV布局
540   CALL METHOD lv_grid->refresh_table_display.
541 
542 ENDFORM.
543 
544 
545 *Messages
546 *----------------------------------------------------------
547 *
548 * Message class: 00
549 *001   &1&2&3&4&5&6&7&8
View Code

导入模板

 

posted @ 2023-10-10 09:43  年轻的小菜鸟  阅读(89)  评论(0编辑  收藏  举报