Form多OU的实现
<1>创建一个Table,以CUX_OM_ORDER_HEADER_ALL为例
<2>创建Table的两个Synonym(一个不含_ALL,一个以_ALL结尾):CUX_OM_ORDER_HEADER和CUX_OM_ORDER_HEADER_ALL
<3>给不含_ALL的Synonym:CUX_OM_ORDER_HEADER加上组织策略函数
dbms_rls.add_policy(object_name => 'CUX_OM_ORDER_HEADER',
policy_name => 'ORG_SEC',
policy_function => 'MO_GLOBAL.ORG_SECURITY',
policy_type =>dbms_rls.shared_context_sensitive);
<4>在不含_ALL的Synonym的基础上创建视图:CUX_OM_ORDER_HEADER_V
<5>进入FORM时(pre-form触发器)添加代码;
mo_global.init(p_appl_shortname);--p_appl_shortname为应用简称
<6>被选择某个OU时(一般在when_validate_item触发器)中添加代码:
mo_global.set_policy_context('S',p_org_id>;--p_org_id为OU
实例如下:
PACKAGE BODY CUX_MOAC_PKG IS
--MOAC初始化
procedure pre_form
is
l_default_org_id number;
l_default_ou_name varchar2(240);
l_ou_count number;
begin
MO_GLOBAL.init('CUX');
mo_utils.get_default_ou(l_default_org_id, l_default_ou_name, l_ou_count);
IF l_default_org_id IS NOT NULL THEN
copy(l_default_org_id,'PARAMETER.mo_default_org_id');
copy(l_default_ou_name,'PARAMETER.mo_default_ou_name');
copy(l_ou_count,'PARAMETER.mo_ou_count');
END IF;
--判断是否找到了OU,如果没有找到,则报错
if nvl(l_ou_count,0) <=0 then
fnd_message.debug('错误001:没有找到相应的OU,请联系系统管理员或开发人员!');
raise form_trigger_failure;
end if;
end pre_form;
/*-----------------------------------------------------------------
功能:当进入块时,根据MOAC控制的OU数量决定OU字段是否可以录入
-----------------------------------------------------------------*/
procedure when_new_block_instance
is
l_block_item_id item;
l_block_item_name varchar2(1000);
begin
l_block_item_name:=Name_In('System.Trigger_Block')||'.operating_unit';
l_block_item_id :=find_item(l_block_item_name);
--fnd_message.debug('when_new_block_instance');
if not id_null(l_block_item_id) then
if :parameter.mo_ou_count>1 then
set_item_property(l_block_item_id,update_allowed,property_true);
set_item_property(l_block_item_id,insert_allowed,property_true);
else
set_item_property(l_block_item_id,update_allowed,property_false);
set_item_property(l_block_item_id,insert_allowed,property_false);
end if;
end if;
end when_new_block_instance;
/*-----------------------------------------------------------------
功能:当创建记录时,从参数中将默认OU拿过来
-----------------------------------------------------------------*/
procedure when_create_record
is
l_org_id_name varchar2(1000);
l_block_item_name varchar2(1000);
begin
l_org_id_name :=Name_In('System.Trigger_Block')||'.org_id';
l_block_item_name:=Name_In('System.Trigger_Block')||'.operating_unit';
-- fnd_message.debug('when_create_record');
IF :parameter.mo_default_org_id is not null and name_in(l_org_id_name) is null THEN
copy(:parameter.mo_default_org_id,Name_In('System.Trigger_Block')||'.org_id');
copy(:parameter.mo_default_ou_name,Name_In('System.Trigger_Block')||'.operating_unit');
set_item_property(l_block_item_name,item_is_valid,property_true);
END IF;
end when_create_record;
/*-----------------------------------------------------------------
功能:POST-QUERY
-----------------------------------------------------------------*/
procedure post_query
is
l_org_id varchar2(1000);
l_org_name varchar2(1000);
l_block_name varchar2(1000);
begin
l_block_name :=Name_In('System.Trigger_Block');
copy(Name_In('System.Trigger_Block')||'.org_id',l_org_id);
if l_org_id is not null then
select hou.name
into l_org_name
from hr_operating_units hou
where hou.organization_id=l_org_id;
copy(l_org_name,Name_In('System.Trigger_Block')||'.operating_unit');
end if;
Set_Record_Property(:system.trigger_record, l_block_name, STATUS, QUERY_STATUS);
exception when others then
null;
end post_query;
END;
在form级别的pre_form中加入如下代码
fnd_standard.form_info('$Revision: 120.1 $',
'Template Form',
'FND',
'$Date: 2012/06/09 11:02 $',
'$Author: appldev $');
app_standard.event('PRE-FORM');
:parameter.tolerance_enabled := nvl(fnd_profile.value('CUX_PO_A_TOLERANCE_ENABLED'),'N');
cux_moac_pkg.pre_form;
fnd_org.choose_org;
app_window.set_window_position('QUERY_FIND', 'FIRST_WINDOW');