ABAP-获取用户的组织结构权限

本文介绍了一段用于SAP系统的ABAP程序代码,该程序能够生成用户组织结构权限列表,便于管理员进行权限管理和审核。程序通过从SAP数据库中读取用户角色信息,并根据这些角色获取组织层级权限。

在日常维护中常常需要用户的组织结构层面的权限列表,在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

<think>我们正在处理一个关于ABAP中检查薪酬信息权限的问题。根据引用内容,SAPHCM中对薪酬信息的权限控制涉及多个方面,包括结构化权限权限对象以及主数据一致性等。用户询问的是具体的实现方法。参考引用[1]和[4],我们知道标准事务码PC_PAYRESULT(查看工资核算结果)会进行权限检查,包括对基本工资信息类型(0008)的权限,检查逻辑是先检查系统当前日期,如果没有权限则检查工资核算结果的最新结束日期。而逻辑数据库PNP和函数PYXX_READ_PAYROLL_RESULT则没有这个检查。引用[2]提供了解决权限问题的思路:首先检查结构化权限(使用函数RH_CUT_INFTY),然后检查角色权限(PFCG)特别是权限对象P_ABAP,最后检查主数据一致性(HRP1001与PA0001的差异)。引用[3]和[4]提供了技术细节:结构化权限的检查可以通过函数AUTHORITY_CHECK(引用[4]提到)或者RH_CUT_INFTY(引用[2])进行。引用[5]提到了一个增强点(BADIHRPAD00AUTH_CHECK)可以用来自定义权限检查。因此,实现检查薪酬信息权限的方法可能包括:1.使用权限对象直接检查:SAPHCM中常用的权限对象包括P_ABAP(一般权限)和特定信息类型的权限对象(如P_ORGINCON)。对于薪酬信息,可能涉及特定的权限对象。2.使用函数检查结构化权限:例如函数`RH_CUT_INFTY`,可以检查用户对特定信息类型的结构化权限。3.模拟标准事务的权限检查:由于标准事务PC_PAYRESULT有权限检查逻辑,我们可以参考其实现。通过调试(引用[4]的方法)可以找到标准权限检查函数。4.使用BADI增强:通过实现BADIHRPAD00AUTH_CHECK,可以自定义权限检查逻辑。具体实现步骤:-**方法1:使用权限对象检查**使用`AUTHORITY-CHECK`语句检查特定的权限对象。例如,检查对信息类型0008(基本工资)的权限:```abapAUTHORITY-CHECKOBJECT'P_ORGINCON'ID'INFTY'FIELD'0008'ID'AUTHC'FIELD'DISPLAY'"显示权限ID'PERSA'FIELD..."人事范围...```但具体需要检查哪些字段,取决于权限对象的定义。需要查看权限对象P_ORGINCON的字段。-**方法2:使用函数检查结构化权限**使用函数`RH_CUT_INFTY`检查结构化权限。示例代码:```abapDATA:lv_subrcTYPEsy-subrc.CALLFUNCTION'RH_CUT_INFTY'EXPORTINGauthy='DISPLAY'"权限:显示infty='0008'"信息类型otype='P'"对象类型:人员objid=lv_pernr"人员编号plvar='01'"计划版本subty=..."子类型(如果需要)IMPORTINGsubrc=lv_subrc.IFlv_subrc<>0."没有权限ENDIF.```注意:这个函数可能不是直接用于薪酬信息,但结构化权限是通用的。-**方法3:模拟标准事务的权限检查**通过调试标准事务PC_PAYRESULT,找到权限检查的函数。引用[4]提到标准权限校验函数,并提到在调试时可以通过修改用户名(uname)来模拟其他用户权限。我们可能需要调用类似`HR_PAYROLL_AUTHORITY`的函数(具体函数名需要确认)。实际上,在标准程序中,检查工资结果的权限可能使用函数`HR_PAYROLL_AUTHORITY`或类似函数。我们可以查找标准程序来确认。-**方法4:使用BADI自定义检查**实现BADIHRPAD00AUTH_CHECK,在方法CHECK_AUTHORIZATION中添加自定义逻辑。例如,在增强中我们可以设置内存变量,然后在其他地方检查(如引用[5]所示)。增强步骤:1.使用SE18创建BADI实现,基于HRPAD00AUTH_CHECK。2.在方法CHECK_AUTHORIZATION中编写代码。注意,标准逻辑已经存在,我们需要在复制标准代码的基础上添加自定义逻辑。由于薪酬信息权限检查的复杂性,通常需要结合多种方法。建议先尝试使用权限对象检查(方法1)和结构化权限检查(方法2)。如果这些方法不能覆盖,再考虑方法3和方法4。下面提供一个综合的示例函数,用于检查用户对特定人员薪酬信息的显示权限:```abapFUNCTIONz_check_payroll_auth.*"----------------------------------------------------------------------*"*"本地接口:*"IMPORTING*"VALUE(IV_PERNR)TYPEPERNR_D*"VALUE(IV_INFTY)TYPEINFTY*"EXPORTING*"VALUE(EV_AUTH)TYPEABAP_BOOL*"----------------------------------------------------------------------DATA:lv_subrcTYPEsy-subrc,lv_plvarTYPEplvar,lv_otypeTYPEotypeVALUE'P',lv_objidTYPEobjid,lv_auth_objTYPEtobname."初始化ev_auth=abap_false."获取计划版本(通常为01)lv_plvar='01'.lv_objid=iv_pernr."方法1:检查权限对象P_ORGINCON(假设用于信息类型权限)"注意:权限对象字段可能还需要其他值(如人事范围、员工组等),这里简化处理AUTHORITY-CHECKOBJECT'P_ORGINCON'ID'INFTY'FIELDiv_inftyID'AUTHC'FIELD'DISPLAY'.IFsy-subrc<>0."没有通过权限对象检查,尝试结构化权限"方法2:使用RH_CUT_INFTY检查结构化权限CALLFUNCTION'RH_CUT_INFTY'EXPORTINGauthy='DISPLAY'infty=iv_inftyotype=lv_otypeobjid=lv_objidplvar=lv_plvarIMPORTINGsubrc=lv_subrc.IFlv_subrc<>0.RETURN."没有权限ENDIF.ENDIF."如果还需要检查其他权限(如工资核算结果),可以调用其他函数"例如,检查工资核算结果的权限,可能需要调用标准函数(如HR_PAYROLL_AUTHORITY)"这里不展开,因为标准函数可能较为复杂。ev_auth=abap_true.ENDFUNCTION.```注意:上述函数只是一个示例,实际应用中可能需要根据具体需求调整权限对象和字段。**相关问题**1.在ABAP中如何调试SAP标准权限检查函数?2.如何确定特定信息类型对应的权限对象?3.在SAPHCM中,主数据不一致如何导致权限问题?4.如何通过BADIHRPAD00AUTH_CHECK增强权限控制逻辑?</think>### ABAP 检查薪酬信息权限的实现方法 在ABAP中检查用户对薪酬信息的访问权限,需结合结构化权限权限对象校验和主数据一致性验证。以下是具体实现方法: #### 1. **结构化权限检查** 使用函数 `RH_CUT_INFTY` 验证用户对特定信息类型的结构化权限: ```abap DATA: lv_subrc TYPE sy-subrc. CALL FUNCTION 'RH_CUT_INFTY' EXPORTING authy = 'DISPLAY' " 操作类型(显示/修改) infty = '0008' " 信息类型(如基本工资0008) otype = 'P' " 对象类型(P=人员) objid = lv_pernr " 人员编号 plvar = '01' " 计划版本 subty = 'B008' " 关系子类型(参考T77AW) IMPORTING subrc = lv_subrc. IF lv_subrc = 1. MESSAGE '无结构化权限' TYPE 'E'. ENDIF. ``` [^2][^3] #### 2. **权限对象校验** 检查关键权限对象 `P_ABAP` 和薪酬相关对象: ```abap " 基础权限检查 AUTHORITY-CHECK OBJECT 'P_ABAP' ID 'ACTVT' FIELD '03'. " 03=显示 IF sy-subrc <> 0. MESSAGE '缺少P_ABAP权限' TYPE 'E'. ENDIF. " 薪酬信息专用检查 AUTHORITY-CHECK OBJECT 'P_ORGINCON' " 工资信息权限对象 ID 'INFTY' FIELD '0008' " 信息类型 ID 'AUTHC' FIELD 'DISPLAY'. " 操作权限 ``` [^2][^4] #### 3. **主数据一致性验证** 检查组织分配数据一致性(避免HRP1001与PA0001差异): ```abap SELECT SINGLE * FROM hrp1001 WHERE plvar = '01' AND otype = 'P' AND objid = @lv_pernr AND istat = '1'. IF sy-subrc <> 0 OR hrp1001-sclas <> 'C'. MESSAGE '主数据不一致导致权限失败' TYPE 'E'. ENDIF. ``` [^2] #### 4. **模拟用户权限测试** 调试时模拟其他用户权限(需替换 `uname`): ```abap DATA(lv_uname) = 'TESTUSER'. " 目标用户名 CALL FUNCTION 'AUTHORITY_CHECK' EXPORTING uname = lv_uname object = 'P_ORGINCON' EXCEPTIONS no_access = 1. ``` [^4] #### 5. **通过BADI增强控制** 实现增强点 `HRPAD00AUTH_CHECK` 自定义逻辑: ```abap METHOD if_ex_hrpad00auth_check~check_authorization. " 从内存获取人员ID IMPORT zpernr FROM MEMORY ID 'zpernr'. " 自定义权限校验逻辑 IF zpernr = lv_restricted_pernr. RAISE no_auth. ENDIF. ENDMETHOD. ``` [^5] > **关键注意事项**: > 1. 薪酬权限需同时满足结构化权限 + 权限对象校验[^1][^2] > 2. 标准事务码(如`PC_PAYRESULT`)会自动执行权限检查[^1] > 3. 直接访问底层函数(如`PYXX_READ_PAYROLL_RESULT`)可能绕过权限控制[^1] > 4. 权限错误时优先检查:结构化权限 → P_ABAP权限 → 主数据一致性[^2] ### 相关问题 1. 如何调试SAP HCM结构化权限错误? 2. 权限对象 `P_ORGINCON` 包含哪些关键控制字段? 3. 主数据不一致导致权限失败时应如何修复? 4. BADI `HRPAD00AUTH_CHECK` 在薪酬权限中的典型应用场景? 5. 直接使用逻辑数据库PNP会绕过哪些权限检查? [^1]: SAP标准查看工资核算结果Tcode PC_PAYRESULT校验了人员基本工资0008信息类型的权限。 [^2]: HCM权限解决思路:结构化权限→PFCG角色权限→主数据一致性。 [^3]: 结构化权限检查需使用对象关系SUBTY(如B008)。 [^4]: 通过替换uname参数模拟用户权限测试场景。 [^5]: 通过BADI HRPAD00AUTH_CHECK可注入自定义权限逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值