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.
复制代码

 

posted @   ABAP-武汉  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示