这几天做了个WEBADI的任务,要求在模板里实现组织屏蔽。也就是有个业务实体列让用户选,但只能选当前职责能操作的业务实体。
最初用这样的方法来实现LOV 提取可操作OU:
select name
from hr_operating_units hou
where mo_global.check_access(hou.organization_id) ='Y'
但发现不行,原因可能是mo_global需要进行初始化。
最后用了下面的笨方法:
思路是: 检查当前职责,当前用户的配置文件,取MO业务实体,MO默认业务实体,MO安全性配置文件的信息,然后计算可操作的OU.
1. 写个函数取当前模板的职责用户所用的安全性配置文件,默认只取用户层及职责层的,如果用户层有,则不取职责层.
FUNCTION get_sec_profile_id(pi_user_id IN NUMBER, pi_resp_id IN NUMBER)
RETURN NUMBER IS
v_profile_id NUMBER;
BEGIN
BEGIN
SELECT to_number(pov.profile_option_value)
INTO v_profile_id
FROM fnd_profile_options po
,fnd_profile_option_values pov
WHERE po.profile_option_name = 'XLA_MO_SECURITY_PROFILE_LEVEL'
AND po.profile_option_id = pov.profile_option_id
AND pov.level_id = 10004 --用户层
AND pov.level_value = pi_user_id;
EXCEPTION
WHEN no_data_found THEN
BEGIN
SELECT to_number(pov.profile_option_value)
INTO v_profile_id
FROM fnd_profile_options po
,fnd_profile_option_values pov
WHERE po.profile_option_name = 'XLA_MO_SECURITY_PROFILE_LEVEL'
AND po.profile_option_id = pov.profile_option_id
AND pov.level_id = 10003 --职责层
AND pov.level_value = pi_resp_id;
EXCEPTION
WHEN no_data_found THEN
v_profile_id := NULL;
END;
END;
RETURN v_profile_id;
END;
2. 然后业务实体的LOV用如下SQL来构造:
SELECT hou.name
, hou.organization_id
FROM hr_operating_units hou
WHERE hou.organization_id = $profiles$.org_id
OR hou.organization_id = $profiles$.default_org_id
OR EXISTS (SELECT 1
FROM per_security_profiles sp
WHERE sp.security_profile_id =
cux_common_utilities_pkg.get_sec_profile_id($env$.userid,
fnd_profile.value('RESP_ID'))
AND sp.view_all_organizations_flag = 'Y')
OR EXISTS (SELECT 1
FROM per_security_organizations so
WHERE so.security_profile_id =
cux_common_utilities_pkg.get_sec_profile_id($env$.userid,
fnd_profile.value('RESP_ID'))
AND so.organization_id = hou.organization_id)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10359218/viewspace-750859/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10359218/viewspace-750859/