在日常维护中常常需要用户的组织结构层面的权限列表,在SAP里我们就需要到角色里去查看,比较不方便,因此做下面的一个用户组织结构权限的列表程序,代码如下(供大家参考使用)
*&---------------------------------------------------------------------*
*& Report ZORG_LEVELS_AU *
*& *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
REPORT ZORG_LEVELS_AU MESSAGE-ID dev.
TYPE-POOLS: slis.
TABLES: usr02.
DATA: BEGIN OF gt_1252 OCCURS 100,
agr_name LIKE agr_1251-agr_name.
INCLUDE STRUCTURE pt1252.
DATA: END OF gt_1252 .
DATA db_1252 LIKE gt_1252 OCCURS 100 WITH HEADER LINE.
DATA: BEGIN OF gt_au_fld OCCURS 100.
INCLUDE STRUCTURE pt1251.
DATA: END OF gt_au_fld.
*Organization Level Authorization Field Text
DATA: BEGIN OF orgebenen OCCURS 30.
INCLUDE STRUCTURE usorg_db.
DATA: END OF orgebenen,
*Organization Level Authorization Field Text
BEGIN OF orgtext OCCURS 30.
INCLUDE STRUCTURE usorg_db.
DATA: END OF orgtext.
DATA: g_var LIKE orgebenen-varbl,
g_ret LIKE sy-subrc,
g_old_field LIKE pt1251-field.
DATA: BEGIN OF gt_result OCCURS 100,
agr_name LIKE agr_1251-agr_name.
INCLUDE STRUCTURE tprorg1.
DATA: END OF gt_result.
DATA: gt_field TYPE slis_t_fieldcat_alv.
*Define Selection Screen
PARAMETERS p_user LIKE usr02-bname OBLIGATORY.
PARAMETERS p_date LIKE sy-datum OBLIGATORY DEFAULT sy-datum .
RANGES r_group FOR agr_define-agr_name.
END-OF-SELECTION.
REFRESH: db_1252, r_group .
r_group-sign = 'I'.
r_group-option = 'EQ'.
* Get User's roles
SELECT agr_name INTO (r_group-low) FROM agr_users WHERE uname = p_user AND to_dat > p_date.
APPEND r_group.
ENDSELECT.
*Get value of roles' Organizational levels
SELECT * FROM agr_1252 INTO CORRESPONDING FIELDS OF TABLE db_1252
WHERE agr_name IN r_group
ORDER BY counter.
IF sy-subrc NE 0.
MESSAGE i036. "没有符合条件的数据,则提示信息退出
EXIT.
ENDIF.
DELETE db_1252 WHERE varbl = space.
*CALL FUNCTION 'PRGN_1252_READ_ORG_LEVELS'
* EXPORTING
* ACTIVITY_GROUP = S_STAT-OBJID
* TABLES
* ORG_LEVELS = DB_STORG
* EXCEPTIONS
* NO_DATA_AVAILABLE = 1
* OTHERS = 2.
SORT db_1252.
*Auth. Object in User Master Maintenance
SELECT * FROM agr_1251 INTO CORRESPONDING FIELDS OF TABLE gt_au_fld
WHERE agr_name IN r_group
ORDER BY field.
PERFORM init_orgs.
LOOP AT gt_au_fld.
IF gt_au_fld-field NE g_old_field.
g_old_field = gt_au_fld-field.
PERFORM is_org USING g_old_field g_var g_ret.
IF g_ret EQ 0.
READ TABLE db_1252 WITH KEY varbl = g_var.
IF sy-subrc = 0.
LOOP AT db_1252 WHERE varbl = g_var.
APPEND db_1252 TO gt_1252.
ENDLOOP.
IF sy-subrc NE 0.
CLEAR gt_1252.
gt_1252-varbl = g_var.
APPEND gt_1252.
ENDIF.
ELSE.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
SORT gt_1252.
LOOP AT gt_1252.
MOVE-CORRESPONDING gt_1252 TO gt_result.
PERFORM read_org_text USING gt_1252-varbl gt_result-text.
READ TABLE orgebenen WITH KEY varbl = gt_1252-varbl.
IF sy-subrc = 0.
gt_result-fieldname = orgebenen-field.
ENDIF.
APPEND gt_result.
ENDLOOP.
DESCRIBE TABLE gt_result LINES sy-subrc.
IF sy-subrc = 0.
MESSAGE i036. "没有符合条件的数据,则提示信息退出
EXIT.
ELSE.
PERFORM sub_create_field_cat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_field[]
TABLES
t_outtab = gt_result
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDIF.
*&---------------------------------------------------------------------*
*& Form sub_create_field_cat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM sub_create_field_cat.
REFRESH gt_field.
PERFORM sub_field_des USING :
'' '' 'AGR_NAME' '' 'X' '' '' 'Role Name' '20' '' '' gt_field[],
'' '' 'VARBL' '' 'X' '' '' 'Org. Level' '10' '' '' gt_field[],
'' '' 'TEXT' '' '' '' '' 'Org. Des.' '40' '' '' gt_field[],
'' '' 'LOW' '' '' '' '' 'Low Value' '40' '' '' gt_field[],
'' '' 'HIGH' '' '' '' '' 'High Vlaue' '40' '' '' gt_field[].
ENDFORM. " SUB_CREATE_FIELD_CAT
*----------------------------------------------------------------------*
* Form : SUB_FIELD_DES
*----------------------------------------------------------------------*
* Description: Set the fields which will be displayed
*----------------------------------------------------------------------*
*参数说明 *
*---------------------------------------------------------------------*
* im_ref_FIELD---must upper case *
* im_ref_TABLE---internal table name *
* im_FIELDname---must upper case *
* im_TABname ---internal table name *
* im_KEY ---column with key-color AND frozen *
* im_CHECKBOX ---the column is checkbox *
* im_dosum ---total,if total, the field must be sumed *
* im_SELTEX_L ---column Long description of title *
* im_outputlen---column output length
* re_field : 字段格式定义内表
*----------------------------------------------------------------------*
* Modification Log: *
* Date Programmer Correction Number *
*2006-08-10 dev01 增加控制零值是否显示控制参数
*2006-08-12 dev01 增加控制是否显示控制参数
*----------------------------------------------------------------------*
FORM sub_field_des USING im_ref_field TYPE c
im_ref_table TYPE c
im_fieldname TYPE c
im_tabname TYPE c
im_key TYPE c
im_checkbox TYPE c
im_dosum TYPE c
im_seltex_l TYPE c
im_outputlen TYPE i
im_zero TYPE c
im_out TYPE c
re_field TYPE slis_t_fieldcat_alv.
DATA: wa_fieldcat TYPE slis_fieldcat_alv.
CLEAR wa_fieldcat.
wa_fieldcat-ref_fieldname = im_ref_field.
wa_fieldcat-ref_tabname = im_ref_table.
wa_fieldcat-fieldname = im_fieldname.
wa_fieldcat-tabname = im_tabname.
wa_fieldcat-key = im_key.
wa_fieldcat-checkbox = im_checkbox.
wa_fieldcat-do_sum = im_dosum.
wa_fieldcat-no_zero = im_zero.
wa_fieldcat-no_out = im_out.
wa_fieldcat-seltext_l = im_seltex_l.
wa_fieldcat-seltext_m = im_seltex_l.
wa_fieldcat-seltext_s = im_seltex_l.
wa_fieldcat-outputlen = im_outputlen.
* wa_fieldcat-col_pos = IM_colpos.
APPEND wa_fieldcat TO re_field.
ENDFORM. "SUB_FIELD_DES
*&---------------------------------------------------------------------*
*& Form INIT_ORGS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM init_orgs.
STATICS: org_init.
IF org_init = space.
org_init = 'X'.
SELECT * FROM usorg_db INTO TABLE orgebenen.
SORT orgebenen.
orgtext[] = orgebenen[].
SORT orgtext BY langu varbl.
ENDIF.
ENDFORM. " INIT_org
*&---------------------------------------------------------------------*
*& Form IS_ORG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FIELD text
* -->VAR text
* -->RET text
*----------------------------------------------------------------------*
FORM is_org USING field var ret.
READ TABLE orgebenen WITH KEY field = field BINARY SEARCH.
IF sy-subrc = 0.
ret = 0.
var = orgebenen-varbl.
ELSE.
ret = 4.
CLEAR var.
ENDIF.
ENDFORM. "IS_ORG
* Text zu einer Variablen (Orgebene) liefern
FORM read_org_text USING name LIKE usvart-varbl
text.
READ TABLE orgtext WITH KEY langu = sy-langu varbl = name
BINARY SEARCH.
IF sy-subrc = 0.
text = orgtext-vtext.
ELSE.
READ TABLE orgtext WITH KEY langu = 'D' varbl = name
BINARY SEARCH.
IF sy-subrc = 0.
text = orgtext-vtext.
ELSE.
text = name.
ENDIF.
ENDIF.
ENDFORM. "read_org_text