ABAP 用户权限查询报表
*&---------------------------------------------------------------------* *& REPORT ZUSER *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zuser LINE-SIZE 400. *&--------------------------------------------------------------------* *& TABLE WORK AREAS * *&--------------------------------------------------------------------* TABLES:agr_users,agr_tcodes,tstct,usr02,agr_agrs2,usr21. *&---------------------------------------------------------------------* * GLOBAL INTERNAL TABLES ALV 使用 *&---------------------------------------------------------------------* DATA: gs_layout TYPE lvc_s_layo, gt_events TYPE slis_t_event, gs_events LIKE LINE OF gt_events. DATA: g_grid TYPE REF TO cl_gui_alv_grid. DATA:gt_fieldcat TYPE TABLE OF lvc_s_fcat, gs_fieldcat TYPE lvc_s_fcat. DATA: is_variant LIKE disvariant. *&---------------------------------------------------------------------* * GLOBAL MACROS ALV 使用 *&---------------------------------------------------------------------* DEFINE fill_field. "宏定义 CLEAR gs_fieldcat. gs_fieldcat-fieldname = &1."ALV 控制: 内部表字段的字段名称 gs_fieldcat-scrtext_l = &2."长字段标签 gs_fieldcat-cfieldname = &3."ALV 控制: 参考的当前单位的字段名称 gs_fieldcat-outputlen = &4."ALV 控制: 列的字符宽度 gs_fieldcat-edit = &5."ALV 控制: 准备输入(可编辑字段) gs_fieldcat-emphasize = &6."ALV 控制: 带有颜色的高亮列 gs_fieldcat-decimals_o = &7."ALV 控制: 输出小数位的编号 gs_fieldcat-ref_table = &8. "参考表 gs_fieldcat-ref_field = &9."参考字段 * GS_FIELDCAT-CHECKBOX = &9. * GS_FIELDCAT-NO_ZERO = 'X'."ALV 控制: 为输出隐藏零 gs_fieldcat-just = 'X'. * GS_FIELDCAT-COLDDICTXT = 'L'. * GS_FIELDCAT-ICON = 'X'. "图标功能 APPEND gs_fieldcat TO gt_fieldcat. END-OF-DEFINITION. DATA:BEGIN OF gs00 , bname LIKE usr02-bname, ustyp LIKE usr02-ustyp, END OF gs00. DATA:BEGIN OF gs10 , uname LIKE agr_users-uname, "R/3 系统, 用户登录名 agr_name LIKE agr_users-agr_name, "角色名称 text LIKE agr_texts-text, " 用于层次菜单的文件结构-客户 parent_agr LIKE agr_users-agr_name, "根角色名称 tcode LIKE agr_tcodes-tcode, "扩展的程序名 END OF gs10. DATA:BEGIN OF gs11, uname LIKE agr_users-uname, "R/3 系统, 用户登录名 name_first LIKE adrp-name_first, "名 name_last LIKE adrp-name_last, "姓 department LIKE adcp-department, "部门 roomnumber LIKE adcp-roomnumber, "房间或公寓号 END OF gs11. DATA:BEGIN OF gs12, uname LIKE agr_users-uname, "R/3 系统, 用户登录名 name_first LIKE adrp-name_first, "名 name_last LIKE adrp-name_last, "姓 department LIKE adcp-department, "部门 roomnumber LIKE adcp-roomnumber, "房间或公寓号 agr_name LIKE agr_users-agr_name, "角色名称 text LIKE agr_texts-text, " 角色描述 parent_agr LIKE agr_users-agr_name, "根角色名称 texta LIKE agr_texts-text, " 角色描述 tcode LIKE agr_tcodes-tcode, "扩展的程序名 ttext LIKE tstct-ttext, "事务说明 ustyp LIKE user02-ustyp, ustyptxt TYPE char100, END OF gs12. DATA:t00 LIKE TABLE OF gs00, t10 LIKE TABLE OF gs10, t11 LIKE TABLE OF gs11, t12 LIKE TABLE OF gs12. *DATA:BEGIN OF T13 OCCURS 0, * UNAME LIKE AGR_USERS-UNAME, "R/3 系统, 用户登录名 * AGR_NAME LIKE AGR_USERS-AGR_NAME, "角色名称 * END OF T13. DATA:BEGIN OF t14 OCCURS 0, agr_name LIKE agr_agrs2-agr_name, "角色名称 child_agr LIKE agr_agrs2-child_agr, END OF t14. SELECTION-SCREEN BEGIN OF BLOCK cond WITH FRAME TITLE TEXT-002. SELECT-OPTIONS: g_uname FOR usr02-bname. SELECT-OPTIONS: agr_name FOR agr_tcodes-agr_name. SELECT-OPTIONS: g_tcode FOR tstct-tcode. PARAMETERS: P_CK AS CHECKBOX. SELECTION-SCREEN END OF BLOCK cond. *&--------------------------------------------------------------------* * EVENT OCCURS AFTER THE SELECTION SCREEN HAS BEEN PROCESSED *&--------------------------------------------------------------------* START-OF-SELECTION. PERFORM frm_select_data. *ALV PERFORM frm_display_data . END-OF-SELECTION. *&---------------------------------------------------------------------* *& FORM FRM_DISPLAY_DATA *&---------------------------------------------------------------------* * ALV 展示 *----------------------------------------------------------------------* * --> P1 TEXT * <-- P2 TEXT *----------------------------------------------------------------------* FORM frm_display_data . IF P_CK is INITIAL. PERFORM frm_fill_field. ELSE. PERFORM frm_fill_field2. * DELETE t12 where TTEXT is not INITIAL or TCODE is not INITIAL. LOOP AT t12 ASSIGNING FIELD-SYMBOL(<ls_t12>). <ls_t12>-TCODE = ''. <ls_t12>-TTEXT = ''. ENDLOOP. sort t12 by UNAME . delete adjacent duplicates from t12 comparing ALL FIELDS. ENDIF. PERFORM frm_layout. PERFORM frm_alv_display. ENDFORM. "FRM_DISPLAY_DATA *&---------------------------------------------------------------------* *& FORM FRM_LAYOUT *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * --> P1 TEXT * <-- P2 TEXT *----------------------------------------------------------------------* FORM frm_layout . CLEAR: gs_layout."它用来定义ALV报表的整体属性 gs_layout-zebra = 'X' ."ZBBRA * GS_LAYOUT-DETAILINIT = 'X' . "INITIAL VALUES ON DETAIL SCREEN gs_layout-cwidth_opt = 'X'."优化列宽选项是否设置 * GS_LAYOUT-DETAILTITL = 'DETAIL INFORMATION' ."设置弹出窗口的标题栏 " GS_LAYOUT-BOX_FNAME = 'SEL'. * GS_LAYOUT-INFO_FNAME = 'ROWCOLOR'. * GS_LAYOUT-GRID_TITLE = 'ALV GRID TITLE TEST'. * GS_LAYOUT-STYLEFNAME = 'STYLE'."单元格可编辑 ENDFORM. "FRM_LAYOUT *&---------------------------------------------------------------------* *& FORM FRM_FILL_FIELD *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * --> P1 TEXT * <-- P2 TEXT *----------------------------------------------------------------------* FORM frm_fill_field . REFRESH gt_fieldcat. fill_field: 'UNAME' '用户主记录中的用户名称' '' '' '' '' '' 'AGR_USERS' 'UNAME', 'NAME_FIRST' '姓 ' '' '' '' '' '' 'ADRP' 'NAME_FIRST', 'NAME_LAST' '名 ' '' '' '' '' '' 'ADRP' 'NAME_LAST', 'DEPARTMENT' '部门' '' '' '' '' '' 'ADCP' 'DEPARTMENT', 'ROOMNUMBER' '房间或公寓号' '' '' '' '' '' 'ADCP' 'ROOMNUMBER', 'AGR_NAME' '本地角色名称' '' '' '' '' '' 'AGR_USERS' 'AGR_NAME', 'TEXT' '本地角色描述' '' '' '' '' '' 'AGR_TEXTS' 'TEXT', 'PARENT_AGR' '根角色' '' '' '' '' '' 'AGR_USERS' 'AGR_NAME', 'TEXTA' '根角色描述' '' '' '' '' '' 'AGR_TEXTS' 'TEXT', 'TCODE' '扩展的程序名' '' '' '' '' '' 'AGR_TCODES' 'TCODE', 'TTEXT' '事务说明' '' '' '' '' '' 'TSTCT' 'TTEXT' , 'USTYP' '用户类型' '' '' '' '' '' 'USER02' 'USTYP', 'USTYPTXT' '用户类型文本' '' '' '' '' '' '' ''. ENDFORM. "FRM_FILL_FIELD FORM frm_fill_field2 . REFRESH gt_fieldcat. fill_field: 'UNAME' '用户主记录中的用户名称' '' '' '' '' '' 'AGR_USERS' 'UNAME', 'NAME_FIRST' '姓 ' '' '' '' '' '' 'ADRP' 'NAME_FIRST', 'NAME_LAST' '名 ' '' '' '' '' '' 'ADRP' 'NAME_LAST', 'DEPARTMENT' '部门' '' '' '' '' '' 'ADCP' 'DEPARTMENT', 'ROOMNUMBER' '房间或公寓号' '' '' '' '' '' 'ADCP' 'ROOMNUMBER', 'AGR_NAME' '本地角色名称' '' '' '' '' '' 'AGR_USERS' 'AGR_NAME', 'TEXT' '本地角色描述' '' '' '' '' '' 'AGR_TEXTS' 'TEXT', 'PARENT_AGR' '根角色' '' '' '' '' '' 'AGR_USERS' 'AGR_NAME', * 'TEXTA' '根角色描述' '' '' '' '' '' 'AGR_TEXTS' 'TEXT', * 'TCODE' '扩展的程序名' '' '' '' '' '' 'AGR_TCODES' 'TCODE', 'TTEXT' '事务说明' '' '' '' '' '' 'TSTCT' 'TTEXT' , 'USTYP' '用户类型' '' '' '' '' '' 'USER02' 'USTYP', 'USTYPTXT' '用户类型文本' '' '' '' '' '' '' ''. ENDFORM. *&---------------------------------------------------------------------* *& FORM FRM_ALV_DISPLAY *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * --> P1 IT_INBOM *----------------------------------------------------------------------* FORM frm_alv_display. DATA: i_grid_settings TYPE lvc_s_glay. * IS_VARIANT-REPORT = 'ZMMU0025'. * IS_VARIANT-HANDLE = '1'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid "SY-REPID 当前程序名 IS_LAYOUT_LVC = GS_LAYOUT it_fieldcat_lvc = gt_fieldcat i_save = 'A' * IT_EVENTS = GT_EVENTS TABLES t_outtab = t12 EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. "FRM_ALV_DISPLAY * * LOOP AT T00. * REFRESH: T10,T11,T13,T14. * SELECT * FROM AGR_USERS INTO CORRESPONDING FIELDS OF TABLE T10 * WHERE UNAME = T00-BNAME AND AGR_NAME IN AGR_NAME. **IF SY-SUBRC <> 0. **PERFORM MESSAGE USING 'E' '你所输入的用户不存在或还未分配权限' '' **'' **'' **. **ENDIF. * * * LOOP AT T10. * SELECT * FROM AGR_TCODES APPENDING CORRESPONDING FIELDS OF TABLE * T11 * WHERE AGR_NAME = T10-AGR_NAME * AND TCODE IN G_TCODE. * ENDLOOP. * * LOOP AT T11. * READ TABLE T10 INTO T10 WITH KEY AGR_NAME = T11-AGR_NAME. * IF SY-SUBRC = 0. * T11-UNAME = T10-UNAME. * ENDIF. * * SELECT SINGLE TTEXT FROM TSTCT INTO T11-TTEXT * WHERE TCODE = T11-TCODE AND SPRSL = '1'. * SELECT SINGLE TEXT FROM AGR_TEXTS INTO T11-TEXT * WHERE AGR_NAME = T11-AGR_NAME. * SELECT SINGLE PERSNUMBER FROM USR21 INTO USR21-PERSNUMBER * WHERE BNAME = T00-BNAME. * SELECT SINGLE DEPARTMENT FROM ADCP INTO T11-DEPARTMENT * WHERE PERSNUMBER = USR21-PERSNUMBER. * SELECT SINGLE ROOMNUMBER FROM ADCP INTO T11-ROOMNUMBER * WHERE PERSNUMBER = USR21-PERSNUMBER. * SELECT SINGLE NAME_FIRST FROM ADRP INTO T11-NAME_FIRST * WHERE PERSNUMBER = USR21-PERSNUMBER. * SELECT SINGLE NAME_LAST FROM ADRP INTO T11-NAME_LAST * WHERE PERSNUMBER = USR21-PERSNUMBER. * MODIFY T11. * ENDLOOP. * * LOOP AT T11. * MOVE-CORRESPONDING T11 TO T13. * APPEND T13. * ENDLOOP. * SORT T13 BY UNAME. * DELETE ADJACENT DUPLICATES FROM T13. * SORT T11 BY UNAME AGR_NAME . * DATA:TEMP. * * LOOP AT T11. * CLEAR T14. * CLEAR T13. * TEMP = 0. * * SELECT * FROM AGR_AGRS2 INTO CORRESPONDING FIELDS OF TABLE T14 * WHERE CHILD_AGR = T11-AGR_NAME. * IF SY-SUBRC = 0. * SELECT * FROM AGR_USERS INTO CORRESPONDING FIELDS OF TABLE T13 * WHERE UNAME = T11-UNAME. * * LOOP AT T14. * READ TABLE T13 INTO T13 WITH KEY AGR_NAME = T14-AGR_NAME. * IF SY-SUBRC = 0 . * TEMP = 1. * ENDIF. * ENDLOOP. * IF TEMP = 0. * MOVE-CORRESPONDING T11 TO T12. * ENDIF. * ELSE. * MOVE-CORRESPONDING T11 TO T12. * ENDIF. * SELECT SINGLE USTYP INTO T12-USTYP FROM USR02 WHERE BNAME = T12-UNAME. * CASE T12-USTYP. * WHEN 'A'. * T12-USTYPTXT = '对话'. * WHEN 'B'. * T12-USTYPTXT = '系统用户(内部RFC和后台处理)'. * WHEN 'C'. * T12-USTYPTXT = '通讯用户'. * WHEN 'L'. * T12-USTYPTXT = '参考用户'. * WHEN 'S'. * T12-USTYPTXT = '服务用户'. * WHEN OTHERS. * ENDCASE. * APPEND T12. * ENDLOOP. * SORT T12 BY UNAME AGR_NAME TCODE. *NEW-LINE. *LOOP AT T12. *WRITE:T12-UNAME,T12-NAME_LAST,T12-NAME_FIRST,T12-DEPARTMENT, *T12-ROOMNUMBER,T12-AGR_NAME, *T12-TEXT,T12-TCODE,T12-TTEXT. *NEW-LINE. *ENDLOOP. * ENDLOOP. * * CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' * EXPORTING * IT_FIELDCAT = L_ALV_FIELDCAT * I_STRUCTURE_NAME = 'ZBASIS_USER' ** IT_SORT = SORTCAT * I_CALLBACK_PROGRAM = 'ZALV_MAT' ** I_CALLBACK_USER_COMMAND = 'USER_COMMAND' * TABLES * T_OUTTAB = T12. *&--------------------------------------------------------------------* *& FORM MESSAGE *&--------------------------------------------------------------------* * TEXT *---------------------------------------------------------------------* * -->VALUE(MESSATEXTYPE) * -->VALUE(MESSATEXTONTENT1) * -->VALUE(MESSATEXTONTENT2) * -->VALUE(MESSATEXTONTENT3) * -->VALUE(MESSATEXTONTENT4) *---------------------------------------------------------------------* *FORM MESSAGE USING VALUE(MESSAGE_TYPE) * VALUE(MESSAGE_CONTENT1) * VALUE(MESSAGE_CONTENT2) * VALUE(MESSAGE_CONTENT3) * VALUE(MESSAGE_CONTENT4). * MESSAGE ID '000' TYPE MESSAGE_TYPE NUMBER '000' * WITH MESSAGE_CONTENT1 * MESSAGE_CONTENT2 * MESSAGE_CONTENT3 * MESSAGE_CONTENT4. *ENDFORM. " MESSAGE *&---------------------------------------------------------------------* *& FORM FRM_SELECT_DATA *&---------------------------------------------------------------------* *& 数据处理 *&---------------------------------------------------------------------* *& --> P1 TEXT *& <-- P2 TEXT *&---------------------------------------------------------------------* FORM frm_select_data . *查询账号 SELECT bname ustyp INTO CORRESPONDING FIELDS OF TABLE t00 FROM usr02 WHERE bname IN g_uname. SORT t00 BY bname. *查询角色和对应的事物代码 SELECT u~uname u~agr_name te~text d~parent_agr t~tcode INTO CORRESPONDING FIELDS OF TABLE t10 FROM agr_users AS u INNER JOIN agr_define AS d ON u~agr_name = d~agr_name INNER JOIN agr_texts AS te ON d~AGR_NAME = te~agr_name AND te~spras = sy-langu LEFT JOIN agr_tcodes AS t ON d~parent_agr = t~agr_name FOR ALL ENTRIES IN t00 WHERE u~uname = t00-bname AND u~agr_name IN agr_name AND u~from_dat <= sy-datum AND u~to_dat >= sy-datum. DELETE t10 WHERE tcode NOT IN g_tcode. *查询角色属性 SELECT * INTO CORRESPONDING FIELDS OF TABLE t14 FROM agr_agrs2 FOR ALL ENTRIES IN t10 WHERE child_agr = t10-agr_name. *用户基本信息 SELECT u~bname AS uname r~name_first r~name_last c~department c~roomnumber INTO CORRESPONDING FIELDS OF TABLE t11 FROM usr21 AS u INNER JOIN adrp AS r ON u~persnumber = r~persnumber INNER JOIN adcp AS c ON c~persnumber = u~persnumber AND c~addrnumber = u~addrnumber FOR ALL ENTRIES IN t00 WHERE r~date_from <= sy-datum AND c~date_from <= sy-datum AND u~bname = t00-bname. LOOP AT t10 INTO gs10. READ TABLE t14 WITH KEY agr_name = gs10-agr_name. IF sy-subrc NE 0. MOVE-CORRESPONDING gs10 TO gs12. READ TABLE t11 INTO gs11 WITH KEY uname = gs10-uname. IF sy-subrc EQ 0. MOVE-CORRESPONDING gs11 TO gs12. ENDIF. READ TABLE t00 INTO gs00 WITH KEY bname = gs10-uname. IF sy-subrc EQ 0. gs12-ustyp = gs00-ustyp. CASE gs00-ustyp. WHEN 'A'. gs12-ustyptxt = '对话'. WHEN 'B'. gs12-ustyptxt = '系统用户(内部RFC和后台处理)'. WHEN 'C'. gs12-ustyptxt = '通讯用户'. WHEN 'L'. gs12-ustyptxt = '参考用户'. WHEN 'S'. gs12-ustyptxt = '服务用户'. WHEN OTHERS. ENDCASE. ENDIF. SELECT SINGLE ttext FROM tstct INTO gs12-ttext WHERE tcode = gs10-tcode AND sprsl = '1'. SELECT SINGLE text FROM agr_texts INTO gs12-texta WHERE agr_name = gs10-parent_agr. APPEND gs12 TO t12. ENDIF. ENDLOOP. * DATA:BEGIN OF T12 OCCURS 0, * LIKE AGR_USERS-UNAME, "R/3 系统, 用户登录名 * LIKE ADRP-NAME_FIRST, "名 * LIKE ADRP-NAME_LAST, "姓 * LIKE ADCP-DEPARTMENT, "部门 * LIKE ADCP-ROOMNUMBER, "房间或公寓号 * AGR_NAME LIKE AGR_USERS-AGR_NAME, "角色名称 * TCODE LIKE AGR_TCODES-TCODE, "扩展的程序名 * TTEXT LIKE TSTCT-TTEXT, "事务说明 * TEXT LIKE AGR_TEXTS-TEXT, " 用于层次菜单的文件结构-客户 * USTYP LIKE USER02-USTYP, * USTYPTXT TYPE CHAR100, * END OF T12. ENDFORM.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示