需求描述:人员“张三”的人事调动如表所示:
人事范围为A的负责人查看张三的薪资信息时,只能看到张三2010年和2012年的相关记录,不能查看2011年的薪资信息。
PA20、PA30权限控制
首先查看基本工资表PA0008,人员号80000054有3条数据;
执行PA20,查看基本工资
只能显示一条相关数据,有两条数据被过滤掉。
解决方法:
1)启用BADI HRPAD00AUTH_CHECK,并将里面涉及到的所有方法及类的声明等根据标准类CL_HRPAD00AUTH_CHECK_STD(通过SE80查看)重新复写。
找到方法CHECK_AUTHORIZATION,在复制完源代码基础上,添加代码
export zpernr from pernr to MEMORY id 'zpernr'.
2)找到方法CONSIDER_SY_DATUM,在代码的59行会调用方法consider_sy_datum_exit,重写此方法的代码。
METHOD if_ex_hrpad00auth_time~consider_sy_datum_exit.
DATA: BEGIN OF lw_date,
begda TYPE pa0001-begda,
endda TYPE pa0001-endda,
END OF lw_date,
BEGIN OF lw_werks,
pernr TYPE pa0001-pernr,
werks TYPE pa0001-werks,
begda TYPE pa0001-begda,
endda TYPE pa0001-endda,
END OF lw_werks.
DATA: l_pernr TYPE rp50g-pernr,
l_per TYPE rp50g-pernr,
l_infty TYPE t582a-infty.
DATA: lt_werks LIKE TABLE OF lw_werks,
lt_pernr LIKE TABLE OF lw_werks,
lw_pernr LIKE lw_werks,
lw_period TYPE hrperiods.
IF sy-tcode(1) = 'Z'. "客制化报表不执行此逻辑
EXIT.
ENDIF.
*-----------------取得需要控制日期的信息类型----------------------*
IF infty = '0008' OR infty = '0014' OR infty = '0015'
OR infty = '0267' OR infty = '2010'.
IMPORT zpernr TO l_pernr FROM MEMORY ID 'zpernr'.
IF sy-subrc <> 0.
EXIT.
ENDIF.
exit_flag = 'X'.
"取得当前用户的人员编号
SELECT SINGLE pernr
FROM pa0105
INTO l_per
WHERE usrid = sy-uname.
"根据人员编号取得其对应的人事范围
SELECT pernr
werks
begda
endda
FROM pa0001
INTO TABLE lt_werks
WHERE pernr = l_per
AND begda <= sy-datum
AND endda >= sy-datum.
IF sy-subrc = 0.
DELETE authorization_periods_tab WHERE begda IS NOT INITIAL.
ENDIF.
SELECT pernr
werks
FROM pa0001
INTO CORRESPONDING FIELDS OF TABLE lt_pernr
WHERE pernr = l_pernr.
"检查人员号的人事范围
LOOP AT lt_pernr INTO lw_pernr.
READ TABLE lt_werks INTO lw_werks WITH KEY werks = lw_pernr-werks.
IF sy-subrc = 0.
lw_period-begda = lw_werks-begda.
lw_period-endda = lw_werks-endda.
APPEND lw_period TO authorization_periods_tab.
ENDIF.
ENDLOOP.
ELSE.
exit_flag = ' '.
ENDIF.
ENDMETHOD.
3)逻辑:
T-CODE以Z开头的会话不执行此段程序;
信息类型为8、14、15、267、2010时执行此段程序;
取得当前用户对应的人事范围及期间(PA0015、PA0001);
取得被查询人的所有人事范围及期间;
逐条检查,当被查询人的人事范围与当前用户的人事范围不同时,此条信息剔除;当被查询人的人事范围与当前用户的人事范围相同但是日期期间没有交集时,此条信息剔除。
PC_PAYRESULT及自开发报表权限控制
1)PC_PAYRESULT的显示效果:
当执行PC_PAYRESULT时,可以看到人员的所有条目,当双击某一条条目查看明细信息时,进行权限校验,逻辑同PA20。
2) 自开发报表zhrnr_002的显示效果
80000054实际有3条数据,通过控制后只显示1条数据。
解决方法:
找到函数PYXX_READ_PAYROLL_RESULT,在函数的最后创建增强点。
ENHANCEMENT 1 ZPA001. "active version
data: BEGIN OF lw_werks,
pernr TYPE pa0001-pernr,
werks TYPE pa0001-werks,
begda TYPE pa0001-begda,
endda TYPE pa0001-endda,
END OF lw_werks.
data: l_per TYPE rp50g-pernr.
data: lt_werks LIKE TABLE OF lw_werks,
lt_pernr LIKE TABLE OF lw_werks,
lw_pernr LIKE lw_werks.
FIELD-SYMBOLS: <versc> TYPE pc202.
IF sy-tcode <> 'PC_PAYRESULT' AND sy-tcode(1) <> 'Z'.
EXIT.
ENDIF.
"取得当前用户的人员编号
SELECT SINGLE pernr
FROM pa0105
INTO l_per
WHERE usrid = sy-uname.
"根据人员编号取得其对应的人事范围
SELECT pernr
werks
begda
endda
FROM pa0001
INTO TABLE lt_werks
WHERE pernr = l_per
AND begda <= sy-datum
AND endda >= sy-datum.
"当前人员对应的人事范围及期间
SELECT pernr
werks
begda
endda
FROM pa0001
INTO TABLE lt_pernr
WHERE pernr = employeenumber.
ASSIGN COMPONENT 'INTER-VERSC'
OF STRUCTURE payroll_result TO <versc>.
"检查人员号的人事范围
LOOP AT lt_pernr INTO lw_pernr where begda <= <versc>-FPBEG
and endda >= <versc>-FPEND.
"当前条目所属的人事范围
READ TABLE lt_werks INTO lw_werks WITH KEY werks = lw_pernr-werks.
IF sy-subrc <> 0.
IF sy-tcode(1) = 'Z'.
MESSAGE '不同的人事范围,没有查看权限' TYPE 'I' RAISING no_record_found.
else.
MESSAGE '不同的人事范围,没有查看权限' TYPE 'E'.
ENDIF.
ENDIF.
"校验当前查看条目是否在允许的人事范围期间内
IF <versc>-FPEND < lw_werks-begda or <versc>-FPBEG > lw_werks-endda.
IF sy-tcode(1) = 'Z'.
MESSAGE '不在可查询的人事范围期间内' TYPE 'I' RAISING no_record_found.
ELSE.
MESSAGE '不在可查询的人事范围期间内' TYPE 'E'.
ENDIF.
ENDIF.
ENDLOOP.
ENDENHANCEMENT.
*$*$-End: (1)---------------------------------------------------------------------------------$*$*
ENDFUNCTION.
PS:喜欢的同学可以关注微信公众号