FORM中MOAC屏蔽策略

开发步骤:

1. 设计表结构来支持MOAC

2. 为多OU的基表同义词添加VPD的MOAC策略

3. 在PRE-FORM中初始化MOAC环境信息,并初始化OU的值

4. 在OU显示数据块的WHEN-CREATE-RECORD触发器中初始化OU的值

5. 创建OPERATING_UNITS的LOV来显示能够访问的OU列表

6. 关联OU名称字段到OPERATING_UNITS LOV

7. 添加OU处理的几个参数

 

 

具体步骤:

1. 

运行下面的SQL来检查我们客户化应用是否具有多组织访问的能力

如果返回0,说明不具有

 

[sql] view plaincopy
 
  1. SELECT COUNT(1)  
  2.   FROM fnd_mo_product_init t  
  3.  WHERE t.application_short_name = 'CUX'  
  4.    AND t.status = 'Y';  


如果不具备,运行下面的代码来使客户化的应用具有多组织访问的能力

 

 

[sql] view plaincopy
 
  1. BEGIN  
  2.   fnd_mo_product_init_pkg.register_application(p_appl_short_name => 'CUX',  
  3.                                                p_owner           => 'SYSADMIN',  
  4.                                                p_status          => 'Y');  
  5.   COMMIT;  
  6. END;  


2.

 

支持MOAC的表结构设计

创建基表_ALL,(带org_id),同义词(不带all),基表对应的视图(与hr_operating_units关联获取org_name)

 

使用oracle提供的dbms_rls来为我们的同义词(去掉_all的那个同义词)添加MOAC组织访问控制的VPD策略

 

[sql] view plaincopy
 
  1. BEGIN  
  2.   dbms_rls.add_policy(object_schema   => 'APPS',  
  3.                       object_name     => 'CUX_FOREX_TRANSFER_BILLS_ALL', --同义词,这里也是带_ALL  
  4.                       policy_name     => 'ORG_SEC',  
  5.                       function_schema => 'APPS',  
  6.                       policy_function => 'MO_GLOBAL.ORG_SECURITY',  
  7.                       policy_type     => dbms_rls.shared_context_sensitive);  
  8. END;  

成功之后。可以查询到:

 

[sql] view plaincopy
 
  1. SELECT *  
  2.   FROM dba_policies dp  
  3.  WHERE dp.object_name = 'CUX_FOREX_TRANSFER_BILLS_ALL'  

 

 

3. 

 

PRE_FORM中初始化OU

 

[sql] view plaincopy
 
  1. procedure pre_form  
  2.    is  
  3.                 l_default_org_id number;  
  4.                 l_default_ou_name varchar2(240);  
  5.                 l_ou_count number;  
  6.    begin  
  7.            MO_GLOBAL.init('CUX');  
  8.                 mo_utils.get_default_ou(l_default_org_id, l_default_ou_name, l_ou_count);  
  9.         
  10.                 copy(l_default_org_id,'PARAMETER.mo_default_org_id');      
  11.                 copy(l_default_ou_name,'PARAMETER.mo_default_ou_name');  
  12.                 copy(l_ou_count,'PARAMETER.mo_ou_count');      
  13.                   
  14.                 --判断是否找到了OU,如果没有找到,则报错  
  15.                 if nvl(l_ou_count,0) <=0 then  
  16.                       fnd_message.debug('错误001:没有找到相应的OU,请联系系统管理员或开发人员!');  
  17.                   raise form_trigger_failure;  
  18.                 end if;                        
  19.    end pre_form;  


4.

 

在OU显示数据块的WHEN-CREATE-RECORD触发器中初始化OU的值

 

[sql] view plaincopy
 
  1. PROCEDURE WHEN_CREATE_RECORD  
  2. IS  
  3. BEGIN  
  4.   -- ou  
  5.   :MAIN.ORG_NAME := cux_agm_public_pkg.get_org_name(:PARAMETER.MO_DEFAULT_ORG_ID);  
  6.   :MAIN.ORG_ID   := :PARAMETER.MO_DEFAULT_ORG_ID;   
  7.      
  8.  END WHEN_CREATE_RECORD;  


5. 

 

创建OPERATING_UNITS的LOV来显示能够访问的OU列表

 

[sql] view plaincopy
 
  1. SELECT   
  2.        HR.NAME OPERATING_UNIT,   
  3.        HR.ORGANIZATION_ID ORG_ID,  
  4.        PO_MOAC_UTILS_PVT.get_ou_shortcode(ORGANIZATION_ID) OU_SHORT_CODE  
  5. FROM   HR_OPERATING_UNITS HR   
  6. WHERE PO_MOAC_UTILS_PVT.CHECK_ACCESS (HR.ORGANIZATION_ID) = 'Y'  
  7. ORDER BY OPERATING_UNIT  

 

 

 

6. 关联OU名称字段到OPERATING_UNITS LOV

7. 添加OU处理的几个参数

posted @ 2014-10-29 13:58  leebin  阅读(143)  评论(0)    收藏  举报