imagenation

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

批量删除用户,出具审计,并批量恢复用户。

ZUSER_COPY复制三个表数据

ZUSER01 批量删除
ZUSER_UPLOAD 创建

*&---------------------------------------------------------------------*
*& Report  ZUSER_COPY
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zuser_copy.

TABLES: usr02 ,zusr02,
        usr05,zusr05,
        agr_users,zagr_users,
        adrp,zadrp,
        adcp,zadcp,
        usr21,zusr21  ,
        smen_buffc ,zsmen_buffc.


DATA :lt_zusr02     LIKE STANDARD TABLE OF zusr02     WITH HEADER LINE .
DATA :lt_zusr05     LIKE STANDARD TABLE OF zusr05     WITH HEADER LINE.
DATA :lt_zagr_users LIKE STANDARD TABLE OF zagr_users WITH HEADER LINE.
DATA :lt_zadrp      LIKE STANDARD TABLE OF zadrp      WITH HEADER LINE.
DATA :lt_zadcp      LIKE STANDARD TABLE OF zadcp      WITH HEADER LINE.
DATA :lt_zusr21     LIKE STANDARD TABLE OF zusr21     WITH HEADER LINE.
DATA :lt_zsmen_buffc     LIKE STANDARD TABLE OF zsmen_buffc     WITH HEADER LINE.
*DATA :lt_zuser_addr LIKE STANDARD TABLE OF zuser_addr WITH HEADER LINE.


CLEAR: lt_zusr02 ,lt_zusr05,lt_zagr_users,lt_zadcp,lt_zadrp,lt_zusr21,lt_zsmen_buffc.
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zusr02     FROM  usr02 .
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zusr05     FROM  usr05 .
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zagr_users FROM  agr_users .
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zadrp      FROM  adrp  .
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zadcp      FROM  adcp .
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zusr21     FROM  usr21 .
SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zsmen_buffc     FROM  smen_buffc .
*SELECT *  INTO CORRESPONDING FIELDS OF TABLE  lt_zuser_addr FROM  user_addr .

DELETE FROM zusr02.
DELETE FROM zusr05.
DELETE FROM zagr_users.
DELETE FROM Zadrp.
DELETE FROM Zadcp.
DELETE FROM Zusr21.
DELETE FROM Zsmen_buffc.

COMMIT WORK AND WAIT.
*DELETE FROM Zuser_addr.

INSERT zusr02 FROM TABLE lt_zusr02.
IF sy-subrc .
  WRITE:'ZUSR02 更新成功 '.
ELSE.
  WRITE:'ZUSR02 更新失败'.
ENDIF.

INSERT zusr05 FROM TABLE lt_zusr05.
IF sy-subrc .
  WRITE:'ZUSR05 更新成功 '.
ELSE.
  WRITE:'ZUSR05 更新失败'.
ENDIF.

INSERT zagr_users FROM TABLE lt_zagr_users.
IF sy-subrc .
  WRITE:'ZAGR_USERS 更新成功 '.
ELSE.
  WRITE:'ZAGR_USERS 更新失败'.
ENDIF.

INSERT zadrp FROM TABLE lt_zadrp.
IF sy-subrc .
  WRITE:'ZADRP 更新成功 '.
ELSE.
  WRITE:'ZADRP 更新失败'.
ENDIF.

INSERT zadcp FROM TABLE lt_zadcp.
IF sy-subrc .
  WRITE:'ZADCP 更新成功 '.
ELSE.
  WRITE:'ZADCP 更新失败'.
ENDIF.

INSERT zusr21 FROM TABLE lt_zusr21.
IF sy-subrc .
  WRITE:'ZUSR21 更新成功 '.
ELSE.
  WRITE:'ZUSR21 更新失败'.
ENDIF.

INSERT zsmen_buffc FROM TABLE lt_zsmen_buffc.
IF sy-subrc .
  WRITE:'ZSMEN_BUFFC 更新成功 '.
ELSE.
  WRITE:'ZSMEN_BUFFC 更新失败'.
ENDIF.


COMMIT WORK AND WAIT.


*LOOP AT lt_zuser_addr.
*  MODIFY ZUSER_ADDR FROM LT_ZUSER_ADDR.
*  IF sy-subrc = 0 .
*  WRITE:'ZUSER_ADDR 更新成功 '.
*ELSE.
*  WRITE:'ZUSER_ADDR 更新失败'.
*ENDIF.
*ENDLOOP.

*INSERT zuser_addr FROM TABLE lt_zuser_addr.
*IF sy-subrc = 0 .
*  WRITE:'ZUSER_ADDR 更新成功 '.
*ELSE.
*  WRITE:'ZUSER_ADDR 更新失败'.
*ENDIF.



*SELECT * INTO ZUSR02 FROM  USR02.
*insert into ZUSR02 select * from USR02 .

 

*&---------------------------------------------------------------------*
*& REPORT  ZUSER01
*&
*&---------------------------------------------------------------------*
*& 批量分配用户角色
*& CREATE BY HULIANFEI 20131016
*&---------------------------------------------------------------------*

REPORT ZUSER01.

TABLES: USR01"用户主记录 (运行时数据)
        USR21"分配用户名称地址码
        ADRP,  "个人(办公地址管理)
*        AGR_USERS, "分配角色到用户
        SSCRFIELDS"选择屏幕上的字段,用于获取选择的按钮对象

CONSTANTS: C_YES    TYPE VALUE 'X',                           "是否下载
           G_FILEN  TYPE WWWDATATAB-OBJID VALUE 'Z_USER_EXCEL'"EXCEL下载模板名称

*定义文件名称和类型变量(文件上传)
DATA: FILENAME     TYPE LOCALFILE,                              "文件路径
      FILETYPE(10TYPE C.                                      "文件类型

*定义OLE变量(模板下载)
DATA: G_EXCEL      TYPE OLE2_OBJECT,
      G_APPLICA    TYPE OLE2_OBJECT,
      G_SHEET      TYPE OLE2_OBJECT,
      G_CELL       TYPE OLE2_OBJECT,
      G_WORKBOOK   TYPE OLE2_OBJECT.

*用于下载模板存放文件路径等信息(模板下载)
DATA: FULLPATH    TYPE STRING,
      FILENAME1   TYPE STRING,
      PATH        TYPE STRING,
      USER_ACTION TYPE I,
      ENCODING    TYPE ABAP_ENCODING,
      P_FILEPATH  TYPE STRING,
      C_PATH(128TYPE C.

DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      GS_LAYOUT   TYPE SLIS_LAYOUT_ALV,
      GT_SORT     TYPE SLIS_SORTINFO_ALV,
      GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER,
      LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
      FARB1       TYPE SLIS_SPECIALCOL_ALV,
      L_REF_ALV   TYPE REF TO CL_GUI_ALV_GRID.
DATA: FUNCTXT TYPE SMP_DYNTXT.

SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
*SELECTION-SCREEN SKIP.
*SELECTION-SCREEN PUSHBUTTON /1(15) BTN USER-COMMAND ATTCH.  "下载模板按钮
PARAMETERS: USERFILE TYPE RLGRAP-FILENAME.                     "上载模板文件
SELECTION-SCREEN END OF BLOCK BL1.

SELECTION-SCREENFUNCTION KEY 1.  "激活按钮

TYPESBEGIN OF TYP_FILE,
      PERS_NO(10),
      BNAME(12),
      TITLE_MEDI(30),
      NAME_FIRST(40),
      NAME_LAST(40),
      PASS(40),
      TEL(30),
      MAIL(241),
*&ROLE:
      AGR_NAME1(30),
      AGR_NAME2(30),
      AGR_NAME3(30),
      AGR_NAME4(30),
      AGR_NAME5(30),
      AGR_NAME6(30),
      AGR_NAME7(30),
      AGR_NAME8(30),
      AGR_NAME9(30),
      AGR_NAME10(30),
      AGR_NAME11(30),
      AGR_NAME12(30),
      AGR_NAME13(30),
      AGR_NAME14(30),
      AGR_NAME15(30),
      AGR_NAME16(30),
      AGR_NAME17(30),
      AGR_NAME18(30),
      AGR_NAME19(30),
      AGR_NAME20(30),
      AGR_NAME21(30),
      AGR_NAME22(30),
      AGR_NAME23(30),
      AGR_NAME24(30),
      AGR_NAME25(30),
      AGR_NAME26(30),
      AGR_NAME27(30),
      AGR_NAME28(30),
      AGR_NAME29(30),
      AGR_NAME30(30),
      AGR_NAME31(30),
      AGR_NAME32(30),
      AGR_NAME33(30),
      AGR_NAME34(30),
      AGR_NAME35(30),
      AGR_NAME36(30),
      AGR_NAME37(30),
      AGR_NAME38(30),
      AGR_NAME39(30),
      AGR_NAME40(30),
      AGR_NAME41(30),
      AGR_NAME42(30),
      AGR_NAME43(30),
      AGR_NAME44(30),
      AGR_NAME45(30),
      AGR_NAME46(30),
      AGR_NAME47(30),
      AGR_NAME48(30),
      AGR_NAME49(30),
      AGR_NAME50(30),
      AGR_NAME51(30),
      AGR_NAME52(30),
      AGR_NAME53(30),
      AGR_NAME54(30),
      AGR_NAME55(30),
      AGR_NAME56(30),
      AGR_NAME57(30),
      AGR_NAME58(30),
      AGR_NAME59(30),
      AGR_NAME60(30),
      AGR_NAME61(30),
      AGR_NAME62(30),
      AGR_NAME63(30),
      AGR_NAME64(30),
      AGR_NAME65(30),
      AGR_NAME66(30),
      AGR_NAME67(30),
      AGR_NAME68(30),
      AGR_NAME69(30),
      AGR_NAME70(30),
      AGR_NAME71(30),
      AGR_NAME72(30),
      AGR_NAME73(30),
      AGR_NAME74(30),
      AGR_NAME75(30),
      AGR_NAME76(30),
      AGR_NAME77(30),
      AGR_NAME78(30),
      AGR_NAME79(30),
      AGR_NAME80(30),
      AGR_NAME81(30),
      AGR_NAME82(30),
      AGR_NAME83(30),
      AGR_NAME84(30),
      AGR_NAME85(30),       AGR_NAME86
(30),       AGR_NAME87
(30),       AGR_NAME88
(30),       AGR_NAME89
(30),       AGR_NAME90
(30),       AGR_NAME91
(30),       AGR_NAME92
(30),       AGR_NAME93
(30),       AGR_NAME94
(30),       AGR_NAME95
(30),       AGR_NAME96
(30),       AGR_NAME97
(30),       AGR_NAME98
(30),       AGR_NAME99
(30),       AGR_NAME100
(30),
*&END.

*&PROFILE:       PROFILE1
(12),                                         "PROFILE1       PROFILE2
(12),                                         "PROFILE2

*&参数:       PARID1
(20),       PARVA1
(18),       PARID2
(20),       PARVA2
(18),       UPDATE_ROLE

,"覆盖角色       DELETE_ROLE
,"删除角色       UPDATE_PROFILE
,"覆盖参数文件       UPDATE_PARA
,"覆盖参数

*&更新状态插入/修改:       
TYPE(1),
END OF TYP_FILE.

TYPESBEGIN OF TYP_OUT.         
INCLUDE TYPE TYP_FILE.
TYPES:       ERRMSG
(1000),       FARB        
TYPE   SLIS_T_SPECIALCOL_ALV,       LIGHT       
TYPE   CHAR1,               "指示灯字段: 1:Red 2:Yellow 3:Green       ERRSTEP     
TYPE   I,       SEL
,
END OF TYP_OUT.

*TYPES:
*  BEGIN OF TY_BNAME,
*    BNAME TYPE USR01-BNAME,
*  END OF TY_BNAME.
*
*DATA: GT_BNAME TYPE STANDARD TABLE OF TY_BNAME.

*TYPES: BEGIN OF TYP_AGR_USERS,
*    UNAME    TYPE AGR_USERS-UNAME,
*    AGR_NAME TYPE AGR_USERS-AGR_NAME,
*END OF TYP_AGR_USERS.

TYPESBEGIN OF TYP_ALSMEX.         
INCLUDE STRUCTURE ALSMEX_TABLINE.
TYPESEND OF TYP_ALSMEX.

*存放读取文件中的数据
DATA: GT_FILE TYPE STANDARD TABLE OF TYP_FILE,       WA_FILE 
TYPE TYP_FILE.

*定义 Excel 数据(上传)
DATA: GT_ALSMEX TYPE STANDARD TABLE OF TYP_ALSMEX,       WA_ALSMEX 
TYPE TYP_ALSMEX.

DATA: G_ACC     TYPE I,       ERRMSG
(1000).

DATA: GT_OUT    TYPE STANDARD TABLE OF TYP_OUT,       WA_OUT    
TYPE TYP_OUT,       WA_OUT1   
TYPE TYP_OUT.
*      GT_AGR_USERS    TYPE STANDARD TABLE OF TYP_AGR_USERS,
*      WA_AGR_USERS    TYPE TYP_AGR_USERS.

*---------------------------------------------------------------
* INITIALIZATION 启动程序开始执行
*---------------------------------------------------------------
INITIALIZATION.
*&初始化数据   
PERFORM FRM_INITDATA.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR USERFILE.   
PERFORM FRM_FILEOPEN USING USERFILE.

AT SELECTION-SCREEN.
* 检查下载模板按钮   
PERFORM FRM_CHECKINPUT.

AT SELECTION-SCREEN OUTPUT.
*  PERFORM FRM_INITLIST.

*---------------------------------------------------------------
* AT START SELECTION 主程序逻辑开始
*---------------------------------------------------------------
START-OF-SELECTION.
*& 检验导入数据   
PERFORM FRM_CHECKDATA.
*& 用ALV显示查询到的数据   
PERFORM FRM_SHOWDATA.

*&--------------------------------------------------------------------*
*& FORM FRM_GETDATA
*&--------------------------------------------------------------------*
* 根据查询方式取数
*---------------------------------------------------------------------*
FORM FRM_GETDATA.

ENDFORM.                    "FRM_GETDATA

*&--------------------------------------------------------------------*
*& FORM FRM_CHECKDATA
*&--------------------------------------------------------------------*
* 检查数据
*---------------------------------------------------------------------*
FORM FRM_CHECKDATA.   
CLEAR: GT_OUT.   
IF GT_FILE IS NOT INITIAL.     
LOOP AT GT_FILE INTO WA_FILE.       
MOVE-CORRESPONDING WA_FILE TO WA_OUT.
*      PERFORM ADD_ZERO CHANGING WA_OUT-MATNR.       
TRANSLATE WA_OUT-BNAME TO UPPER CASE.       
APPEND WA_OUT TO GT_OUT.       
CLEAR: WA_FILE, WA_OUT.     
ENDLOOP.   
ELSE.   
ENDIF.   

DATA: BNAME      TYPE CHAR12,         NAME_LAST  
TYPE CHAR40,   "姓         NAME_FIRST 
TYPE CHAR40.   "名   
LOOP AT GT_OUT INTO WA_OUT.
*    "必填项 底色加黄     
PERFORM FRM_SETBGCOLOR USING 'BNAME'.

******* 1. 检查用户名是否为空     
IF WA_OUT-BNAME IS INITIAL.       WA_OUT
-ERRMSG '数据检查失败:用户名不能为空'.       WA_OUT
-LIGHT 1.       
MODIFY GT_OUT FROM WA_OUT.       
CLEAR WA_OUT.       
CONTINUE.     
ENDIF.
******** 2 检查用户名是否存在重复: BNAME     
CLEAR G_ACC.     
LOOP AT GT_OUT INTO WA_OUT1 WHERE BNAME = WA_OUT-BNAME.       G_ACC 
= G_ACC + 1.     
ENDLOOP.     
IF G_ACC > 1.       WA_OUT
-ERRMSG '数据检查失败:导入文件中存在重复的用户名'.       WA_OUT
-LIGHT 1.       
MODIFY GT_OUT FROM WA_OUT.       
CLEAR WA_OUT.       
CONTINUE.     
ENDIF.
******** 3 检查系统用户名是否存在重复: BNAME     
CLEAR: BNAME, NAME_LAST, NAME_FIRST.     
SELECT SINGLE a~BNAME              b
~NAME_FIRST   "名              b
~NAME_LAST "姓       
INTO (BNAME, NAME_LAST,NAME_FIRST)       
FROM USR21 AS a       INNER 
JOIN ADRP AS b ON a~PERSNUMBER = b~PERSNUMBER       
WHERE a~BNAME = WA_OUT-BNAME.     
CONDENSE NAME_LAST.     
CONDENSE NAME_FIRST.     
IF BNAME NE SPACE AND ( NAME_LAST <> WA_OUT-NAME_LAST OR NAME_FIRST <> WA_OUT-NAME_FIRST ).       WA_OUT
-ERRMSG '数据检查失败:系统中已在存在该用户名,但姓名不相同'.       WA_OUT
-LIGHT 1.       
MODIFY GT_OUT FROM WA_OUT.       
CLEAR WA_OUT.       
CONTINUE.     
ENDIF.

******** 4  权限检查
*    AUTHORITY-CHECK OBJECT 'M_MSEG_WWA'
*    ID 'WERKS' FIELD WA_OUT-WERKS
*    ID 'ACTVT' DUMMY.
*    IF SY-SUBRC NE 0.
*      CONCATENATE '数据检查失败:当前用户没有创建用户的操作权限' INTO WA_OUT-ERRMSG.
*      WA_OUT-LIGHT = 1.
*      MODIFY GT_OUT FROM WA_OUT.
*      CLEAR WA_OUT.
*      CONTINUE.
*    ENDIF.     WA_OUT

-LIGHT 3.     
MODIFY GT_OUT FROM WA_OUT TRANSPORTING LIGHT FARB ERRMSG.     
CLEAR WA_OUT.   
ENDLOOP.
ENDFORM.                    " FRM_CHECKDATA

*&--------------------------------------------------------------------*
*& FORM FRM_SHOWDATA
*&--------------------------------------------------------------------*
* 显示ALV报表数据
*---------------------------------------------------------------------*
FORM FRM_SHOWDATA.   
PERFORM FRM_INITFIELDCAT.   
PERFORM FRM_INITLAYOUT.   
PERFORM FRM_DISPLAYGRID.
ENDFORM.                    "FRM_SHOWDATA

*&--------------------------------------------------------------------
*& FORM  FRM_UPLOADUSER
*&--------------------------------------------------------------------
* 更新用户
*---------------------------------------------------------------------*
FORM FRM_UPLOADUSER.   
LOOP AT GT_OUT INTO WA_OUT.     
TRANSLATE WA_OUT-BNAME TO UPPER CASE.     

SELECT SINGLE * FROM USR01 WHERE BNAME = WA_OUT-BNAME.     
IF SY-SUBRC EQ 0.       
TRANSLATE WA_OUT-DELETE_ROLE TO UPPER CASE.       
IF WA_OUT-DELETE_ROLE 'X'.         WA_OUT
-TYPE 'D'.       
ELSE.         WA_OUT
-TYPE 'U'.       
ENDIF.     
ELSE.       WA_OUT
-TYPE 'C'.     
ENDIF.     
MODIFY GT_OUT FROM WA_OUT TRANSPORTING BNAME TYPE.     
CLEAR: WA_OUT.   
ENDLOOP.   

DATA: OPER_TYPE.   
SORT GT_OUT BY BNAME.   
LOOP AT GT_OUT INTO WA_OUT.     
CLEAR ERRMSG.     
CONDENSE WA_OUT-PASS NO-GAPS.     
TRANSLATE WA_OUT-UPDATE_ROLE TO UPPER CASE.     
TRANSLATE WA_OUT-DELETE_ROLE TO UPPER CASE.     
TRANSLATE WA_OUT-UPDATE_PROFILE TO UPPER CASE.     
TRANSLATE WA_OUT-UPDATE_PARA TO UPPER CASE.     
CASE WA_OUT-TYPE.
*&创建时
*&只增加角色       
WHEN 'C'.         OPER_TYPE 
'C'.         
PERFORM FRM_CREATEUSER.
*&修改时       
WHEN 'U'.         OPER_TYPE 
'U'.         
PERFORM FRM_UPDATEUSER.       
WHEN 'D'.         OPER_TYPE 
'D'.         
PERFORM FRM_DELETEROLE.     
ENDCASE.
* 更新LED灯     
IF ERRMSG IS NOT INITIAL.       
CLEAR WA_OUT1.       
LOOP AT GT_OUT INTO WA_OUT1.         
IF WA_OUT1-BNAME = WA_OUT-BNAME.           
MOVE '1' TO WA_OUT1-LIGHT"添加红灯           
MOVE ERRMSG TO WA_OUT1-ERRMSG.           
MODIFY GT_OUT FROM WA_OUT1 TRANSPORTING LIGHT ERRMSG.         
ENDIF.         
CLEAR: WA_OUT1.       
ENDLOOP.     
ELSE.       
LOOP AT GT_OUT INTO WA_OUT1.         
IF WA_OUT1-BNAME = WA_OUT-BNAME.           
MOVE '3' TO WA_OUT1-LIGHT"添加绿灯           
IF OPER_TYPE 'C'.             
MOVE '用户创建成功' TO WA_OUT1-ERRMSG.           
ELSEIF OPER_TYPE 'U'.             
MOVE '用户更新成功' TO WA_OUT1-ERRMSG.           
ELSEIF OPER_TYPE 'D'.             
MOVE '用户角色删除成功' TO WA_OUT1-ERRMSG.           
ENDIF.           
MODIFY GT_OUT FROM WA_OUT1 TRANSPORTING LIGHT ERRMSG.         
ENDIF.         
CLEAR: WA_OUT1.       
ENDLOOP.     
ENDIF.

* 刷新表格     
PERFORM FRM_REFRESHTABLE.   
ENDLOOP.
ENDFORM.                               " FRM_UPLOADUSER

*&--------------------------------------------------------------------*
*& FORM FRM_CREATEUSER
*&--------------------------------------------------------------------*
* 创建用户 分配角色
*---------------------------------------------------------------------*
FORM FRM_CREATEUSER.   
DATA: LV_LOGONDATA  TYPE BAPILOGOND,         LV_ADDRESS    
TYPE BAPIADDR3,         LV_DEFAULTS   
TYPE BAPIDEFAUL,         LV_PASSWORD   
TYPE BAPIPWD,         LT_PARAMETER  
TYPE STANDARD TABLE OF BAPIPARAM,         LT_PROFILE    
TYPE STANDARD TABLE OF BAPIPROF,         LT_ROLE       
TYPE STANDARD TABLE OF BAPIAGR,         LT_RETURN     
TYPE STANDARD TABLE OF BAPIRET2.   
FIELD-SYMBOLS: <FS_PARAMETER> TYPE BAPIPARAM,                  <FS_PROFILE>   
TYPE BAPIPROF,                  <FS_ROLE>      
TYPE BAPIAGR,                  <FS_RETURN>    
TYPE BAPIRET2.   
DEFINE ADD_ROLE.     
IF &1 IS NOT INITIAL.       
APPEND INITIAL LINE TO LT_ROLE ASSIGNING <FS_ROLE>.       <FS_ROLE>
-AGR_NAME = &1.     
ENDIF.   
END-OF-DEFINITION.

*  LV_ADDRESS-PERS_NO = WA_OUT-PERS_NO.   LV_ADDRESS
-TITLE_P = WA_OUT-TITLE_MEDI.   LV_ADDRESS
-LASTNAME = WA_OUT-NAME_FIRST"姓   LV_ADDRESS
-FIRSTNAME = WA_OUT-NAME_LAST"名   LV_ADDRESS
-TEL1_NUMBR = WA_OUT-TEL.   LV_ADDRESS
-E_MAIL = WA_OUT-MAIL.

* DEFAULTS   LV_DEFAULTS
-DCPFM 'X'"十进制格式   LV_DEFAULTS
-DATFM '4'"日期格式   LV_DEFAULTS
-TIMEFM '0'."时间格式(12-/24-小时规格)   LV_DEFAULTS
-SPDB 'G'.  "立即打印

* PASSWORD   LV_PASSWORD 
= WA_OUT-PASS.

* PARAMETER   
APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.   <FS_PARAMETER>
-PARID = WA_OUT-PARID1.   <FS_PARAMETER>
-PARVA = WA_OUT-PARVA1.   
APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.   <FS_PARAMETER>
-PARID = WA_OUT-PARID2.   <FS_PARAMETER>
-PARVA = WA_OUT-PARVA2.   
DELETE LT_PARAMETER WHERE PARID IS INITIAL.   
"删除重复参数   
SORT LT_PARAMETER BY PARID.   
DELETE ADJACENT DUPLICATES FROM LT_PARAMETER COMPARING PARID.   

CALL FUNCTION 'BAPI_USER_CREATE1'     
EXPORTING       USERNAME  
= WA_OUT-BNAME       LOGONDATA 
= LV_LOGONDATA       PASSWORD  
= LV_PASSWORD       ADDRESS   
= LV_ADDRESS       DEFAULTS  
= LV_DEFAULTS     
TABLES       
PARAMETER = LT_PARAMETER       
RETURN    = LT_RETURN.   UNASSIGN <FS_RETURN> 
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', CREATED.'.
*  ENDIF.   
FREE LT_RETURN.   

IF ERRMSG IS INITIAL.     
APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.     <FS_PROFILE>
-BAPIPROF = WA_OUT-PROFILE1.     
APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.     <FS_PROFILE>
-BAPIPROF = WA_OUT-PROFILE2.     
DELETE LT_PROFILE WHERE BAPIPROF IS INITIAL.     
"删除重复参数文件     
SORT LT_PROFILE BY BAPIPROF.     
DELETE ADJACENT DUPLICATES FROM LT_PROFILE COMPARING BAPIPROF.     
CALL FUNCTION 'BAPI_USER_PROFILES_ASSIGN'       
EXPORTING         USERNAME 
= WA_OUT-BNAME       
TABLES         PROFILES 
= LT_PROFILE         
RETURN   = LT_RETURN.     UNASSIGN <FS_RETURN> 
.     
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.       
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.     
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', PROFILE CREATED.'.
*  ENDIF.     
FREE LT_RETURN.     ADD_ROLE WA_OUT

-AGR_NAME1.     ADD_ROLE WA_OUT
-AGR_NAME2.     ADD_ROLE WA_OUT
-AGR_NAME3.     ADD_ROLE WA_OUT
-AGR_NAME4.     ADD_ROLE WA_OUT
-AGR_NAME5.     ADD_ROLE WA_OUT
-AGR_NAME6.     ADD_ROLE WA_OUT
-AGR_NAME7.     ADD_ROLE WA_OUT
-AGR_NAME8.     ADD_ROLE WA_OUT
-AGR_NAME9.     ADD_ROLE WA_OUT
-AGR_NAME10.     ADD_ROLE WA_OUT
-AGR_NAME11.     ADD_ROLE WA_OUT
-AGR_NAME12.     ADD_ROLE WA_OUT
-AGR_NAME13.     ADD_ROLE WA_OUT
-AGR_NAME14.     ADD_ROLE WA_OUT
-AGR_NAME15.     ADD_ROLE WA_OUT
-AGR_NAME16.     ADD_ROLE WA_OUT
-AGR_NAME17.     ADD_ROLE WA_OUT
-AGR_NAME18.     ADD_ROLE WA_OUT
-AGR_NAME19.     ADD_ROLE WA_OUT
-AGR_NAME20.     ADD_ROLE WA_OUT
-AGR_NAME21.     ADD_ROLE WA_OUT
-AGR_NAME22.     ADD_ROLE WA_OUT
-AGR_NAME23.     ADD_ROLE WA_OUT
-AGR_NAME24.     ADD_ROLE WA_OUT
-AGR_NAME25.     ADD_ROLE WA_OUT
-AGR_NAME26.     ADD_ROLE WA_OUT
-AGR_NAME27.     ADD_ROLE WA_OUT
-AGR_NAME28.     ADD_ROLE WA_OUT
-AGR_NAME29.     ADD_ROLE WA_OUT
-AGR_NAME30.     ADD_ROLE WA_OUT
-AGR_NAME31.     ADD_ROLE WA_OUT
-AGR_NAME32.     ADD_ROLE WA_OUT
-AGR_NAME33.     ADD_ROLE WA_OUT
-AGR_NAME34.     ADD_ROLE WA_OUT
-AGR_NAME35.     ADD_ROLE WA_OUT
-AGR_NAME36.     ADD_ROLE WA_OUT
-AGR_NAME37.     ADD_ROLE WA_OUT
-AGR_NAME38.     ADD_ROLE WA_OUT
-AGR_NAME39.     ADD_ROLE WA_OUT
-AGR_NAME40.     ADD_ROLE WA_OUT
-AGR_NAME41.     ADD_ROLE WA_OUT
-AGR_NAME42.     ADD_ROLE WA_OUT
-AGR_NAME43.     ADD_ROLE WA_OUT
-AGR_NAME44.     ADD_ROLE WA_OUT
-AGR_NAME45.     ADD_ROLE WA_OUT
-AGR_NAME46.     ADD_ROLE WA_OUT
-AGR_NAME47.     ADD_ROLE WA_OUT
-AGR_NAME48.     ADD_ROLE WA_OUT
-AGR_NAME49.     ADD_ROLE WA_OUT
-AGR_NAME50.     ADD_ROLE WA_OUT
-AGR_NAME51.     ADD_ROLE WA_OUT
-AGR_NAME52.     ADD_ROLE WA_OUT
-AGR_NAME53.     ADD_ROLE WA_OUT
-AGR_NAME54.     ADD_ROLE WA_OUT
-AGR_NAME55.     ADD_ROLE WA_OUT
-AGR_NAME56.     ADD_ROLE WA_OUT
-AGR_NAME57.     ADD_ROLE WA_OUT
-AGR_NAME58.     ADD_ROLE WA_OUT
-AGR_NAME59.     ADD_ROLE WA_OUT
-AGR_NAME60.     ADD_ROLE WA_OUT
-AGR_NAME61.     ADD_ROLE WA_OUT
-AGR_NAME62.     ADD_ROLE WA_OUT
-AGR_NAME63.     ADD_ROLE WA_OUT
-AGR_NAME64.     ADD_ROLE WA_OUT
-AGR_NAME65.     ADD_ROLE WA_OUT
-AGR_NAME66.     ADD_ROLE WA_OUT
-AGR_NAME67.     ADD_ROLE WA_OUT
-AGR_NAME68.     ADD_ROLE WA_OUT
-AGR_NAME69.     ADD_ROLE WA_OUT
-AGR_NAME70.     ADD_ROLE WA_OUT
-AGR_NAME71.     ADD_ROLE WA_OUT
-AGR_NAME72.     ADD_ROLE WA_OUT
-AGR_NAME73.     ADD_ROLE WA_OUT
-AGR_NAME74.     ADD_ROLE WA_OUT
-AGR_NAME75.     ADD_ROLE WA_OUT
-AGR_NAME76.     ADD_ROLE WA_OUT
-AGR_NAME77.     ADD_ROLE WA_OUT
-AGR_NAME78.     ADD_ROLE WA_OUT
-AGR_NAME79.     ADD_ROLE WA_OUT
-AGR_NAME80.     ADD_ROLE WA_OUT
-AGR_NAME81.     ADD_ROLE WA_OUT
-AGR_NAME82.     ADD_ROLE WA_OUT
-AGR_NAME83.     ADD_ROLE WA_OUT
-AGR_NAME84.     ADD_ROLE WA_OUT
-AGR_NAME85.     ADD_ROLE WA_OUT
-AGR_NAME86.     ADD_ROLE WA_OUT
-AGR_NAME87.     ADD_ROLE WA_OUT
-AGR_NAME88.     ADD_ROLE WA_OUT
-AGR_NAME89.     ADD_ROLE WA_OUT
-AGR_NAME90.     ADD_ROLE WA_OUT
-AGR_NAME91.     ADD_ROLE WA_OUT
-AGR_NAME92.     ADD_ROLE WA_OUT
-AGR_NAME93.     ADD_ROLE WA_OUT
-AGR_NAME94.     ADD_ROLE WA_OUT
-AGR_NAME95.     ADD_ROLE WA_OUT
-AGR_NAME96.     ADD_ROLE WA_OUT
-AGR_NAME97.     ADD_ROLE WA_OUT
-AGR_NAME98.     ADD_ROLE WA_OUT
-AGR_NAME99.     ADD_ROLE WA_OUT
-AGR_NAME100.     
DELETE LT_ROLE WHERE AGR_NAME IS INITIAL.     
"删除重复角色     
SORT LT_ROLE BY AGR_NAME.     
DELETE ADJACENT DUPLICATES FROM LT_ROLE COMPARING AGR_NAME.     
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'       
EXPORTING         USERNAME       
= WA_OUT-BNAME       
TABLES         ACTIVITYGROUPS 
= LT_ROLE         
RETURN         = LT_RETURN.     UNASSIGN <FS_RETURN>
.     
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.       
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.     
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', ROLE CREATED.'.
*  ENDIF.     
FREE LT_RETURN.     

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       
EXPORTING         
WAIT 'X'.   
ENDIF.
ENDFORM.                               " FRM_CREATEUSER

*&--------------------------------------------------------------------*
*& FORM FRM_UPDATEUSER
*&--------------------------------------------------------------------*
* 更新用户 分配角色
*---------------------------------------------------------------------*
FORM FRM_UPDATEUSER.   
DATA: LT_PARAMETER  TYPE STANDARD TABLE OF BAPIPARAM,         LT_PROFILE    
TYPE STANDARD TABLE OF BAPIPROF,         LT_ROLE       
TYPE STANDARD TABLE OF BAPIAGR,         LT_OPARAMETER 
TYPE STANDARD TABLE OF BAPIPARAM,         LT_OPROFILE   
TYPE STANDARD TABLE OF BAPIPROF,         LT_OROLE      
TYPE STANDARD TABLE OF BAPIAGR,         LT_RETURN     
TYPE STANDARD TABLE OF BAPIRET2.   
FIELD-SYMBOLS: <FS_PARAMETER> TYPE BAPIPARAM,                  <FS_PROFILE> 
TYPE BAPIPROF,                  <FS_ROLE> 
TYPE BAPIAGR,                  <FS_OPARAMETER> 
TYPE BAPIPARAM,                  <FS_OPROFILE> 
TYPE BAPIPROF,                  <FS_OROLE> 
TYPE BAPIAGR,                  <FS_RETURN> 
TYPE BAPIRET2.   
DEFINE ADD_ROLE.     
IF &1 IS NOT INITIAL.       
APPEND INITIAL LINE TO LT_ROLE ASSIGNING <FS_ROLE>.       <FS_ROLE>
-AGR_NAME = &1.     
ENDIF.   
END-OF-DEFINITION.   

"读取用户信息   
CALL FUNCTION 'BAPI_USER_GET_DETAIL'     
EXPORTING       USERNAME       
= WA_OUT-BNAME     
TABLES       
PARAMETER      = LT_OPARAMETER       PROFILES       
= LT_OPROFILE       ACTIVITYGROUPS 
= LT_OROLE       
RETURN         = LT_RETURN.   UNASSIGN <FS_RETURN>
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.   
FREE LT_RETURN.

**  LV_ADDRESS-PERS_NO = WA_OUT-PERS_NO.
*  LV_ADDRESS-TITLE_P = WA_OUT-TITLE_MEDI.
*  LV_ADDRESS-LASTNAME = WA_OUT-NAME_FIRST. "姓
*  LV_ADDRESS-FIRSTNAME = WA_OUT-NAME_LAST. "名
*  LV_ADDRESS-TEL1_NUMBR = WA_OUT-TEL.
*  LV_ADDRESS-E_MAIL = WA_OUT-MAIL.
*
** DEFAULTS
*  LV_DEFAULTS-DCPFM = 'X'. "十进制格式
*  LV_DEFAULTS-DATFM = '4'. "日期格式
*  LV_DEFAULTS-TIMEFM = '0'."时间格式(12-/24-小时规格)
*  LV_DEFAULTS-SPDB = 'G'.  "立即打印

* PARAMETER   
IF WA_OUT-UPDATE_PARA EQ SPACE AND LT_OPARAMETER IS NOT INITIAL.     
LOOP AT LT_OPARAMETER ASSIGNING <FS_OPARAMETER>.       
APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.       <FS_PARAMETER>
-PARID = <FS_OPARAMETER>-PARID.       <FS_PARAMETER>
-PARVA = <FS_OPARAMETER>-PARVA.     
ENDLOOP.   
ENDIF.   
APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.   <FS_PARAMETER>
-PARID = WA_OUT-PARID1.   <FS_PARAMETER>
-PARVA = WA_OUT-PARVA1.   
APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.   <FS_PARAMETER>
-PARID = WA_OUT-PARID2.   <FS_PARAMETER>
-PARVA = WA_OUT-PARVA2.
*  DATA: LV_PASSWORD TYPE BAPIPWD .
*  LV_PASSWORD = WA_OUT-PASS.   
DELETE LT_PARAMETER WHERE PARID IS INITIAL.   
"删除重复参数   
SORT LT_PARAMETER BY PARID.   
DELETE ADJACENT DUPLICATES FROM LT_PARAMETER COMPARING PARID.   
CALL FUNCTION 'BAPI_USER_CHANGE'     
EXPORTING       USERNAME  
= WA_OUT-BNAME
*     LOGONDATA = LV_LOGONDATA
*     ADDRESS   = LV_ADDRESS
*     DEFAULTS  = LV_DEFAULTS     
TABLES       
PARAMETER = LT_PARAMETER       
RETURN    = LT_RETURN.   UNASSIGN <FS_RETURN> 
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', CHANGED.'.
*  ENDIF.   
FREE LT_RETURN.   

IF WA_OUT-UPDATE_PROFILE EQ SPACE AND LT_OPROFILE IS NOT INITIAL.     
LOOP AT LT_OPROFILE ASSIGNING <FS_OPROFILE>.       
APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.       <FS_PROFILE>
-BAPIPROF = <FS_OPROFILE>-BAPIPROF.     
ENDLOOP.   
ENDIF.   
APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.   <FS_PROFILE>
-BAPIPROF = WA_OUT-PROFILE1.   
APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.   <FS_PROFILE>
-BAPIPROF = WA_OUT-PROFILE2.   
DELETE LT_PROFILE WHERE BAPIPROF IS INITIAL.   
"删除重复参数文件   
SORT LT_PROFILE BY BAPIPROF.   
DELETE ADJACENT DUPLICATES FROM LT_PROFILE COMPARING BAPIPROF.   
CALL FUNCTION 'BAPI_USER_PROFILES_ASSIGN'     
EXPORTING       USERNAME 
= WA_OUT-BNAME     
TABLES       PROFILES 
= LT_PROFILE       
RETURN   = LT_RETURN.   UNASSIGN <FS_RETURN> 
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', PROFILE CHANGED.'.
*  ENDIF.   
FREE LT_RETURN.   

IF WA_OUT-UPDATE_ROLE EQ SPACE AND LT_OROLE IS NOT INITIAL.     
LOOP AT LT_OROLE ASSIGNING <FS_OROLE>.       
APPEND INITIAL LINE TO LT_ROLE ASSIGNING <FS_ROLE>.       <FS_ROLE>
-AGR_NAME = <FS_OROLE>-AGR_NAME.     
ENDLOOP.   
ENDIF.   ADD_ROLE WA_OUT
-AGR_NAME1.   ADD_ROLE WA_OUT
-AGR_NAME2.   ADD_ROLE WA_OUT
-AGR_NAME3.   ADD_ROLE WA_OUT
-AGR_NAME4.   ADD_ROLE WA_OUT
-AGR_NAME5.   ADD_ROLE WA_OUT
-AGR_NAME6.   ADD_ROLE WA_OUT
-AGR_NAME7.   ADD_ROLE WA_OUT
-AGR_NAME8.   ADD_ROLE WA_OUT
-AGR_NAME9.   ADD_ROLE WA_OUT
-AGR_NAME10.   ADD_ROLE WA_OUT
-AGR_NAME11.   ADD_ROLE WA_OUT
-AGR_NAME12.   ADD_ROLE WA_OUT
-AGR_NAME13.   ADD_ROLE WA_OUT
-AGR_NAME14.   ADD_ROLE WA_OUT
-AGR_NAME15.   ADD_ROLE WA_OUT
-AGR_NAME16.   ADD_ROLE WA_OUT
-AGR_NAME17.   ADD_ROLE WA_OUT
-AGR_NAME18.   ADD_ROLE WA_OUT
-AGR_NAME19.   ADD_ROLE WA_OUT
-AGR_NAME20.   ADD_ROLE WA_OUT
-AGR_NAME21.   ADD_ROLE WA_OUT
-AGR_NAME22.   ADD_ROLE WA_OUT
-AGR_NAME23.   ADD_ROLE WA_OUT
-AGR_NAME24.   ADD_ROLE WA_OUT
-AGR_NAME25.   ADD_ROLE WA_OUT
-AGR_NAME26.   ADD_ROLE WA_OUT
-AGR_NAME27.   ADD_ROLE WA_OUT
-AGR_NAME28.   ADD_ROLE WA_OUT
-AGR_NAME29.   ADD_ROLE WA_OUT
-AGR_NAME30.   ADD_ROLE WA_OUT
-AGR_NAME31.   ADD_ROLE WA_OUT
-AGR_NAME32.   ADD_ROLE WA_OUT
-AGR_NAME33.   ADD_ROLE WA_OUT
-AGR_NAME34.   ADD_ROLE WA_OUT
-AGR_NAME35.   ADD_ROLE WA_OUT
-AGR_NAME36.   ADD_ROLE WA_OUT
-AGR_NAME37.   ADD_ROLE WA_OUT
-AGR_NAME38.   ADD_ROLE WA_OUT
-AGR_NAME39.   ADD_ROLE WA_OUT
-AGR_NAME40.   ADD_ROLE WA_OUT
-AGR_NAME41.   ADD_ROLE WA_OUT
-AGR_NAME42.   ADD_ROLE WA_OUT
-AGR_NAME43.   ADD_ROLE WA_OUT
-AGR_NAME44.   ADD_ROLE WA_OUT
-AGR_NAME45.   ADD_ROLE WA_OUT
-AGR_NAME46.   ADD_ROLE WA_OUT
-AGR_NAME47.   ADD_ROLE WA_OUT
-AGR_NAME48.   ADD_ROLE WA_OUT
-AGR_NAME49.   ADD_ROLE WA_OUT
-AGR_NAME50.   ADD_ROLE WA_OUT
-AGR_NAME51.   ADD_ROLE WA_OUT
-AGR_NAME52.   ADD_ROLE WA_OUT
-AGR_NAME53.   ADD_ROLE WA_OUT
-AGR_NAME54.   ADD_ROLE WA_OUT
-AGR_NAME55.   ADD_ROLE WA_OUT
-AGR_NAME56.   ADD_ROLE WA_OUT
-AGR_NAME57.   ADD_ROLE WA_OUT
-AGR_NAME58.   ADD_ROLE WA_OUT
-AGR_NAME59.   ADD_ROLE WA_OUT
-AGR_NAME60.   ADD_ROLE WA_OUT
-AGR_NAME61.   ADD_ROLE WA_OUT
-AGR_NAME62.   ADD_ROLE WA_OUT
-AGR_NAME63.   ADD_ROLE WA_OUT
-AGR_NAME64.   ADD_ROLE WA_OUT
-AGR_NAME65.   ADD_ROLE WA_OUT
-AGR_NAME66.   ADD_ROLE WA_OUT
-AGR_NAME67.   ADD_ROLE WA_OUT
-AGR_NAME68.   ADD_ROLE WA_OUT
-AGR_NAME69.   ADD_ROLE WA_OUT
-AGR_NAME70.   ADD_ROLE WA_OUT
-AGR_NAME71.   ADD_ROLE WA_OUT
-AGR_NAME72.   ADD_ROLE WA_OUT
-AGR_NAME73.   ADD_ROLE WA_OUT
-AGR_NAME74.   ADD_ROLE WA_OUT
-AGR_NAME75.   ADD_ROLE WA_OUT
-AGR_NAME76.   ADD_ROLE WA_OUT
-AGR_NAME77.   ADD_ROLE WA_OUT
-AGR_NAME78.   ADD_ROLE WA_OUT
-AGR_NAME79.   ADD_ROLE WA_OUT
-AGR_NAME80.   ADD_ROLE WA_OUT
-AGR_NAME81.   ADD_ROLE WA_OUT
-AGR_NAME82.   ADD_ROLE WA_OUT
-AGR_NAME83.   ADD_ROLE WA_OUT
-AGR_NAME84.   ADD_ROLE WA_OUT
-AGR_NAME85.   ADD_ROLE WA_OUT
-AGR_NAME86.   ADD_ROLE WA_OUT
-AGR_NAME87.   ADD_ROLE WA_OUT
-AGR_NAME88.   ADD_ROLE WA_OUT
-AGR_NAME89.   ADD_ROLE WA_OUT
-AGR_NAME90.   ADD_ROLE WA_OUT
-AGR_NAME91.   ADD_ROLE WA_OUT
-AGR_NAME92.   ADD_ROLE WA_OUT
-AGR_NAME93.   ADD_ROLE WA_OUT
-AGR_NAME94.   ADD_ROLE WA_OUT
-AGR_NAME95.   ADD_ROLE WA_OUT
-AGR_NAME96.   ADD_ROLE WA_OUT
-AGR_NAME97.   ADD_ROLE WA_OUT
-AGR_NAME98.   ADD_ROLE WA_OUT
-AGR_NAME99.   ADD_ROLE WA_OUT
-AGR_NAME100.   
DELETE LT_ROLE WHERE AGR_NAME IS INITIAL.
*  "取出用户已分配的角色
*  SELECT UNAME
*         AGR_NAME
*    INTO CORRESPONDING FIELDS OF TABLE GT_AGR_USERS
*    FROM AGR_USERS
*    WHERE UNAME = WA_OUT-BNAME.
*  LOOP AT GT_AGR_USERS INTO WA_AGR_USERS.
*    ADD_ROLE WA_AGR_USERS-AGR_NAME.
*    CLEAR: WA_AGR_USERS.
*  ENDLOOP.   
"删除重复角色   
SORT LT_ROLE BY AGR_NAME.   
DELETE ADJACENT DUPLICATES FROM LT_ROLE COMPARING AGR_NAME.   
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'     
EXPORTING       USERNAME       
= WA_OUT-BNAME     
TABLES       ACTIVITYGROUPS 
= LT_ROLE       
RETURN         = LT_RETURN.   UNASSIGN <FS_RETURN> 
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', ROLE CHANGED.'.
*  ENDIF.   
FREE LT_RETURN.   

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'     
EXPORTING       
WAIT 'X'.
ENDFORM.                    " FRM_UPDATEUSER

*&--------------------------------------------------------------------*
*& FORM FRM_DELETEROLE
*&--------------------------------------------------------------------*
* 更新用户 删除角色
*---------------------------------------------------------------------*
FORM FRM_DELETEROLE.   
DATA: LT_ROLE       TYPE STANDARD TABLE OF BAPIAGR,
*        LT_DELROLE    TYPE STANDARD TABLE OF BAPIAGR,         LT_RETURN     
TYPE STANDARD TABLE OF BAPIRET2.   
FIELD-SYMBOLS: <FS_ROLE> TYPE BAPIAGR,                  <FS_DELROLE> 
TYPE BAPIAGR,                  <FS_RETURN> 
TYPE BAPIRET2.   
RANGES: S_DELROLE FOR BAPIAGR-AGR_NAME.   
DEFINE ADD_ROLE.
*    APPEND INITIAL LINE TO LT_DELROLE ASSIGNING <FS_DELROLE>.
*    <FS_DELROLE>-AGR_NAME = &1.     
IF &1 IS NOT INITIAL.       S_DELROLE
-SIGN 'I'.       S_DELROLE
-OPTION 'EQ'.       S_DELROLE
-LOW = &1.       
APPEND S_DELROLE.       
CLEAR S_DELROLE.     
ENDIF.   
END-OF-DEFINITION.   

"读取用户信息   
CALL FUNCTION 'BAPI_USER_GET_DETAIL'     
EXPORTING       USERNAME       
= WA_OUT-BNAME     
TABLES       ACTIVITYGROUPS 
= LT_ROLE       
RETURN         = LT_RETURN.   UNASSIGN <FS_RETURN>
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.   
FREE LT_RETURN.   ADD_ROLE WA_OUT

-AGR_NAME1.   ADD_ROLE WA_OUT
-AGR_NAME2.   ADD_ROLE WA_OUT
-AGR_NAME3.   ADD_ROLE WA_OUT
-AGR_NAME4.   ADD_ROLE WA_OUT
-AGR_NAME5.   ADD_ROLE WA_OUT
-AGR_NAME6.   ADD_ROLE WA_OUT
-AGR_NAME7.   ADD_ROLE WA_OUT
-AGR_NAME8.   ADD_ROLE WA_OUT
-AGR_NAME9.   ADD_ROLE WA_OUT
-AGR_NAME10.   ADD_ROLE WA_OUT
-AGR_NAME11.   ADD_ROLE WA_OUT
-AGR_NAME12.   ADD_ROLE WA_OUT
-AGR_NAME13.   ADD_ROLE WA_OUT
-AGR_NAME14.   ADD_ROLE WA_OUT
-AGR_NAME15.   ADD_ROLE WA_OUT
-AGR_NAME16.   ADD_ROLE WA_OUT
-AGR_NAME17.   ADD_ROLE WA_OUT
-AGR_NAME18.   ADD_ROLE WA_OUT
-AGR_NAME19.   ADD_ROLE WA_OUT
-AGR_NAME20.   ADD_ROLE WA_OUT
-AGR_NAME21.   ADD_ROLE WA_OUT
-AGR_NAME22.   ADD_ROLE WA_OUT
-AGR_NAME23.   ADD_ROLE WA_OUT
-AGR_NAME24.   ADD_ROLE WA_OUT
-AGR_NAME25.   ADD_ROLE WA_OUT
-AGR_NAME26.   ADD_ROLE WA_OUT
-AGR_NAME27.   ADD_ROLE WA_OUT
-AGR_NAME28.   ADD_ROLE WA_OUT
-AGR_NAME29.   ADD_ROLE WA_OUT
-AGR_NAME30.   ADD_ROLE WA_OUT
-AGR_NAME31.   ADD_ROLE WA_OUT
-AGR_NAME32.   ADD_ROLE WA_OUT
-AGR_NAME33.   ADD_ROLE WA_OUT
-AGR_NAME34.   ADD_ROLE WA_OUT
-AGR_NAME35.   ADD_ROLE WA_OUT
-AGR_NAME36.   ADD_ROLE WA_OUT
-AGR_NAME37.   ADD_ROLE WA_OUT
-AGR_NAME38.   ADD_ROLE WA_OUT
-AGR_NAME39.   ADD_ROLE WA_OUT
-AGR_NAME40.   ADD_ROLE WA_OUT
-AGR_NAME41.   ADD_ROLE WA_OUT
-AGR_NAME42.   ADD_ROLE WA_OUT
-AGR_NAME43.   ADD_ROLE WA_OUT
-AGR_NAME44.   ADD_ROLE WA_OUT
-AGR_NAME45.   ADD_ROLE WA_OUT
-AGR_NAME46.   ADD_ROLE WA_OUT
-AGR_NAME47.   ADD_ROLE WA_OUT
-AGR_NAME48.   ADD_ROLE WA_OUT
-AGR_NAME49.   ADD_ROLE WA_OUT
-AGR_NAME50.   ADD_ROLE WA_OUT
-AGR_NAME51.   ADD_ROLE WA_OUT
-AGR_NAME52.   ADD_ROLE WA_OUT
-AGR_NAME53.   ADD_ROLE WA_OUT
-AGR_NAME54.   ADD_ROLE WA_OUT
-AGR_NAME55.   ADD_ROLE WA_OUT
-AGR_NAME56.   ADD_ROLE WA_OUT
-AGR_NAME57.   ADD_ROLE WA_OUT
-AGR_NAME58.   ADD_ROLE WA_OUT
-AGR_NAME59.   ADD_ROLE WA_OUT
-AGR_NAME60.   ADD_ROLE WA_OUT
-AGR_NAME61.   ADD_ROLE WA_OUT
-AGR_NAME62.   ADD_ROLE WA_OUT
-AGR_NAME63.   ADD_ROLE WA_OUT
-AGR_NAME64.   ADD_ROLE WA_OUT
-AGR_NAME65.   ADD_ROLE WA_OUT
-AGR_NAME66.   ADD_ROLE WA_OUT
-AGR_NAME67.   ADD_ROLE WA_OUT
-AGR_NAME68.   ADD_ROLE WA_OUT
-AGR_NAME69.   ADD_ROLE WA_OUT
-AGR_NAME70.   ADD_ROLE WA_OUT
-AGR_NAME71.   ADD_ROLE WA_OUT
-AGR_NAME72.   ADD_ROLE WA_OUT
-AGR_NAME73.   ADD_ROLE WA_OUT
-AGR_NAME74.   ADD_ROLE WA_OUT
-AGR_NAME75.   ADD_ROLE WA_OUT
-AGR_NAME76.   ADD_ROLE WA_OUT
-AGR_NAME77.   ADD_ROLE WA_OUT
-AGR_NAME78.   ADD_ROLE WA_OUT
-AGR_NAME79.   ADD_ROLE WA_OUT
-AGR_NAME80.   ADD_ROLE WA_OUT
-AGR_NAME81.   ADD_ROLE WA_OUT
-AGR_NAME82.   ADD_ROLE WA_OUT
-AGR_NAME83.   ADD_ROLE WA_OUT
-AGR_NAME84.   ADD_ROLE WA_OUT
-AGR_NAME85.   ADD_ROLE WA_OUT
-AGR_NAME86.   ADD_ROLE WA_OUT
-AGR_NAME87.   ADD_ROLE WA_OUT
-AGR_NAME88.   ADD_ROLE WA_OUT
-AGR_NAME89.   ADD_ROLE WA_OUT
-AGR_NAME90.   ADD_ROLE WA_OUT
-AGR_NAME91.   ADD_ROLE WA_OUT
-AGR_NAME92.   ADD_ROLE WA_OUT
-AGR_NAME93.   ADD_ROLE WA_OUT
-AGR_NAME94.   ADD_ROLE WA_OUT
-AGR_NAME95.   ADD_ROLE WA_OUT
-AGR_NAME96.   ADD_ROLE WA_OUT
-AGR_NAME97.   ADD_ROLE WA_OUT
-AGR_NAME98.   ADD_ROLE WA_OUT
-AGR_NAME99.   ADD_ROLE WA_OUT
-AGR_NAME100.
*  DELETE LT_DELROLE WHERE AGR_NAME IS INITIAL.   
"删除指定角色
*  LOOP AT LT_DELROLE ASSIGNING <FS_DELROLE>.
*    DELETE LT_ROLE WHERE AGR_NAME = <FS_DELROLE>-AGR_NAME.
*  ENDLOOP.   
DELETE LT_ROLE WHERE AGR_NAME IN S_DELROLE.   
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'     
EXPORTING       USERNAME       
= WA_OUT-BNAME     
TABLES       ACTIVITYGROUPS 
= LT_ROLE       
RETURN         = LT_RETURN.   UNASSIGN <FS_RETURN> 
.   
LOOP AT LT_RETURN ASSIGNING <FS_RETURN> WHERE TYPE 'E' OR TYPE 'A'.     
CONCATENATE ERRMSG <FS_RETURN>-MESSAGE INTO ERRMSG SEPARATED BY SPACE.   
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', ROLE CHANGED.'.
*  ENDIF.   
FREE LT_RETURN.   

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'     
EXPORTING       
WAIT 'X'.
ENDFORM.                    " FRM_DELETEROLE

*&--------------------------------------------------------------------*
*& FORM FRM_SHOWMESSAGE
*&--------------------------------------------------------------------*
* 弹出对话框
*---------------------------------------------------------------------*
FORM FRM_SHOWMESSAGE USING TITEL                             TEXTLINE1                             TEXTLINE2

.   
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'     
EXPORTING       TITEL        
= TITEL       TEXTLINE1    
= TEXTLINE1       TEXTLINE2    
= TEXTLINE2
*     START_COLUMN = 25
*     START_ROW    =                                                              6     
.
ENDFORM.                    "FRM_SHOWMESSAGE

*&--------------------------------------------------------------------*
*& FORM FRM_REFRESHTABLE
*&--------------------------------------------------------------------*
* 手动刷新ALV
*---------------------------------------------------------------------*
FORM FRM_REFRESHTABLE.
* 取得当前ALV的GRID和FIELDCAT   
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'     
IMPORTING       E_GRID 
= L_REF_ALV.   
CALL METHOD L_REF_ALV->REFRESH_TABLE_DISPLAY
*       EXPORTING
*       IS_STABLE =
*       I_SOFT_REFRESH =     
EXCEPTIONS       FINISHED 
1       
OTHERS .   
IF SY-SUBRC <> 0.
*    --异常处理   
ENDIF.
ENDFORM.                    "FRM_REFRESHTABLE

*&--------------------------------------------------------------------*
*& FORM FRM_INITFIELDCAT
*&--------------------------------------------------------------------*
* 设置报表列标题
*---------------------------------------------------------------------*
FORM FRM_INITFIELDCAT.   
PERFORM APPEND_FC_ALV USING:
*             'LIGHT'       'X'  '转储状态'             20 '' 1 '' '' '' '' '' 'X',
*             'SEL'        ''  ''                       10 '' 2 'X' 'X' '' '' '' 'X',               
'BNAME'      'X' 'SAP用户名'              20 '' '' '' '' '' 'L' 'X',               
'TITLE_MEDI' 'X' '称谓'                   20 '' '' '' '' '' 'L' 'X',               
'NAME_FIRST' 'X' '姓'                     20 '' '' '' '' '' 'L' 'X',               
'NAME_LAST'  'X' '名'                     20 '' '' '' '' '' 'L' 'X',               
'PASS'       'X' '密码'                   20 '' '' '' '' '' 'L' 'X',               
'TEL'        'X' '联系方式'               20 '' '' '' '' '' 'L' 'X',               
'MAIL'       'X' '电子邮箱'               20 '' '' '' '' '' 'L' 'X',               
'AGR_NAME1'       '' '角色'               20 '' 10 '' '' '' '' 'L'  '',               
'AGR_NAME2'       '' '角色'               20 '' 11 '' '' '' '' 'L'  '',               
'AGR_NAME3'       '' '角色'               20 '' 12 '' '' '' '' 'L'  '',               
'AGR_NAME4'       '' '角色'               20 '' 13 '' '' '' '' 'L'  '',               
'AGR_NAME5'       '' '角色'               20 '' 14 '' '' '' '' 'L'  '',               
'AGR_NAME6'       '' '角色'               20 '' 15 '' '' '' '' 'L'  '',               
'AGR_NAME7'       '' '角色'               20 '' 16 '' '' '' '' 'L'  '',               
'AGR_NAME8'       '' '角色'               20 '' 17 '' '' '' '' 'L'  '',               
'AGR_NAME9'       '' '角色'               20 '' 18 '' '' '' '' 'L'  '',               
'AGR_NAME10'      '' '角色'               20 '' 19 '' '' '' '' 'L'  '',               
'AGR_NAME11'      '' '角色'               20 '' 20 '' '' '' '' 'L'  '',               
'AGR_NAME12'      '' '角色'               20 '' 21 '' '' '' '' 'L'  '',               
'AGR_NAME13'      '' '角色'               20 '' 22 '' '' '' '' 'L'  '',               
'AGR_NAME14'      '' '角色'               20 '' 23 '' '' '' '' 'L'  '',               
'AGR_NAME15'      '' '角色'               20 '' 24 '' '' '' '' 'L'  '',               
'AGR_NAME16'      '' '角色'               20 '' 25 '' '' '' '' 'L'  '',               
'AGR_NAME17'      '' '角色'               20 '' 26 '' '' '' '' 'L'  '',               
'AGR_NAME18'      '' '角色'               20 '' 27 '' '' '' '' 'L'  '',               
'AGR_NAME19'      '' '角色'               20 '' 28 '' '' '' '' 'L'  '',               
'AGR_NAME20'      '' '角色'               20 '' 29 '' '' '' '' 'L'  '',               
'AGR_NAME21'      '' '角色'               20 '' 30 '' '' '' '' 'L'  '',               
'AGR_NAME22'      '' '角色'               20 '' 31 '' '' '' '' 'L'  '',               
'AGR_NAME23'      '' '角色'               20 '' 32 '' '' '' '' 'L'  '',               
'AGR_NAME24'      '' '角色'               20 '' 33 '' '' '' '' 'L'  '',               
'AGR_NAME25'      '' '角色'               20 '' 34 '' '' '' '' 'L'  '',               
'AGR_NAME26'      '' '角色'               20 '' 35 '' '' '' '' 'L'  '',               
'AGR_NAME27'      '' '角色'               20 '' 36 '' '' '' '' 'L'  '',               
'AGR_NAME28'      '' '角色'               20 '' 37 '' '' '' '' 'L'  '',               
'AGR_NAME29'      '' '角色'               20 '' 38 '' '' '' '' 'L'  '',               
'AGR_NAME30'      '' '角色'               20 '' 39 '' '' '' '' 'L'  '',               
'AGR_NAME31'      '' '角色'               20 '' 40 '' '' '' '' 'L'  '',               
'AGR_NAME32'      '' '角色'               20 '' 41 '' '' '' '' 'L'  '',               
'AGR_NAME33'      '' '角色'               20 '' 42 '' '' '' '' 'L'  '',               
'AGR_NAME34'      '' '角色'               20 '' 43 '' '' '' '' 'L'  '',               
'AGR_NAME35'      '' '角色'               20 '' 44 '' '' '' '' 'L'  '',               
'AGR_NAME36'      '' '角色'               20 '' 45 '' '' '' '' 'L'  '',               
'AGR_NAME37'      '' '角色'               20 '' 46 '' '' '' '' 'L'  '',               
'AGR_NAME38'      '' '角色'               20 '' 47 '' '' '' '' 'L'  '',               
'AGR_NAME39'      '' '角色'               20 '' 48 '' '' '' '' 'L'  '',               
'AGR_NAME40'      '' '角色'               20 '' 49 '' '' '' '' 'L'  '',               
'AGR_NAME41'      '' '角色'               20 '' 50 '' '' '' '' 'L'  '',               
'AGR_NAME42'      '' '角色'               20 '' 51 '' '' '' '' 'L'  '',               
'AGR_NAME43'      '' '角色'               20 '' 52 '' '' '' '' 'L'  '',               
'AGR_NAME44'      '' '角色'               20 '' 53 '' '' '' '' 'L'  '',               
'AGR_NAME45'      '' '角色'               20 '' 54 '' '' '' '' 'L'  '',               
'AGR_NAME46'      '' '角色'               20 '' 55 '' '' '' '' 'L'  '',               
'AGR_NAME47'      '' '角色'               20 '' 56 '' '' '' '' 'L'  '',               
'AGR_NAME48'      '' '角色'               20 '' 57 '' '' '' '' 'L'  '',               
'AGR_NAME49'      '' '角色'               20 '' 58 '' '' '' '' 'L'  '',               
'AGR_NAME50'      '' '角色'               20 '' 59 '' '' '' '' 'L'  '',               
'AGR_NAME51'      '' '角色'               20 '' 60 '' '' '' '' 'L'  '',               
'AGR_NAME52'      '' '角色'               20 '' 61 '' '' '' '' 'L'  '',               
'AGR_NAME53'      '' '角色'               20 '' 62 '' '' '' '' 'L'  '',               
'AGR_NAME54'      '' '角色'               20 '' 63 '' '' '' '' 'L'  '',               
'AGR_NAME55'      '' '角色'               20 '' 64 '' '' '' '' 'L'  '',               
'AGR_NAME56'      '' '角色'               20 '' 65 '' '' '' '' 'L'  '',               
'AGR_NAME57'      '' '角色'               20 '' 66 '' '' '' '' 'L'  '',               
'AGR_NAME58'      '' '角色'               20 '' 67 '' '' '' '' 'L'  '',               
'AGR_NAME59'      '' '角色'               20 '' 68 '' '' '' '' 'L'  '',               
'AGR_NAME60'      '' '角色'               20 '' 69 '' '' '' '' 'L'  '',               
'AGR_NAME61'      '' '角色'               20 '' 70 '' '' '' '' 'L'  '',               
'AGR_NAME62'      '' '角色'               20 '' 71 '' '' '' '' 'L'  '',               
'AGR_NAME63'      '' '角色'               20 '' 72 '' '' '' '' 'L'  '',               
'AGR_NAME64'      '' '角色'               20 '' 73 '' '' '' '' 'L'  '',               
'AGR_NAME65'      '' '角色'               20 '' 74 '' '' '' '' 'L'  '',               
'AGR_NAME66'      '' '角色'               20 '' 75 '' '' '' '' 'L'  '',               
'AGR_NAME67'      '' '角色'               20 '' 76 '' '' '' '' 'L'  '',               
'AGR_NAME68'      '' '角色'               20 '' 77 '' '' '' '' 'L'  '',               
'AGR_NAME69'      '' '角色'               20 '' 78 '' '' '' '' 'L'  '',               
'AGR_NAME70'      '' '角色'               20 '' 79 '' '' '' '' 'L'  '',               
'AGR_NAME71'      '' '角色'               20 '' 80 '' '' '' '' 'L'  '',               
'AGR_NAME72'      '' '角色'               20 '' 81 '' '' '' '' 'L'  '',               
'AGR_NAME73'      '' '角色'               20 '' 82 '' '' '' '' 'L'  '',               
'AGR_NAME74'      '' '角色'               20 '' 83 '' '' '' '' 'L'  '',               
'AGR_NAME75'      '' '角色'               20 '' 84 '' '' '' '' 'L'  '',               
'AGR_NAME76'      '' '角色'               20 '' 85 '' '' '' '' 'L'  '',               
'AGR_NAME77'      '' '角色'               20 '' 86 '' '' '' '' 'L'  '',               
'AGR_NAME78'      '' '角色'               20 '' 87 '' '' '' '' 'L'  '',               
'AGR_NAME79'      '' '角色'               20 '' 88 '' '' '' '' 'L'  '',               
'AGR_NAME80'      '' '角色'               20 '' 89 '' '' '' '' 'L'  '',               
'AGR_NAME81'      '' '角色'               20 '' 90 '' '' '' '' 'L'  '',               
'AGR_NAME82'      '' '角色'               20 '' 91 '' '' '' '' 'L'  '',               
'AGR_NAME83'      '' '角色'               20 '' 92 '' '' '' '' 'L'  '',               
'AGR_NAME84'      '' '角色'               20 '' 93 '' '' '' '' 'L'  '',               
'AGR_NAME85'      '' '角色'               20 '' 94 '' '' '' '' 'L'  '',               
'AGR_NAME86'      '' '角色'               20 '' 95 '' '' '' '' 'L'  '',               
'AGR_NAME87'      '' '角色'               20 '' 96 '' '' '' '' 'L'  '',               
'AGR_NAME88'      '' '角色'               20 '' 97 '' '' '' '' 'L'  '',               
'AGR_NAME89'      '' '角色'               20 '' 98 '' '' '' '' 'L'  '',               
'AGR_NAME90'      '' '角色'               20 '' 99 '' '' '' '' 'L'  '',               
'AGR_NAME91'      '' '角色'               20 '' 100 '' '' '' '' 'L'  '',               
'AGR_NAME92'      '' '角色'               20 '' 101 '' '' '' '' 'L'  '',               
'AGR_NAME93'      '' '角色'               20 '' 102 '' '' '' '' 'L'  '',               
'AGR_NAME94'      '' '角色'               20 '' 103 '' '' '' '' 'L'  '',               
'AGR_NAME95'      '' '角色'               20 '' 104 '' '' '' '' 'L'  '',               
'AGR_NAME96'      '' '角色'               20 '' 105 '' '' '' '' 'L'  '',               
'AGR_NAME97'      '' '角色'               20 '' 106 '' '' '' '' 'L'  '',               
'AGR_NAME98'      '' '角色'               20 '' 107 '' '' '' '' 'L'  '',               
'AGR_NAME99'      '' '角色'               20 '' 108 '' '' '' '' 'L'  '',               
'AGR_NAME100'     '' '角色'               20 '' 109 '' '' '' '' 'L'  '',               
'PROFILE1'        '' '参数文件'           20 '' 110 '' '' '' '' 'L'  '',               
'PROFILE2'        '' '参数文件'           20 '' 111 '' '' '' '' 'L'  '',               
'PARID1'          '' '参数名'             20 '' 112 '' '' '' '' 'L'  '',               
'PARVA1'          '' '参数值'             20 '' 113 '' '' '' '' 'L'  '',               
'PARID2'          '' '参数名'             20 '' 114 '' '' '' '' 'L'  '',               
'PARVA2'          '' '参数值'             20 '' 115 '' '' '' '' 'L'  '',               
'UPDATE_ROLE'     '' '覆盖角色'           20 '' 116 '' '' '' '' 'L'  '',               
'DELETE_ROLE'     '' '删除角色'           20 '' 117 '' '' '' '' 'L'  '',               
'UPDATE_PROFILE'  '' '覆盖参数文件'       20 '' 118 '' '' '' '' 'L'  '',               
'UPDATE_PARA'     '' '覆盖参数'           20 '' 119 '' '' '' '' 'L'  '',               
'ERRMSG'     ''  '执行状态(操作对象:详细错误信息)'               50 '' 120 '' '' '' '' 'L'  ''.
ENDFORM.                    "FRM_INITFIELDCAT

*&--------------------------------------------------------------------*
*& APPEND_FC_ALV
*&--------------------------------------------------------------------*
* 设置ALV格式
*---------------------------------------------------------------------*
FORM APPEND_FC_ALV  USING   FIELDNAME     TYPE SLIS_FIELDCAT_ALV-FIELDNAME                              
KEY           TYPE SLIS_FIELDCAT_ALV-KEY                              REPTEXT_DDIC  
TYPE SLIS_FIELDCAT_ALV-REPTEXT_DDIC                              OUTPUTLEN     
TYPE SLIS_FIELDCAT_ALV-OUTPUTLEN                              INTTYPE       
TYPE SLIS_FIELDCAT_ALV-INTTYPE                              COL_POS       
TYPE SY-CUCOL                              
CHECKBOX      TYPE SLIS_FIELDCAT_ALV-CHECKBOX                              
EDIT          TYPE SLIS_FIELDCAT_ALV-EDIT                              REF_FIELDNAME 
TYPE SLIS_FIELDCAT_ALV-REF_FIELDNAME                              REF_TABNAME   
TYPE SLIS_FIELDCAT_ALV-REF_TABNAME                              JUST          
TYPE C                              FIX_COLUMN    
TYPE C.   
CLEAR LS_FIELDCAT.   LS_FIELDCAT
-FIELDNAME    = FIELDNAME.   LS_FIELDCAT
-KEY          KEY.             "程序中打“X”就是主键   LS_FIELDCAT
-REPTEXT_DDIC = REPTEXT_DDIC.   LS_FIELDCAT
-OUTPUTLEN    = OUTPUTLEN.   LS_FIELDCAT
-INTTYPE      = INTTYPE.   LS_FIELDCAT
-COL_POS      = COL_POS.   LS_FIELDCAT
-CHECKBOX     CHECKBOX.   LS_FIELDCAT
-EDIT         EDIT.   LS_FIELDCAT
-REF_FIELDNAME = REF_FIELDNAME.   LS_FIELDCAT
-REF_TABNAME  = REF_TABNAME.   LS_FIELDCAT
-JUST         = JUST.   LS_FIELDCAT
-FIX_COLUMN   = FIX_COLUMN.      "固定列
*  LS_FIELDCAT-NO_ZERO      = 'X'.   
APPEND LS_FIELDCAT TO GT_FIELDCAT.
ENDFORM.                    "APPEND_FC_ALV

*&--------------------------------------------------------------------*
*& FORM FRM_INITLAYOUT
*&--------------------------------------------------------------------*
* 初始化LAYOUT
*---------------------------------------------------------------------*
FORM FRM_INITLAYOUT.   GS_LAYOUT
-ZEBRA             'X'.   GS_LAYOUT
-CELL_MERGE        'X'.   GS_LAYOUT
-COLWIDTH_OPTIMIZE 'X'.         "列数据最优化显示   GS_LAYOUT
-NO_VLINE          ' '.         "设置列间隔线   GS_LAYOUT
-F2CODE            '&ETA'.   GS_LAYOUT
-DETAIL_POPUP      'X'.         "是否弹出详细信息窗口   GS_LAYOUT
-DETAIL_TITLEBAR   '显示明细'.  "设置弹出窗口的标题栏   GS_LAYOUT
-TOTALS_BEFORE_ITEMS ' '.   GS_LAYOUT
-BOX_FIELDNAME     'SEL'.       "ALV行项目选中的字段   GS_LAYOUT
-LIGHTS_FIELDNAME  'LIGHT'.   GS_LAYOUT
-LIGHTS_TABNAME    'GT_OUT'.   GS_LAYOUT
-COLTAB_FIELDNAME  'FARB'.
ENDFORM.                    "FRM_INITLAYOUT

*&--------------------------------------------------------------------*
*& FORM FRM_DISPLAYGRID
*&--------------------------------------------------------------------*
* 显示ALV表格
*---------------------------------------------------------------------*
FORM FRM_DISPLAYGRID.   
DATA: L_VA LIKE DISVARIANT.   
CONCATENATE '/' SY-UNAME INTO L_VA-VARIANT.   
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'     
EXPORTING       I_CALLBACK_PROGRAM       
= SY-CPROG       IS_LAYOUT                
= GS_LAYOUT       IT_FIELDCAT              
= GT_FIELDCAT       I_CALLBACK_PF_STATUS_SET 
'SET_PF_STATUS' "触发事件调用子程序       I_CALLBACK_USER_COMMAND  
'USER_COMMAND'  "鼠标事件操作子程序
*     I_CALLBACK_TOP_OF_PAGE   = 'TOP_OF_PAGE' "ALV输出表头设置       IS_VARIANT               
= L_VA       I_SAVE                   
'A'     
TABLES       T_OUTTAB                 
= GT_OUT.
ENDFORM.                    "FRM_DISPLAYGRID

*&--------------------------------------------------------------------*
*& FORM FRM_INITDATA
*&--------------------------------------------------------------------*
* 初始化数据
*---------------------------------------------------------------------*
FORM FRM_INITDATA.   FUNCTXT
-ICON_ID   = ICON_REPORT_TEMPLATE.   FUNCTXT
-QUICKINFO '下载模板'.   FUNCTXT
-ICON_TEXT '下载模板'.   SSCRFIELDS
-FUNCTXT_01 = FUNCTXT."定义按钮文本
ENDFORM.                    "FRM_INITDATA

*&--------------------------------------------------------------------*
*& FORM USER_COMMAND
*&--------------------------------------------------------------------*
* 用户自定义按钮
*---------------------------------------------------------------------*
FORM USER_COMMAND USING I_UCOMM TYPE SYUCOMM                         IS_SELFIELD 
TYPE SLIS_SELFIELD.
*  DATA: L_REF_ALV TYPE REF TO CL_GUI_ALV_GRID.
* 取得当前ALV的GRID和FIELDCAT   
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'     
IMPORTING       E_GRID 
= L_REF_ALV.   
CALL METHOD L_REF_ALV->CHECK_CHANGED_DATA."更新ALV数据
*  IS_SELFIELD-REFRESH = 'X'.   
CASE I_UCOMM.     
WHEN 'UPLOAD'.       
PERFORM FRM_UPLOADUSER.       IS_SELFIELD
-REFRESH 'X'.
*    WHEN 'SEL_ALL'.
*      LOOP AT GT_OUT INTO WA_OUT.
*        WA_OUT-SEL = 'X'.
*        MODIFY GT_OUT FROM WA_OUT.
*      ENDLOOP.
*    WHEN 'SEL_SAL'.
*      LOOP AT GT_OUT INTO WA_OUT.
*        WA_OUT-SEL = ''.
*        MODIFY GT_OUT FROM WA_OUT.
*      ENDLOOP.
*      WHEN 'PRINT'.
*         取得当前ALV的GRID和FIELDCAT
*        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*          IMPORTING
*            E_GRID = L_REF_ALV.
*        CALL METHOD L_REF_ALV->CHECK_CHANGED_DATA."更新ALV数据     
WHEN OTHERS.   
ENDCASE.
ENDFORM.                    "USER_COMMAND

*&--------------------------------------------------------------------*
*& FORM SET_PF_STATUS
*&--------------------------------------------------------------------*
* GUI状态
*---------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.   
DATA RS_EXTAB TYPE SLIS_EXTAB.   
CLEAR RT_EXTAB.   
REFRESH RT_EXTAB.
*  RS_EXTAB-FCODE = '&ALL'. APPEND RS_EXTAB TO RT_EXTAB.
*  RS_EXTAB-FCODE = '&SAL'. APPEND RS_EXTAB TO RT_EXTAB.   RS_EXTAB
-FCODE '&CRB'APPEND RS_EXTAB TO RT_EXTAB.   RS_EXTAB
-FCODE '&CRL'APPEND RS_EXTAB TO RT_EXTAB.   RS_EXTAB
-FCODE '&CRR'APPEND RS_EXTAB TO RT_EXTAB.   RS_EXTAB
-FCODE '&CRE'APPEND RS_EXTAB TO RT_EXTAB.   

READ TABLE GT_OUT INTO WA_OUT WITH KEY LIGHT '1'.   
IF SY-SUBRC 0.     RS_EXTAB
-FCODE 'UPLOAD'APPEND RS_EXTAB TO RT_EXTAB.   
ELSE.   
ENDIF.   

SET PF-STATUS 'STANDARD' EXCLUDING RT_EXTAB.   
SET TITLEBAR 'GUI_TITLE'.
ENDFORM.                    "SET_PF_STATUS

*&--------------------------------------------------------------------*
*& FORM FRM_CHECKINPUT
*&--------------------------------------------------------------------*
* 检查按钮选择的是下载模板按钮
*---------------------------------------------------------------------*
FORM FRM_CHECKINPUT.   
DATA L_RET TYPE ABAP_BOOL.   
CASE SSCRFIELDS-UCOMM.     
WHEN 'FC01'.       
PERFORM FRM_DOWNTEMPLATE."下载模版     
WHEN 'ONLI'.       
IF USERFILE IS INITIAL.         
MESSAGE S010(2BWITH '请先选择模板文件!' DISPLAY LIKE 'E'.         
STOP.       
ENDIF.       
PERFORM FRM_GETFILETYPE."获取文件类型       
PERFORM FRM_READERFILEDATA."判断上传文件类型,读取文件内容
*      CLEAR USERFILE."清空控件上的路径     
WHEN OTHERS.   
ENDCASE.
ENDFORM.                   "FRM_CHECKINPUT

*&--------------------------------------------------------------------*
*& FORM FRM_FILEOPEN
*&--------------------------------------------------------------------*
* 打开文件
*---------------------------------------------------------------------*
FORM FRM_FILEOPEN USING USERFILE.   
DATA: L_FILETAB   TYPE FILETABLE,         L_RC        
TYPE I.   
CLEAR L_FILETAB.   
REFRESH L_FILETAB.
* OPEN DIALOG   
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG     
EXPORTING
*     WINDOW_TITLE         = 'SAP CUSTOM - OPEN FILE'
*     DEFAULT_EXTENSION    =       DEFAULT_FILENAME     
'*.XLS'
*     FILE_FILTER          = '*.XLS'       INITIAL_DIRECTORY    
'D:\'       MULTISELECTION       
''     
CHANGING       FILE_TABLE           
= L_FILETAB       RC                   
= L_RC     
EXCEPTIONS       CNTL_ERROR           
1       ERROR_NO_GUI         
2       NOT_SUPPORTED_BY_GUI 
3       
OTHERS               4.
* GET FILE PATH   
CHECK L_RC EQ 1.   
READ TABLE L_FILETAB INDEX INTO USERFILE.
ENDFORM.                    "FRM_FILEOPEN

*&--------------------------------------------------------------------*
*& FORM FRM_GETFILETYPE
*&--------------------------------------------------------------------*
* 获取文本类型
* 从文件名最后一位判断直到首次出现.符号
*---------------------------------------------------------------------*
FORM FRM_GETFILETYPE.   
DATA: LEN TYPE I,          POS 
TYPE I,          CHAR 
TYPE C.   LEN 
STRLEN( USERFILE ).   POS 
= LEN.   
DO LEN TIMES.     POS 
= POS 1.     CHAR 
= USERFILE+POS(1).     
IF CHAR '.'.       LEN 
= LEN - POS.       POS 
= POS + 1.       FILETYPE 
= USERFILE+POS(LEN).       
TRANSLATE FILETYPE TO UPPER CASE.       FILENAME 
= USERFILE.       
EXIT.     
ENDIF.   
ENDDO.
ENDFORM.              "FRM_GETFILETYPE

*&--------------------------------------------------------------------*
*& FORM FRM_READERFILEDATA
*&--------------------------------------------------------------------*
* 读取文件内容
*---------------------------------------------------------------------*
FORM FRM_READERFILEDATA.   
DATA :  ICX_OBL_PARAMETER_ERROR TYPE REF TO CX_ROOT,           ERROR_TEXT 
TYPE C LENGTH 100.   

"判断上传文件类型,读取文件内容   
IF FILETYPE 'XLS' OR FILETYPE 'XLSX'.     
"当为EXCEL类型时调用此参数,所抓取的文件数据在内表中为每个单元格为一行     
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'       
EXPORTING         FILENAME                
= FILENAME         I_BEGIN_COL             
1         I_BEGIN_ROW             
2         I_END_COL               
117         I_END_ROW               
4000       
TABLES         INTERN                  
= GT_ALSMEX       
EXCEPTIONS         INCONSISTENT_PARAMETERS 
1         UPLOAD_OLE              
2         
OTHERS                  3.

* 从EXCEL抓取数据整理到内表     
IF GT_ALSMEX IS NOT INITIAL.       
LOOP AT GT_ALSMEX INTO WA_ALSMEX.         
ON CHANGE OF WA_ALSMEX-ROW.           
IF WA_ALSMEX-ROW <> 1.             
APPEND WA_FILE TO GT_FILE.             
CLEAR WA_FILE.           
ENDIF.         
ENDON.         
CONDENSE WA_ALSMEX-VALUE NO-GAPS.         
TRY.             
CASE WA_ALSMEX-COL.               
WHEN '0001'. WA_FILE-BNAME = WA_ALSMEX-VALUE.               
WHEN '0002'. WA_FILE-TITLE_MEDI = WA_ALSMEX-VALUE.               
WHEN '0003'. WA_FILE-NAME_FIRST = WA_ALSMEX-VALUE.               
WHEN '0004'. WA_FILE-NAME_LAST = WA_ALSMEX-VALUE.               
WHEN '0005'. WA_FILE-PASS = WA_ALSMEX-VALUE.               
WHEN '0006'. WA_FILE-TEL = WA_ALSMEX-VALUE.               
WHEN '0007'. WA_FILE-MAIL = WA_ALSMEX-VALUE.               
WHEN '0008'. WA_FILE-AGR_NAME1 = WA_ALSMEX-VALUE.               
WHEN '0009'. WA_FILE-AGR_NAME2 = WA_ALSMEX-VALUE.               
WHEN '0010'. WA_FILE-AGR_NAME3 = WA_ALSMEX-VALUE.               
WHEN '0011'. WA_FILE-AGR_NAME4 = WA_ALSMEX-VALUE.               
WHEN '0012'. WA_FILE-AGR_NAME5 = WA_ALSMEX-VALUE.               
WHEN '0013'. WA_FILE-AGR_NAME6 = WA_ALSMEX-VALUE.               
WHEN '0014'. WA_FILE-AGR_NAME7 = WA_ALSMEX-VALUE.               
WHEN '0015'. WA_FILE-AGR_NAME8 = WA_ALSMEX-VALUE.               
WHEN '0016'. WA_FILE-AGR_NAME9 = WA_ALSMEX-VALUE.               
WHEN '0017'. WA_FILE-AGR_NAME10 = WA_ALSMEX-VALUE.               
WHEN '0018'. WA_FILE-AGR_NAME11 = WA_ALSMEX-VALUE.               
WHEN '0019'. WA_FILE-AGR_NAME12 = WA_ALSMEX-VALUE.               
WHEN '0020'. WA_FILE-AGR_NAME13 = WA_ALSMEX-VALUE.               
WHEN '0021'. WA_FILE-AGR_NAME14 = WA_ALSMEX-VALUE.               
WHEN '0022'. WA_FILE-AGR_NAME15 = WA_ALSMEX-VALUE.               
WHEN '0023'. WA_FILE-AGR_NAME16 = WA_ALSMEX-VALUE.               
WHEN '0024'. WA_FILE-AGR_NAME17 = WA_ALSMEX-VALUE.               
WHEN '0025'. WA_FILE-AGR_NAME18 = WA_ALSMEX-VALUE.               
WHEN '0026'. WA_FILE-AGR_NAME19 = WA_ALSMEX-VALUE.               
WHEN '0027'. WA_FILE-AGR_NAME20 = WA_ALSMEX-VALUE.               
WHEN '0028'. WA_FILE-AGR_NAME21 = WA_ALSMEX-VALUE.               
WHEN '0029'. WA_FILE-AGR_NAME22 = WA_ALSMEX-VALUE.               
WHEN '0030'. WA_FILE-AGR_NAME23 = WA_ALSMEX-VALUE.               
WHEN '0031'. WA_FILE-AGR_NAME24 = WA_ALSMEX-VALUE.               
WHEN '0032'. WA_FILE-AGR_NAME25 = WA_ALSMEX-VALUE.               
WHEN '0033'. WA_FILE-AGR_NAME26 = WA_ALSMEX-VALUE.               
WHEN '0034'. WA_FILE-AGR_NAME27 = WA_ALSMEX-VALUE.               
WHEN '0035'. WA_FILE-AGR_NAME28 = WA_ALSMEX-VALUE.               
WHEN '0036'. WA_FILE-AGR_NAME29 = WA_ALSMEX-VALUE.               
WHEN '0037'. WA_FILE-AGR_NAME30 = WA_ALSMEX-VALUE.               
WHEN '0038'. WA_FILE-AGR_NAME31 = WA_ALSMEX-VALUE.               
WHEN '0039'. WA_FILE-AGR_NAME32 = WA_ALSMEX-VALUE.               
WHEN '0040'. WA_FILE-AGR_NAME33 = WA_ALSMEX-VALUE.               
WHEN '0041'. WA_FILE-AGR_NAME34 = WA_ALSMEX-VALUE.               
WHEN '0042'. WA_FILE-AGR_NAME35 = WA_ALSMEX-VALUE.               
WHEN '0043'. WA_FILE-AGR_NAME36 = WA_ALSMEX-VALUE.               
WHEN '0044'. WA_FILE-AGR_NAME37 = WA_ALSMEX-VALUE.               
WHEN '0045'. WA_FILE-AGR_NAME38 = WA_ALSMEX-VALUE.               
WHEN '0046'. WA_FILE-AGR_NAME39 = WA_ALSMEX-VALUE.               
WHEN '0047'. WA_FILE-AGR_NAME40 = WA_ALSMEX-VALUE.               
WHEN '0048'. WA_FILE-AGR_NAME41 = WA_ALSMEX-VALUE.               
WHEN '0049'. WA_FILE-AGR_NAME42 = WA_ALSMEX-VALUE.               
WHEN '0050'. WA_FILE-AGR_NAME43 = WA_ALSMEX-VALUE.               
WHEN '0051'. WA_FILE-AGR_NAME44 = WA_ALSMEX-VALUE.               
WHEN '0052'. WA_FILE-AGR_NAME45 = WA_ALSMEX-VALUE.               
WHEN '0053'. WA_FILE-AGR_NAME46 = WA_ALSMEX-VALUE.               
WHEN '0054'. WA_FILE-AGR_NAME47 = WA_ALSMEX-VALUE.               
WHEN '0055'. WA_FILE-AGR_NAME48 = WA_ALSMEX-VALUE.               
WHEN '0056'. WA_FILE-AGR_NAME49 = WA_ALSMEX-VALUE.               
WHEN '0057'. WA_FILE-AGR_NAME50 = WA_ALSMEX-VALUE.               
WHEN '0058'. WA_FILE-AGR_NAME51 = WA_ALSMEX-VALUE.               
WHEN '0059'. WA_FILE-AGR_NAME52 = WA_ALSMEX-VALUE.               
WHEN '0060'. WA_FILE-AGR_NAME53 = WA_ALSMEX-VALUE.               
WHEN '0061'. WA_FILE-AGR_NAME54 = WA_ALSMEX-VALUE.               
WHEN '0062'. WA_FILE-AGR_NAME55 = WA_ALSMEX-VALUE.               
WHEN '0063'. WA_FILE-AGR_NAME56 = WA_ALSMEX-VALUE.               
WHEN '0064'. WA_FILE-AGR_NAME57 = WA_ALSMEX-VALUE.               
WHEN '0065'. WA_FILE-AGR_NAME58 = WA_ALSMEX-VALUE.               
WHEN '0066'. WA_FILE-AGR_NAME59 = WA_ALSMEX-VALUE.               
WHEN '0067'. WA_FILE-AGR_NAME60 = WA_ALSMEX-VALUE.               
WHEN '0068'. WA_FILE-AGR_NAME61 = WA_ALSMEX-VALUE.               
WHEN '0069'. WA_FILE-AGR_NAME62 = WA_ALSMEX-VALUE.               
WHEN '0070'. WA_FILE-AGR_NAME63 = WA_ALSMEX-VALUE.               
WHEN '0071'. WA_FILE-AGR_NAME64 = WA_ALSMEX-VALUE.               
WHEN '0072'. WA_FILE-AGR_NAME65 = WA_ALSMEX-VALUE.               
WHEN '0073'. WA_FILE-AGR_NAME66 = WA_ALSMEX-VALUE.               
WHEN '0074'. WA_FILE-AGR_NAME67 = WA_ALSMEX-VALUE.               
WHEN '0075'. WA_FILE-AGR_NAME68 = WA_ALSMEX-VALUE.               
WHEN '0076'. WA_FILE-AGR_NAME69 = WA_ALSMEX-VALUE.               
WHEN '0077'. WA_FILE-AGR_NAME70 = WA_ALSMEX-VALUE.               
WHEN '0078'. WA_FILE-AGR_NAME71 = WA_ALSMEX-VALUE.               
WHEN '0079'. WA_FILE-AGR_NAME72 = WA_ALSMEX-VALUE.               
WHEN '0080'. WA_FILE-AGR_NAME73 = WA_ALSMEX-VALUE.               
WHEN '0081'. WA_FILE-AGR_NAME74 = WA_ALSMEX-VALUE.               
WHEN '0082'. WA_FILE-AGR_NAME75 = WA_ALSMEX-VALUE.               
WHEN '0083'. WA_FILE-AGR_NAME76 = WA_ALSMEX-VALUE.               
WHEN '0084'. WA_FILE-AGR_NAME77 = WA_ALSMEX-VALUE.               
WHEN '0085'. WA_FILE-AGR_NAME78 = WA_ALSMEX-VALUE.               
WHEN '0086'. WA_FILE-AGR_NAME79 = WA_ALSMEX-VALUE.               
WHEN '0087'. WA_FILE-AGR_NAME80 = WA_ALSMEX-VALUE.               
WHEN '0088'. WA_FILE-AGR_NAME81 = WA_ALSMEX-VALUE.               
WHEN '0089'. WA_FILE-AGR_NAME82 = WA_ALSMEX-VALUE.               
WHEN '0090'. WA_FILE-AGR_NAME83 = WA_ALSMEX-VALUE.               
WHEN '0091'. WA_FILE-AGR_NAME84 = WA_ALSMEX-VALUE.               
WHEN '0092'. WA_FILE-AGR_NAME85 = WA_ALSMEX-VALUE.               
WHEN '0093'. WA_FILE-AGR_NAME86 = WA_ALSMEX-VALUE.               
WHEN '0094'. WA_FILE-AGR_NAME87 = WA_ALSMEX-VALUE.               
WHEN '0095'. WA_FILE-AGR_NAME88 = WA_ALSMEX-VALUE.               
WHEN '0096'. WA_FILE-AGR_NAME89 = WA_ALSMEX-VALUE.               
WHEN '0097'. WA_FILE-AGR_NAME90 = WA_ALSMEX-VALUE.               
WHEN '0098'. WA_FILE-AGR_NAME91 = WA_ALSMEX-VALUE.               
WHEN '0099'. WA_FILE-AGR_NAME92 = WA_ALSMEX-VALUE.               
WHEN '0100'. WA_FILE-AGR_NAME93 = WA_ALSMEX-VALUE.               
WHEN '0101'. WA_FILE-AGR_NAME94 = WA_ALSMEX-VALUE.               
WHEN '0102'. WA_FILE-AGR_NAME95 = WA_ALSMEX-VALUE.               
WHEN '0103'. WA_FILE-AGR_NAME96 = WA_ALSMEX-VALUE.               
WHEN '0104'. WA_FILE-AGR_NAME97 = WA_ALSMEX-VALUE.               
WHEN '0105'. WA_FILE-AGR_NAME98 = WA_ALSMEX-VALUE.               
WHEN '0106'. WA_FILE-AGR_NAME99 = WA_ALSMEX-VALUE.               
WHEN '0107'. WA_FILE-AGR_NAME100 = WA_ALSMEX-VALUE.               
WHEN '0108'. WA_FILE-PROFILE1 = WA_ALSMEX-VALUE.               
WHEN '0109'. WA_FILE-PROFILE2 = WA_ALSMEX-VALUE.               
WHEN '0110'. WA_FILE-PARID1 = WA_ALSMEX-VALUE.               
WHEN '0111'. WA_FILE-PARVA1 = WA_ALSMEX-VALUE.               
WHEN '0112'. WA_FILE-PARID2 = WA_ALSMEX-VALUE.               
WHEN '0113'. WA_FILE-PARVA2 = WA_ALSMEX-VALUE.               
WHEN '0114'. WA_FILE-UPDATE_ROLE = WA_ALSMEX-VALUE.               
WHEN '0115'. WA_FILE-DELETE_ROLE = WA_ALSMEX-VALUE.               
WHEN '0116'. WA_FILE-UPDATE_PROFILE = WA_ALSMEX-VALUE.               
WHEN '0117'. WA_FILE-UPDATE_PARA = WA_ALSMEX-VALUE.             
ENDCASE.           
CATCH CX_SY_CONVERSION_ERROR INTO ICX_OBL_PARAMETER_ERROR.             ERROR_TEXT 
= ICX_OBL_PARAMETER_ERROR->GET_LONGTEXT).             
CONCATENATE '第' WA_ALSMEX-ROW  '行' WA_ALSMEX-COL '列' ERROR_TEXT             
INTO ERROR_TEXT.             
MESSAGE I000(0KWITH '参数类型出现错误,请检查。错误发生位置:' ERROR_TEXT.             
STOP.         
ENDTRY.         
CLEAR: WA_ALSMEX.       
ENDLOOP.       
APPEND WA_FILE TO GT_FILE.       
CLEAR WA_FILE.     
ENDIF.   
ELSE.     
MESSAGE S010(2BWITH '文件类型只能是XLS和XLSX格式!' DISPLAY LIKE 'E'.     
STOP.   
ENDIF.
ENDFORM.                   "FRM_READERFILEDATA

*&--------------------------------------------------------------------*
*& FORM FRM_DOWNTEMPLATE
*&--------------------------------------------------------------------*
* 下载模板
*---------------------------------------------------------------------*
FORM FRM_DOWNTEMPLATE.   
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG     
EXPORTING       WINDOW_TITLE      
'下载模板文件到本地'       DEFAULT_EXTENSION 
'XLS'                           "缺省文件类型       DEFAULT_FILE_NAME 
'用户角色维护模板'       FILE_FILTER       
'文本文件(*.TXT)|*.TXT|EXCEL 文件 (*.XLS)|*.XLS;*.XLSX|所有文件 (*.*)|*.*|'       WITH_ENCODING     
'X'       INITIAL_DIRECTORY 
'D:\'     
CHANGING       FILENAME          
= FILENAME1                       "用户输入文件名       PATH              
= PATH                            "获得用户所选路径       FULLPATH          
= FULLPATH                        "全路径       USER_ACTION       
= USER_ACTION       FILE_ENCODING     
ENCODING.   

IF SY-SUBRC <> OR USER_ACTION <> CL_GUI_FRONTEND_SERVICES=>ACTION_OK.     
EXIT.   
ENDIF.   

IF FULLPATH IS NOT INITIAL.     
DATA: LV_OBJDATA     TYPE  WWWDATATAB,           LV_OBJ_NAME    
TYPE  WWWDATATAB-OBJID,           LV_DESTINATION 
TYPE  RLGRAP-FILENAME,           LV_OBJID       
TYPE  SY-REPID,           LV_SUBRC       
TYPE  SY-SUBRC.     
DATA: L_RET          TYPE ABAP_BOOL,           LV_ANSWER
.     
DATA: LV_FILE        TYPE STRING.     C_PATH 

= FULLPATH.     
MOVE C_PATH TO LV_FILE.     

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST       
EXPORTING         FILE                 
= LV_FILE       RECEIVING         RESULT               

= L_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.       
EXIT.     
ENDIF.     

IF L_RET EQ C_YES.
* 模版已存在,是否覆盖       
CALL FUNCTION 'POPUP_TO_CONFIRM'         
EXPORTING           TEXT_QUESTION  
'模版已存在,是否覆盖?'           TEXT_BUTTON_1  
'是'(002)           TEXT_BUTTON_2  
'否'(003)         
IMPORTING           ANSWER         
= LV_ANSWER         
EXCEPTIONS           TEXT_NOT_FOUND 
1           
OTHERS         2.       
IF SY-SUBRC <> 0.       
ENDIF.       

IF LV_ANSWER EQ 'A'"取消         
EXIT.       
ELSEIF LV_ANSWER NE '1'"否         P_FILEPATH 
= C_PATH.       
ENDIF.     
ELSE.       LV_ANSWER 
'1'.     
ENDIF.     

CREATE OBJECT G_EXCEL 'EXCEL.APPLICATION'.     
GET PROPERTY OF G_EXCEL 'WORKBOOKS' = G_WORKBOOK .     
CALL METHOD OF         G_WORKBOOK         

'CLOSE'.     

IF LV_ANSWER EQ '1'.       
MOVE G_FILEN TO LV_OBJ_NAME.       
SELECT RELID OBJID         
FROM WWWDATA         
INTO  CORRESPONDING FIELDS OF LV_OBJDATA         
UP TO ROWS         
WHERE SRTF2 AND RELID 'MI'           
AND OBJID = LV_OBJ_NAME.       
ENDSELECT.       

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'         
EXPORTING           
KEY         = LV_OBJDATA           DESTINATION 
= C_PATH         
IMPORTING           RC          
= LV_SUBRC.       
IF LV_SUBRC 0.         P_FILEPATH    
= C_PATH.       
ENDIF.     
ENDIF.     

CALL METHOD OF         G_WORKBOOK         

'OPEN'       

EXPORTING         #1         
= C_PATH.     

CALL METHOD OF         G_EXCEL         

'WORKSHEETS' = G_SHEET       
EXPORTING         #1           
1.     

CALL METHOD OF         G_SHEET         

'ACTIVATE'.     

CALL METHOD OF         G_WORKBOOK         

'CLOSE'.

*  SET PROPERTY OF G_EXCEL 'VISIBLE' = 1.     

FREE OBJECT G_SHEET.     
FREE OBJECT G_APPLICA.     
FREE OBJECT G_WORKBOOK.     
FREE OBJECT G_EXCEL.   
ELSE.     
MESSAGE I005(ZMESSWITH '文件路径不存在.' DISPLAY LIKE 'E'.   
ENDIF.
ENDFORM.                    "FRM_DOWNTEMPLATE

*&---------------------------------------------------------------------*
*& FORM  ADD_ZERO
*&---------------------------------------------------------------------*
*  添加前导0
*----------------------------------------------------------------------*
FORM ADD_ZERO CHANGING P_IN.   
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'     
EXPORTING       
INPUT  = P_IN     
IMPORTING       
OUTPUT = P_IN.
ENDFORM.                    "ADD_ZERO

*&---------------------------------------------------------------------*
*& FORM  DEL_ZERO
*&---------------------------------------------------------------------*
*  去掉前导0
*----------------------------------------------------------------------*
FORM DEL_ZERO CHANGING P_OUT.   
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'     
EXPORTING       
INPUT  = P_OUT     
IMPORTING       
OUTPUT = P_OUT.
ENDFORM.                    "DEL_ZERO

*&---------------------------------------------------------------------*
*& FORM FRM_SETBGCOLOR
*&---------------------------------------------------------------------*
* 必填项加底色 黄色
*----------------------------------------------------------------------*
FORM FRM_SETBGCOLOR USING FIELDS.   
CLEAR FARB1.   FARB1
-FIELDNAME FIELDS.   FARB1
-COLOR-COL 3.   
APPEND FARB1 TO WA_OUT-FARB.
ENDFORM.                   "FRM_SETBGCOLOR

 

*&---------------------------------------------------------------------*
*& Report  ZUSER_UPLOAD
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zuser_upload.


TABLES: usr01"用户主记录 (运行时数据)
        usr21"分配用户名称地址码
        adrp,  "个人(办公地址管理)
*        AGR_USERS, "分配角色到用户
        sscrfields"选择屏幕上的字段,用于获取选择的按钮对象
        zusr02,
        zusr05,
        zagr_users,
        zsmen_buffc.


CONSTANTS: c_yes    TYPE VALUE 'X',                           "是否下载
           g_filen  TYPE wwwdatatab-objid VALUE 'Z_USER_EXCEL'"EXCEL下载模板名称

*定义文件名称和类型变量(文件上传)
DATA: filename     TYPE localfile,                              "文件路径
      filetype(10TYPE c.                                      "文件类型

*定义OLE变量(模板下载)
DATA: g_excel      TYPE ole2_object,
      g_applica    TYPE ole2_object,
      g_sheet      TYPE ole2_object,
      g_cell       TYPE ole2_object,
      g_workbook   TYPE ole2_object.

*用于下载模板存放文件路径等信息(模板下载)
DATA: fullpath    TYPE string,
      filename1   TYPE string,
      path        TYPE string,
      user_action TYPE i,
      encoding    TYPE abap_encoding,
      p_filepath  TYPE string,
      c_path(128TYPE c.

DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
      gs_layout   TYPE slis_layout_alv,
      gt_sort     TYPE slis_sortinfo_alv,
      gt_list_top_of_page TYPE slis_t_listheader,
      ls_fieldcat TYPE slis_fieldcat_alv,
      farb1       TYPE slis_specialcol_alv,
      l_ref_alv   TYPE REF TO cl_gui_alv_grid.
DATA: functxt TYPE smp_dyntxt.

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.
*SELECTION-SCREEN SKIP.
*SELECTION-SCREEN PUSHBUTTON /1(15) BTN USER-COMMAND ATTCH.  "下载模板按钮
PARAMETERS: userfile TYPE rlgrap-filename.                     "上载模板文件
SELECTION-SCREEN END OF BLOCK bl1.

SELECTION-SCREENFUNCTION KEY 1.  "激活按钮

TYPESBEGIN OF typ_file,
      bname TYPE sy-uname,

*&ROLE:
      agr_name(30000),

 title_medi(30),
      name_first(40),
      name_last(40),
      pass(40),
      tel(30),
      mail(241),

*&更新状态插入/修改:
      type(1),
END OF typ_file.

TYPESBEGIN OF typ_out.
        INCLUDE TYPE typ_file.
TYPES:
      errmsg(1000),
      farb        TYPE   slis_t_specialcol_alv,
      light       TYPE   char1,               "指示灯字段: 1:Red 2:Yellow 3:Green
      errstep     TYPE   i,
      sel,
END OF typ_out.

*TYPES:
*  BEGIN OF TY_BNAME,
*    BNAME TYPE USR01-BNAME,
*  END OF TY_BNAME.
*
*DATA: GT_BNAME TYPE STANDARD TABLE OF TY_BNAME.

*TYPES: BEGIN OF TYP_AGR_USERS,
*    UNAME    TYPE AGR_USERS-UNAME,
*    AGR_NAME TYPE AGR_USERS-AGR_NAME,
*END OF TYP_AGR_USERS.

TYPESBEGIN OF typ_alsmex.
        INCLUDE STRUCTURE alsmex_tabline.
TYPESEND OF typ_alsmex.

*存放读取文件中的数据
DATA: gt_file TYPE STANDARD TABLE OF typ_file,
      wa_file TYPE typ_file.

*定义 Excel 数据(上传)
DATA: gt_alsmex TYPE STANDARD TABLE OF typ_alsmex,
      wa_alsmex TYPE typ_alsmex.

DATA: g_acc     TYPE i,
      errmsg(1000).

DATA: gt_out    TYPE STANDARD TABLE OF typ_out,
      wa_out    TYPE typ_out,
      wa_out1   TYPE typ_out.
*      GT_AGR_USERS    TYPE STANDARD TABLE OF TYP_AGR_USERS,
*      WA_AGR_USERS    TYPE TYP_AGR_USERS.
DATA :lt_zusr02     LIKE STANDARD TABLE OF zusr02     WITH HEADER LINE .
DATA :lt_zusr05     LIKE STANDARD TABLE OF zusr05     WITH HEADER LINE.
DATA :lt_zagr_users LIKE STANDARD TABLE OF zagr_users WITH HEADER LINE.
DATA :lt_zsmen_buffc LIKE STANDARD TABLE OF zsmen_buffc WITH HEADER LINE.
*---------------------------------------------------------------
* INITIALIZATION 启动程序开始执行
*---------------------------------------------------------------
INITIALIZATION.
*&初始化数据
  PERFORM frm_initdata.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR userfile.
  PERFORM frm_fileopen USING userfile.

AT SELECTION-SCREEN.
* 检查下载模板按钮
  PERFORM frm_checkinput.

AT SELECTION-SCREEN OUTPUT.
*  PERFORM FRM_INITLIST.

*---------------------------------------------------------------
* AT START SELECTION 主程序逻辑开始
*---------------------------------------------------------------
START-OF-SELECTION.
*& 检验导入数据
  PERFORM frm_checkdata.
*& 用ALV显示查询到的数据
  PERFORM frm_showdata.

*&--------------------------------------------------------------------*
*& FORM FRM_GETDATA
*&--------------------------------------------------------------------*
* 根据查询方式取数
*---------------------------------------------------------------------*
FORM frm_getdata.

ENDFORM.                    "FRM_GETDATA

*&--------------------------------------------------------------------*
*& FORM FRM_CHECKDATA
*&--------------------------------------------------------------------*
* 检查数据
*---------------------------------------------------------------------*
FORM frm_checkdata.
  CLEAR: gt_out.
  IF gt_file IS NOT INITIAL.
    LOOP AT gt_file INTO wa_file.
      MOVE-CORRESPONDING wa_file TO wa_out.
*      PERFORM ADD_ZERO CHANGING WA_OUT-MATNR.
      TRANSLATE wa_out-agr_name TO UPPER CASE.



      APPEND wa_out TO gt_out.
      CLEAR: wa_file, wa_out.
    ENDLOOP.
  ELSE.
  ENDIF.

  DATA: bname      TYPE char12,
        name_last  TYPE char40,   "姓
        name_first TYPE char40.   "名

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zusr02 FROM zusr02
    FOR ALL ENTRIES IN gt_out
    WHERE bname = gt_out-bname .

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zusr05 FROM zusr05
  FOR ALL ENTRIES IN gt_out
  WHERE bname = gt_out-bname .

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zagr_users FROM zagr_users
  FOR ALL ENTRIES IN gt_out
  WHERE uname = gt_out-bname .

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zsmen_buffc FROM zsmen_buffc
  FOR ALL ENTRIES IN gt_out
  WHERE uname = gt_out-bname .


  LOOP AT gt_out INTO wa_out.
*    "必填项 底色加黄
    PERFORM frm_setbgcolor USING 'BNAME'.

******* 1. 检查用户名是否为空

******** 2 检查用户名是否存在重复: BNAME
*    CLEAR G_ACC.
*    LOOP AT GT_OUT INTO WA_OUT1 WHERE BNAME = WA_OUT-BNAME.
*      G_ACC = G_ACC + 1.
*    ENDLOOP.
*    IF G_ACC > 1.
*      WA_OUT-ERRMSG = '数据检查失败:导入文件中存在重复的用户名'.
*      WA_OUT-LIGHT = 1.
*      MODIFY GT_OUT FROM WA_OUT.
*      CLEAR WA_OUT.
*      CONTINUE.
*    ENDIF.
******** 3 检查系统用户名是否存在重复: BNAME
*   PERFORM add_zero USING WA_OUT-BNAME .
*   PERFORM DEL_zero USING WA_OUT-BNAME .
    CLEAR: bname, name_last, name_first.
    SELECT SINGLE a~bname
             b~name_first   "名
             b~name_last "姓
      INTO (bname, wa_out-name_last,wa_out-name_first)       
FROM zusr21 AS a       INNER 
JOIN zadrp AS b ON a~persnumber = b~persnumber       
WHERE a~bname = wa_out-bname.     
CONDENSE name_last.     
CONDENSE name_first.     

SELECT SINGLE              b
~tel_number       
INTO  wa_out-tel       
FROM zusr21 AS a       INNER 
JOIN zadcp AS b ON a~persnumber = b~persnumber       
WHERE a~bname = wa_out-bname.
*    IF BNAME NE SPACE AND ( NAME_LAST <> WA_OUT-NAME_LAST OR NAME_FIRST <> WA_OUT-NAME_FIRST ).
*      WA_OUT-ERRMSG = '数据检查失败:系统中已在存在该用户名,但姓名不相同'.
*      WA_OUT-LIGHT = 1.
*      MODIFY GT_OUT FROM WA_OUT.
*      CLEAR WA_OUT.
*      CONTINUE.
*    ENDIF.

******** 4  权限检查
*    AUTHORITY-CHECK OBJECT 'M_MSEG_WWA'
*    ID 'WERKS' FIELD WA_OUT-WERKS
*    ID 'ACTVT' DUMMY.
*    IF SY-SUBRC NE 0.
*      CONCATENATE '数据检查失败:当前用户没有创建用户的操作权限' INTO WA_OUT-ERRMSG.
*      WA_OUT-LIGHT = 1.
*      MODIFY GT_OUT FROM WA_OUT.
*      CLEAR WA_OUT.
*      CONTINUE.
*    ENDIF.     wa_out

-light 3.     
MODIFY gt_out FROM wa_out  .     
CLEAR wa_out.   
ENDLOOP.
ENDFORM.                    " FRM_CHECKDATA

*&--------------------------------------------------------------------*
*& FORM FRM_SHOWDATA
*&--------------------------------------------------------------------*
* 显示ALV报表数据
*---------------------------------------------------------------------*
FORM frm_showdata.   
PERFORM frm_initfieldcat.   
PERFORM frm_initlayout.   
PERFORM frm_displaygrid.
ENDFORM.                    "FRM_SHOWDATA

*&--------------------------------------------------------------------
*& FORM  FRM_UPLOADUSER
*&--------------------------------------------------------------------
* 更新用户
*---------------------------------------------------------------------*
FORM frm_uploaduser.
*  LOOP AT GT_OUT INTO WA_OUT.
*    TRANSLATE WA_OUT-BNAME TO UPPER CASE.
*
**    SELECT SINGLE * FROM USR01 WHERE BNAME = WA_OUT-BNAME.
**    IF SY-SUBRC EQ 0.
**      TRANSLATE WA_OUT-DELETE_ROLE TO UPPER CASE.
**      IF WA_OUT-DELETE_ROLE = 'X'.
**        WA_OUT-TYPE = 'D'.
**      ELSE.
**        WA_OUT-TYPE = 'U'.
**      ENDIF.
**    ELSE.
**      WA_OUT-TYPE = 'C'.
**    ENDIF.
*    MODIFY GT_OUT FROM WA_OUT TRANSPORTING BNAME TYPE.
*    CLEAR: WA_OUT.
*  ENDLOOP.   

DATA: oper_type.   
SORT gt_out BY bname.   
LOOP AT gt_out INTO wa_out.     
CLEAR errmsg.     
CONDENSE wa_out-bname NO-GAPS.     
TRANSLATE wa_out-bname TO UPPER CASE.     oper_type 

'C'.     
PERFORM frm_createuser.
*    CASE WA_OUT-TYPE.
*&创建时
*&只增加角色

*      WHEN 'C'.
*        OPER_TYPE = 'C'.
*        PERFORM FRM_CREATEUSER.
**&修改时
*      WHEN 'U'.
*        OPER_TYPE = 'U'.
*        PERFORM FRM_UPDATEUSER.
*      WHEN 'D'.
*        OPER_TYPE = 'D'.
*        PERFORM FRM_DELETEROLE.
*    ENDCASE.
* 更新LED灯     
IF errmsg IS NOT INITIAL.       
CLEAR wa_out1.       
LOOP AT gt_out INTO wa_out1.         
IF wa_out1-bname = wa_out-bname.           
MOVE '1' TO wa_out1-light"添加红灯           
MOVE errmsg TO wa_out1-errmsg.           
MODIFY gt_out FROM wa_out1 TRANSPORTING light errmsg.         
ENDIF.         
CLEAR: wa_out1.       
ENDLOOP.     
ELSE.       
LOOP AT gt_out INTO wa_out1.         
IF wa_out1-bname = wa_out-bname.           
MOVE '3' TO wa_out1-light"添加绿灯           
IF oper_type 'C'.             
MOVE '用户创建成功' TO wa_out1-errmsg.           
ELSEIF oper_type 'U'.             
MOVE '用户更新成功' TO wa_out1-errmsg.           
ELSEIF oper_type 'D'.             
MOVE '用户角色删除成功' TO wa_out1-errmsg.           
ENDIF.           
MODIFY gt_out FROM wa_out1 TRANSPORTING light errmsg.         
ENDIF.         
CLEAR: wa_out1.       
ENDLOOP.     
ENDIF.

* 刷新表格     
PERFORM frm_refreshtable.   
ENDLOOP.
ENDFORM.                               " FRM_UPLOADUSER

*&--------------------------------------------------------------------*
*& FORM FRM_CREATEUSER
*&--------------------------------------------------------------------*
* 创建用户 分配角色
*---------------------------------------------------------------------*
FORM frm_createuser.   
DATA: lv_logondata  TYPE bapilogond,         lv_address    
TYPE bapiaddr3,         lv_defaults   
TYPE bapidefaul,         lv_password   
TYPE bapipwd,         lt_parameter  
TYPE STANDARD TABLE OF bapiparam,         lt_profile    
TYPE STANDARD TABLE OF bapiprof,         lt_role       
TYPE STANDARD TABLE OF bapiagr,         lt_return     
TYPE STANDARD TABLE OF bapiret2.   
FIELD-SYMBOLS: <fs_parameter> TYPE bapiparam,                  <fs_profile>   
TYPE bapiprof,                  <fs_role>      
TYPE bapiagr,                  <fs_return>    
TYPE bapiret2.   
DEFINE add_role.     
if &1 is not initial.       
append initial line to lt_role assigning <fs_role>.       <fs_role>
-agr_name = &1.     
endif.   
END-OF-DEFINITION.

*  LV_ADDRESS-BNAME = WA_OUT-BNAME.   lv_address
-title_p = wa_out-title_medi.   lv_address
-lastname = wa_out-name_first"姓   lv_address
-firstname = wa_out-name_last"名   lv_address
-tel1_numbr = wa_out-tel.   lv_address
-e_mail = wa_out-mail.

* DEFAULTS   lv_defaults
-dcpfm 'X'"十进制格式   lv_defaults
-datfm '4'"日期格式   lv_defaults
-timefm '0'."时间格式(12-/24-小时规格)   lv_defaults
-spdb 'G'.  "立即打印

* PASSWORD   lv_password 
'123456'.

* PARAMETER   
LOOP AT lt_zusr05 WHERE bname = wa_out-bname.     
APPEND INITIAL LINE TO lt_parameter ASSIGNING <fs_parameter> .     <fs_parameter>
-parid = lt_zusr05-parid.     <fs_parameter>
-parva = lt_zusr05-parva.   

ENDLOOP.   

DELETE lt_parameter WHERE parid IS INITIAL.
*  APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.
*  <FS_PARAMETER>-PARID = WA_OUT-PARID1.
*  <FS_PARAMETER>-PARVA = WA_OUT-PARVA1.
*  APPEND INITIAL LINE TO LT_PARAMETER ASSIGNING <FS_PARAMETER>.
*  <FS_PARAMETER>-PARID = WA_OUT-PARID2.
*  <FS_PARAMETER>-PARVA = WA_OUT-PARVA2.
*  DELETE LT_PARAMETER WHERE PARID IS INITIAL.   
"删除重复参数   
SORT lt_parameter BY parid.   
DELETE ADJACENT DUPLICATES FROM lt_parameter COMPARING parid.   

CALL FUNCTION 'BAPI_USER_CREATE1'     
EXPORTING       username  
= wa_out-bname       logondata 
= lv_logondata       password  
= lv_password       address   
= lv_address       defaults  
= lv_defaults     
TABLES       
parameter = lt_parameter       
return    = lt_return.   UNASSIGN <fs_return> 
.   
LOOP AT lt_return ASSIGNING <fs_return> WHERE type 'E' OR type 'A'.     
CONCATENATE errmsg <fs_return>-message INTO errmsg SEPARATED BY space.   
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', CREATED.'.
*  ENDIF.   
FREE lt_return.   

IF errmsg IS INITIAL.
*    APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.
*    <FS_PROFILE>-BAPIPROF = WA_OUT-PROFILE1.
*    APPEND INITIAL LINE TO LT_PROFILE ASSIGNING <FS_PROFILE>.
*    <FS_PROFILE>-BAPIPROF = WA_OUT-PROFILE2.
*    DELETE LT_PROFILE WHERE BAPIPROF IS INITIAL.     
"删除重复参数文件
**    SORT lt_profile BY bapiprof.
**    DELETE ADJACENT DUPLICATES FROM lt_profile COMPARING bapiprof.
**    CALL FUNCTION 'BAPI_USER_PROFILES_ASSIGN'
**      EXPORTING
**        username = wa_out-bname
**      TABLES
**        profiles = lt_profile
**        return   = lt_return.
**    UNASSIGN <fs_return> .
**    LOOP AT lt_return ASSIGNING <fs_return> WHERE type = 'E' OR type = 'A'.
**      CONCATENATE errmsg <fs_return>-message INTO errmsg SEPARATED BY space.
**    ENDLOOP.
***  IF <FS_RETURN> IS NOT ASSIGNED.
***    WRITE:/ 'USER:', WA_OUT-BNAME, ', PROFILE CREATED.'.
***  ENDIF.
**    FREE lt_return.


****** 角色     
LOOP AT lt_zagr_users WHERE uname = wa_out-bname .       add_role lt_zagr_users
-agr_name.     
ENDLOOP.     

DELETE lt_role WHERE agr_name IS INITIAL.     
"删除重复角色     
SORT lt_role BY agr_name.     
DELETE ADJACENT DUPLICATES FROM lt_role COMPARING agr_name.     
CALL FUNCTION 'BAPI_USER_ACTGROUPS_ASSIGN'       
EXPORTING         username       
= wa_out-bname       
TABLES         activitygroups 
= lt_role         
return         = lt_return.     UNASSIGN <fs_return>
.     
LOOP AT lt_return ASSIGNING <fs_return> WHERE type 'E' OR type 'A'.       
CONCATENATE errmsg <fs_return>-message INTO errmsg SEPARATED BY space.     
ENDLOOP.
*  IF <FS_RETURN> IS NOT ASSIGNED.
*    WRITE:/ 'USER:', WA_OUT-BNAME, ', ROLE CREATED.'.
*  ENDIF.     
FREE lt_return.     

LOOP AT lt_zusr02 WHERE bname = wa_out-bname.       
MODIFY usr02 FROM lt_zusr02 .     
ENDLOOP.     

LOOP AT lt_zsmen_buffc WHERE uname = wa_out-bname.       
MODIFY smen_buffc FROM lt_zsmen_buffc .     
ENDLOOP.     


CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'       
EXPORTING         
wait 'X'.   
ENDIF.
ENDFORM.                               " FRM_CREATEUSER

*&--------------------------------------------------------------------*
*& FORM FRM_UPDATEUSER

*&--------------------------------------------------------------------*
*& FORM FRM_SHOWMESSAGE
*&--------------------------------------------------------------------*
* 弹出对话框
*---------------------------------------------------------------------*
FORM frm_showmessage USING titel                             textline1                             textline2

.   
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'     
EXPORTING       titel        
= titel       textline1    
= textline1       textline2    
= textline2
*     START_COLUMN = 25
*     START_ROW    =                                                                 6     
.
ENDFORM.                    "FRM_SHOWMESSAGE

*&--------------------------------------------------------------------*
*& FORM FRM_REFRESHTABLE
*&--------------------------------------------------------------------*
* 手动刷新ALV
*---------------------------------------------------------------------*
FORM frm_refreshtable.
* 取得当前ALV的GRID和FIELDCAT   
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'     
IMPORTING       e_grid 
= l_ref_alv.   
CALL METHOD l_ref_alv->refresh_table_display
*       EXPORTING
*       IS_STABLE =
*       I_SOFT_REFRESH =     
EXCEPTIONS       finished 
1       
OTHERS .   
IF sy-subrc <> 0.
*    --异常处理   
ENDIF.
ENDFORM.                    "FRM_REFRESHTABLE

*&--------------------------------------------------------------------*
*& FORM FRM_INITFIELDCAT
*&--------------------------------------------------------------------*
* 设置报表列标题
*---------------------------------------------------------------------*
FORM frm_initfieldcat.   
PERFORM append_fc_alv USING:
*             'LIGHT'       'X'  '转储状态'             20 '' 1 '' '' '' '' '' 'X',
*             'SEL'        ''  ''                       10 '' 2 'X' 'X' '' '' '' 'X',               
'BNAME'      'X' 'SAP用户名'              20 '' '' '' '' '' 'L' 'X',               
'TITLE_MEDI' 'X' '称谓'                   20 '' '' '' '' '' 'L' 'X',               
'NAME_FIRST' 'X' '姓'                     20 '' '' '' '' '' 'L' 'X',               
'NAME_LAST'  'X' '名'                     20 '' '' '' '' '' 'L' 'X',               
'PASS'       'X' '密码'                   20 '' '' '' '' '' 'L' 'X',               
'TEL'        'X' '联系方式'               20 '' '' '' '' '' 'L' 'X',               
'MAIL'       'X' '电子邮箱'               20 '' '' '' '' '' 'L' 'X',               

'ERRMSG'     ''  '执行状态(操作对象:详细错误信息)'               50 '' 120 '' '' '' '' 'L'  ''.
ENDFORM.                    "FRM_INITFIELDCAT

*&--------------------------------------------------------------------*
*& APPEND_FC_ALV
*&--------------------------------------------------------------------*
* 设置ALV格式
*---------------------------------------------------------------------*
FORM append_fc_alv  USING   fieldname     TYPE slis_fieldcat_alv-fieldname                              
key           TYPE slis_fieldcat_alv-key                              reptext_ddic  
TYPE slis_fieldcat_alv-reptext_ddic                              outputlen     
TYPE slis_fieldcat_alv-outputlen                              inttype       
TYPE slis_fieldcat_alv-inttype                              col_pos       
TYPE sy-cucol                              
checkbox      TYPE slis_fieldcat_alv-checkbox                              
edit          TYPE slis_fieldcat_alv-edit                              ref_fieldname 
TYPE slis_fieldcat_alv-ref_fieldname                              ref_tabname   
TYPE slis_fieldcat_alv-ref_tabname                              just          
TYPE c                              fix_column    
TYPE c.   
CLEAR ls_fieldcat.   ls_fieldcat
-fieldname    = fieldname.   ls_fieldcat
-key          key.             "程序中打“X”就是主键   ls_fieldcat
-reptext_ddic = reptext_ddic.   ls_fieldcat
-outputlen    = outputlen.   ls_fieldcat
-inttype      = inttype.   ls_fieldcat
-col_pos      = col_pos.   ls_fieldcat
-checkbox     checkbox.   ls_fieldcat
-edit         edit.   ls_fieldcat
-ref_fieldname = ref_fieldname.   ls_fieldcat
-ref_tabname  = ref_tabname.   ls_fieldcat
-just         = just.   ls_fieldcat
-fix_column   = fix_column.      "固定列
*  LS_FIELDCAT-NO_ZERO      = 'X'.   
APPEND ls_fieldcat TO gt_fieldcat.
ENDFORM.                    "APPEND_FC_ALV

*&--------------------------------------------------------------------*
*& FORM FRM_INITLAYOUT
*&--------------------------------------------------------------------*
* 初始化LAYOUT
*---------------------------------------------------------------------*
FORM frm_initlayout.   gs_layout
-zebra             'X'.   gs_layout
-cell_merge        'X'.   gs_layout
-colwidth_optimize 'X'.         "列数据最优化显示   gs_layout
-no_vline          ' '.         "设置列间隔线   gs_layout
-f2code            '&ETA'.   gs_layout
-detail_popup      'X'.         "是否弹出详细信息窗口   gs_layout
-detail_titlebar   '显示明细'.  "设置弹出窗口的标题栏   gs_layout
-totals_before_items ' '.   gs_layout
-box_fieldname     'SEL'.       "ALV行项目选中的字段   gs_layout
-lights_fieldname  'LIGHT'.   gs_layout
-lights_tabname    'GT_OUT'.   gs_layout
-coltab_fieldname  'FARB'.
ENDFORM.                    "FRM_INITLAYOUT

*&--------------------------------------------------------------------*
*& FORM FRM_DISPLAYGRID
*&--------------------------------------------------------------------*
* 显示ALV表格
*---------------------------------------------------------------------*
FORM frm_displaygrid.   
DATA: l_va LIKE disvariant.   
CONCATENATE '/' sy-uname INTO l_va-variant.   
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'     
EXPORTING       i_callback_program       
= sy-cprog       is_layout                
= gs_layout       it_fieldcat              
= gt_fieldcat       i_callback_pf_status_set 
'SET_PF_STATUS' "触发事件调用子程序       i_callback_user_command  
'USER_COMMAND'  "鼠标事件操作子程序
*     I_CALLBACK_TOP_OF_PAGE   = 'TOP_OF_PAGE' "ALV输出表头设置       is_variant               
= l_va       i_save                   
'A'     
TABLES       t_outtab                 
= gt_out.
ENDFORM.                    "FRM_DISPLAYGRID

*&--------------------------------------------------------------------*
*& FORM FRM_INITDATA
*&--------------------------------------------------------------------*
* 初始化数据
*---------------------------------------------------------------------*
FORM frm_initdata.   functxt
-icon_id   = icon_report_template.   functxt
-quickinfo '下载模板'.   functxt
-icon_text '下载模板'.   sscrfields
-functxt_01 = functxt."定义按钮文本
ENDFORM.                    "FRM_INITDATA

*&--------------------------------------------------------------------*
*& FORM USER_COMMAND
*&--------------------------------------------------------------------*
* 用户自定义按钮
*---------------------------------------------------------------------*
FORM user_command USING i_ucomm TYPE syucomm                         is_selfield 
TYPE slis_selfield.
*  DATA: L_REF_ALV TYPE REF TO CL_GUI_ALV_GRID.
* 取得当前ALV的GRID和FIELDCAT   
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'     
IMPORTING       e_grid 
= l_ref_alv.   
CALL METHOD l_ref_alv->check_changed_data."更新ALV数据
*  IS_SELFIELD-REFRESH = 'X'.   
CASE i_ucomm.     
WHEN 'UPLOAD'.       
PERFORM frm_uploaduser.       is_selfield
-refresh 'X'.
*    WHEN 'SEL_ALL'.
*      LOOP AT GT_OUT INTO WA_OUT.
*        WA_OUT-SEL = 'X'.
*        MODIFY GT_OUT FROM WA_OUT.
*      ENDLOOP.
*    WHEN 'SEL_SAL'.
*      LOOP AT GT_OUT INTO WA_OUT.
*        WA_OUT-SEL = ''.
*        MODIFY GT_OUT FROM WA_OUT.
*      ENDLOOP.
*      WHEN 'PRINT'.
*         取得当前ALV的GRID和FIELDCAT
*        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*          IMPORTING
*            E_GRID = L_REF_ALV.
*        CALL METHOD L_REF_ALV->CHECK_CHANGED_DATA."更新ALV数据     
WHEN OTHERS.   
ENDCASE.
ENDFORM.                    "USER_COMMAND

*&--------------------------------------------------------------------*
*& FORM SET_PF_STATUS
*&--------------------------------------------------------------------*
* GUI状态
*---------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.   
DATA rs_extab TYPE slis_extab.   
CLEAR rt_extab.   
REFRESH rt_extab.
*  RS_EXTAB-FCODE = '&ALL'. APPEND RS_EXTAB TO RT_EXTAB.
*  RS_EXTAB-FCODE = '&SAL'. APPEND RS_EXTAB TO RT_EXTAB.   rs_extab
-fcode '&CRB'APPEND rs_extab TO rt_extab.   rs_extab
-fcode '&CRL'APPEND rs_extab TO rt_extab.   rs_extab
-fcode '&CRR'APPEND rs_extab TO rt_extab.   rs_extab
-fcode '&CRE'APPEND rs_extab TO rt_extab.   

READ TABLE gt_out INTO wa_out WITH KEY light '1'.   
IF sy-subrc 0.     rs_extab
-fcode 'UPLOAD'APPEND rs_extab TO rt_extab.   
ELSE.   
ENDIF.   

SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.   
SET TITLEBAR 'GUI_TITLE'.
ENDFORM.                    "SET_PF_STATUS

*&--------------------------------------------------------------------*
*& FORM FRM_CHECKINPUT
*&--------------------------------------------------------------------*
* 检查按钮选择的是下载模板按钮
*---------------------------------------------------------------------*
FORM frm_checkinput.   
DATA l_ret TYPE abap_bool.   
CASE sscrfields-ucomm.     
WHEN 'FC01'.       
PERFORM frm_downtemplate."下载模版     
WHEN 'ONLI'.       
IF userfile IS INITIAL.         
MESSAGE s010(2bWITH '请先选择模板文件!' DISPLAY LIKE 'E'.         
STOP.       
ENDIF.       
PERFORM frm_getfiletype."获取文件类型       
PERFORM frm_readerfiledata."判断上传文件类型,读取文件内容
*      CLEAR USERFILE."清空控件上的路径     
WHEN OTHERS.   
ENDCASE.
ENDFORM.                   "FRM_CHECKINPUT

*&--------------------------------------------------------------------*
*& FORM FRM_FILEOPEN
*&--------------------------------------------------------------------*
* 打开文件
*---------------------------------------------------------------------*
FORM frm_fileopen USING userfile.   
DATA: l_filetab   TYPE filetable,         l_rc        
TYPE i.   
CLEAR l_filetab.   
REFRESH l_filetab.
* OPEN DIALOG   
CALL METHOD cl_gui_frontend_services=>file_open_dialog     
EXPORTING
*     WINDOW_TITLE         = 'SAP CUSTOM - OPEN FILE'
*     DEFAULT_EXTENSION    =       default_filename     
'*.XLS'
*     FILE_FILTER          = '*.XLS'       initial_directory    
'D:\'       multiselection       
''     
CHANGING       file_table           
= l_filetab       rc                   
= l_rc     
EXCEPTIONS       cntl_error           
1       error_no_gui         
2       not_supported_by_gui 
3       
OTHERS               4.
* GET FILE PATH   
CHECK l_rc EQ 1.   
READ TABLE l_filetab INDEX INTO userfile.
ENDFORM.                    "FRM_FILEOPEN

*&--------------------------------------------------------------------*
*& FORM FRM_GETFILETYPE
*&--------------------------------------------------------------------*
* 获取文本类型
* 从文件名最后一位判断直到首次出现.符号
*---------------------------------------------------------------------*
FORM frm_getfiletype.   
DATA: len TYPE i,          pos 
TYPE i,          char 
TYPE c.   len 
strlen( userfile ).   pos 
= len.   
DO len TIMES.     pos 
= pos 1.     char 
= userfile+pos(1).     
IF char '.'.       len 
= len - pos.       pos 
= pos + 1.       filetype 
= userfile+pos(len).       
TRANSLATE filetype TO UPPER CASE.       filename 
= userfile.       
EXIT.     
ENDIF.   
ENDDO.
ENDFORM.              "FRM_GETFILETYPE

*&--------------------------------------------------------------------*
*& FORM FRM_READERFILEDATA
*&--------------------------------------------------------------------*
* 读取文件内容
*---------------------------------------------------------------------*
FORM frm_readerfiledata.   
DATA :  icx_obl_parameter_error TYPE REF TO cx_root,           error_text 
TYPE c LENGTH 100.   

"判断上传文件类型,读取文件内容   
IF filetype 'XLS' OR filetype 'XLSX'.     
"当为EXCEL类型时调用此参数,所抓取的文件数据在内表中为每个单元格为一行     
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'       
EXPORTING         filename                
= filename         i_begin_col             
1         i_begin_row             
2         i_end_col               
1         i_end_row               
4000       
TABLES         intern                  
= gt_alsmex       
EXCEPTIONS         inconsistent_parameters 
1         upload_ole              
2         
OTHERS                  3.

* 从EXCEL抓取数据整理到内表     
IF gt_alsmex IS NOT INITIAL.       
LOOP AT gt_alsmex INTO wa_alsmex.         
ON CHANGE OF wa_alsmex-row.           
IF wa_alsmex-row <> 1.             
APPEND wa_file TO gt_file.             
CLEAR wa_file.           
ENDIF.         
ENDON.         
CONDENSE wa_alsmex-value NO-GAPS.         
TRY.             
CASE wa_alsmex-col.               
WHEN '0001'. wa_file-bname = wa_alsmex-value.
*              WHEN '0002'. WA_FILE-AGR_NAME = WA_ALSMEX-VALUE.             

ENDCASE.           
CATCH cx_sy_conversion_error INTO icx_obl_parameter_error.             error_text 
= icx_obl_parameter_error->get_longtext).             
CONCATENATE '第' wa_alsmex-row  '行' wa_alsmex-col '列' error_text             
INTO error_text.             
MESSAGE i000(0kWITH '参数类型出现错误,请检查。错误发生位置:' error_text.             
STOP.         
ENDTRY.         
CLEAR: wa_alsmex.       
ENDLOOP.       
APPEND wa_file TO gt_file.       
CLEAR wa_file.     
ENDIF.   
ELSE.     
MESSAGE s010(2bWITH '文件类型只能是XLS和XLSX格式!' DISPLAY LIKE 'E'.     
STOP.   
ENDIF.
ENDFORM.                   "FRM_READERFILEDATA

*&--------------------------------------------------------------------*
*& FORM FRM_DOWNTEMPLATE
*&--------------------------------------------------------------------*
* 下载模板
*---------------------------------------------------------------------*
FORM frm_downtemplate.   
CALL METHOD cl_gui_frontend_services=>file_save_dialog     
EXPORTING       window_title      
'下载模板文件到本地'       default_extension 
'XLS'                           "缺省文件类型       default_file_name 
'用户角色维护模板'       file_filter       
'文本文件(*.TXT)|*.TXT|EXCEL 文件 (*.XLS)|*.XLS;*.XLSX|所有文件 (*.*)|*.*|'       with_encoding     
'X'       initial_directory 
'D:\'     
CHANGING       filename          
= filename1                       "用户输入文件名       path              
= path                            "获得用户所选路径       fullpath          
= fullpath                        "全路径       user_action       
= user_action       file_encoding     
encoding.   

IF sy-subrc <> OR user_action <> cl_gui_frontend_services=>action_ok.     
EXIT.   
ENDIF.   

IF fullpath IS NOT INITIAL.     
DATA: lv_objdata     TYPE  wwwdatatab,           lv_obj_name    
TYPE  wwwdatatab-objid,           lv_destination 
TYPE  rlgrap-filename,           lv_objid       
TYPE  sy-repid,           lv_subrc       
TYPE  sy-subrc.     
DATA: l_ret          TYPE abap_bool,           lv_answer
.     
DATA: lv_file        TYPE string.     c_path 

= fullpath.     
MOVE c_path TO lv_file.     

CALL METHOD cl_gui_frontend_services=>file_exist       
EXPORTING         file                 
= lv_file       RECEIVING         result               

= l_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.       
EXIT.     
ENDIF.     

IF l_ret EQ c_yes.
* 模版已存在,是否覆盖       
CALL FUNCTION 'POPUP_TO_CONFIRM'         
EXPORTING           text_question  
'模版已存在,是否覆盖?'           text_button_1  
'是'(002)           text_button_2  
'否'(003)         
IMPORTING           answer         
= lv_answer         
EXCEPTIONS           text_not_found 
1           
OTHERS         2.       
IF sy-subrc <> 0.       
ENDIF.       

IF lv_answer EQ 'A'"取消         
EXIT.       
ELSEIF lv_answer NE '1'"否         p_filepath 
= c_path.       
ENDIF.     
ELSE.       lv_answer 
'1'.     
ENDIF.     

CREATE OBJECT g_excel 'EXCEL.APPLICATION'.     
GET PROPERTY OF g_excel 'WORKBOOKS' = g_workbook .     
CALL METHOD OF         g_workbook         

'CLOSE'.     

IF lv_answer EQ '1'.       
MOVE g_filen TO lv_obj_name.       
SELECT relid objid         
FROM wwwdata         
INTO  CORRESPONDING FIELDS OF lv_objdata         
UP TO ROWS         
WHERE srtf2 AND relid 'MI'           
AND objid = lv_obj_name.       
ENDSELECT.       

CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'         
EXPORTING           
key         = lv_objdata           destination 
= c_path         
IMPORTING           rc          
= lv_subrc.       
IF lv_subrc 0.         p_filepath    
= c_path.       
ENDIF.     
ENDIF.     

CALL METHOD OF         g_workbook         

'OPEN'       

EXPORTING         #1         
= c_path.     

CALL METHOD OF         g_excel         

'WORKSHEETS' = g_sheet       
EXPORTING         #1           
1.     

CALL METHOD OF         g_sheet         

'ACTIVATE'.     

CALL METHOD OF         g_workbook         

'CLOSE'.

*  SET PROPERTY OF G_EXCEL 'VISIBLE' = 1.     

FREE OBJECT g_sheet.     
FREE OBJECT g_applica.     
FREE OBJECT g_workbook.     
FREE OBJECT g_excel.   
ELSE.     
MESSAGE i005(zmessWITH '文件路径不存在.' DISPLAY LIKE 'E'.   
ENDIF.
ENDFORM.                    "FRM_DOWNTEMPLATE

*&---------------------------------------------------------------------*
*& FORM  ADD_ZERO
*&---------------------------------------------------------------------*
*  添加前导0
*----------------------------------------------------------------------*
FORM add_zero CHANGING p_in.   
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'     
EXPORTING       
input  = p_in     
IMPORTING       
output = p_in.
ENDFORM.                    "ADD_ZERO

*&---------------------------------------------------------------------*
*& FORM  DEL_ZERO
*&---------------------------------------------------------------------*
*  去掉前导0
*----------------------------------------------------------------------*
FORM del_zero CHANGING p_out.   
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'     
EXPORTING       
input  = p_out     
IMPORTING       
output = p_out.
ENDFORM.                    "DEL_ZERO

*&---------------------------------------------------------------------*
*& FORM FRM_SETBGCOLOR
*&---------------------------------------------------------------------*
* 必填项加底色 黄色
*----------------------------------------------------------------------*
FORM frm_setbgcolor USING fields.   
CLEAR farb1.   farb1
-fieldname fields.   farb1
-color-col 3.   
APPEND farb1 TO wa_out-farb.
ENDFORM.                   "FRM_SETBGCOLOR

 

posted on 2017-12-08 15:44  imagenation  阅读(502)  评论(0编辑  收藏  举报