You are browsing the archive for 开发.

使用Form个性化修改标准Form的LOV

九月 23, 2008 in Oracle EBS二次开发

在之前的文章 使用Custom.pll修改标准Form的LOV 中描述了如何使用Custom.pll修改LOV,现在介绍另外一种不需要修改fmb文件修改Form LOV的方法,使用Form的个性化工具。

本文结合一个简单的Form做描述,这是没有个性化之前的LOV,LOV取自表FND_USER,没有做任何条件限制。

Old_LOV

 

首先打开Form的个性化工具,点击菜单帮助–诊断–自定义代码–个性化:

Form_Personalization

 

一、选择触发器事件以及触发器对象

 

在打开的个性化窗口中

如下图,其中触发器选择WHEN-NEW-ITEM-INSTANCE,触发器对象选择HEADER.HEADER_ITEM(对应LOV的Item),保存:

Form_Personalization_Condition

 

二、确定触发器动作

    1.创建LOV的Record Group

       切换活动标签页,首先创建Record Group,为了简单起见,写死了一个查询条件,只出来两条记录:

 Form_Personalization_Action1

      

    2.修改LOV的Group Name属性

       在值对应那一栏填上之前创建的Record Group的名字:

Form_Personalization_Action2

 

最后保存退出,重新打开Form,就能看到效果了

New_LOV

 

三、总结

 

Form个性化和Custom.pll都是可以用来个性化Form的方法。当使用Form个性化修改LOV,用来创建的Record Group如果含有Form中的某个Item作为条件时(比如供应商地点的LOV中要以供应商作为条件),这时候如果把带有参数的查询条件作为Record Group的变元就会有问题。
因为个性化中创建Record Group的时候认为变元是一个字符串,我们加入了类似:PO_HEADERS.VENDOR_ID的字样它是不识别的。所以当遇到这样的情况,可以使用Custom.pll,通过name_in(‘PO_HEADERS.VENDOR_ID’)来组合查询条件,然后在每次WHEN-NEW-ITEM-INSTANCE的时候,去动态的设置LOV来达到我们所期望的效果。

总账数据访问安全性控制(5)

九月 23, 2008 in Oracle EBS功能和流程

 

本文介绍在客户化开发的程序中需要考虑总账数据访问安全性的控制

 

一、Form界面开发

如果Form界面中需要引用账户组合,同时希望账户组合受到数据安全性控制,需要增加如下的工作:

  1. 添加GLCORE.pll库文件到Form中
  2. 在账户组合字段的WHEN-VALIDATE-ITEM触发器中添加如下的代码来验证权限

gl_flexfield. validate(ledger_id NUMBER, flexmode VARCHAR2, flexvalue VARCHAR2, alevel VARCHAR2, full_validation BOOLEAN, edate DATE)

 

这个过程验证如果失败后,过程中会抛出这个消息:GLCORE_NO_ACCESS

ledger_id:分类账ID
flexmode:账户组合模式,指弹性域包括:所有段组合,账户段,平衡段和管理段
                  对应可以提供的值:gl_flexfield.ALL_SEGMENTS, gl_flexfield.ACCOUNT, gl_flexfield.BALANCING, gl_flexfield.MANAGEMENT
flexvalue
:账户的段值,根据账户组合模式不同提供不同的值
alevel:数据访问权限级别:完全、写、只读和无权限。
             对应的值:gl_access_set.FULL_ACCESS, gl_access_set.WRITE_ACCESS, gl_access_set.READ_ONLY_ACCESS, gl_access_set.NO_ACCESS
full_validation
:段值是否需要验证
edate:验证段值的日期,此值为null时跳过值的验证

下面是一个实际的代码例子:

gl_flexfield.validate(:HEADER.ledger_id,
         gl_flexfield.ALL_SEGMENTS, :LINES.accounting_flexfield,
         gl_access_set.WRITE_ACCESS, TRUE, :HEADER.default_effective_date);

 

二、SQL编写

 

如果希望编写的SQL执行结果受到数据安全性的控制,需要特别添加限制。

 

1)凭证相关

如果在程序中希望SQL取出的凭证数据受到数据安全性的控制,那需要连接数据库表

GL_JE_SEGMENT_VALUES来过滤数据,主要的字段:

je_header_id:凭证头ID
segment_type_code:段值类型,有B代表平衡段;M代表管理段
segment_value:段值

 

表关系图:

 gl_access_set_je_erd

 

同时检查数据安全性设置表GL_ACCESS_SET_ASSIGNMENTS中的设置:
access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
ledger_id
segment_value
access_privilege_code

 

下面是一个使用的例子:

SELECT *
  FROM gl_je_batches_headers_v
WHERE chart_of_accounts_id = 101
   AND period_set_name = ‘Accounting’
   AND accounted_period_type = ‘Month’
   AND (gl_je_batches_headers_v.ledger_id IN
       (SELECT acc.ledger_id
           FROM gl_access_set_ledgers acc
          WHERE acc.access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)) AND EXISTS
        (SELECT ‘readable line’
           FROM gl_je_segment_values sv, gl_access_set_assignments acc
          WHERE sv.je_header_id = gl_je_batches_headers_v.je_header_id
            AND sv.segment_type_code = ‘B’
            AND acc.access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
            AND acc.ledger_id = gl_je_batches_headers_v.ledger_id
            AND acc.segment_value = sv.segment_value))
   AND (je_batch_id = header_je_batch_id_qry + 0)
   AND (header_name = ’06-NOV-02 Project Mfg To Consolidation USD’)
ORDER BY batch_name, period_name

 

2)分类帐相关

如果在程序中希望SQL取出的分类账数据受到数据安全性的控制,那需要连接数据库表
XLA_AE_SEGMENT_VALUES

ae_header_id:分类账头ID
segment_type_code:段值类型,有B代表平衡段;M代表管理段
segment_value:段值

 

表关系图:

 gl_access_set_xla_erd

 

同时检查数据安全性设置表GL_ACCESS_SET_ASSIGNMENTS中的设置:
access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
ledger_id
segment_value
access_privilege_code

 

一个使用的例子:

SELECT *
  FROM xla_ae_headers xah
WHERE (ledger_id IN
       (SELECT acc.ledger_id
           FROM gl_access_set_ledgers acc
          WHERE acc.access_set_id = fnd_profile.VALUE(‘GL_ACCESS_SET_ID’)) AND
       EXISTS
        (SELECT ‘readable line’
           FROM xla_ae_segment_values sv, gl_access_set_assignments acc
          WHERE sv.ae_header_id = xah.ae_header_id
            AND sv.segment_type_code = ‘B’
            AND acc.access_set_id = fnd_profile.VALUE(‘GL_ACCESS_SET_ID’)
            AND acc.ledger_id = xah.ledger_id
            AND acc.segment_value = sv.segment_value))

 

三、PL/SQL编写

 

如果在客户化编写的PL/SQL程序中需要考虑总账数据安全性控制,使用数据库包GL_FORMSINFO中所提供的过程与方法,下面是它的声明:

SQL> descr GL_FORMSINFO;
Element                   Type     
————————- ———
FULL_ACCESS               CONSTANT 
WRITE_ACCESS              CONSTANT 
READ_ACCESS               CONSTANT 
NO_ACCESS                 CONSTANT 
GET_COA_INFO              PROCEDURE
GET_ACCESS_INFO           PROCEDURE
CHECK_ACCESS              FUNCTION 
GET_LEDGER_TYPE           FUNCTION 
GET_DEFAULT_LEDGER        FUNCTION 
HAS_SINGLE_LEDGER         FUNCTION 
WRITE_ANY_LEDGER          FUNCTION 
GET_LEDGER_INFO           PROCEDURE
VALID_BSV                 FUNCTION 
VALID_MSV                 FUNCTION 
MULTI_ORG                 FUNCTION 
INSTALL_INFO              FUNCTION 
GET_IEA_INFO              PROCEDURE
GET_USAGE_INFO            PROCEDURE
GET_BUSINESS_DAYS_PATTERN PROCEDURE
IEA_DISABLED_SUBSIDIARY   FUNCTION 
GET_INDUSTRY_MESSAGE      FUNCTION 
SESSION_ID                FUNCTION 
SERIAL_ID                 FUNCTION 

程序中使用 CHECK_ACCESS方法即可以检查数据访问安全性。

 

四、凭证导入

 

如果客户化程序需要通过总账接口来导入凭证,那需要注意导入凭证受到数据访问权限设置的控制,因此插入到GL_INTERFACE中的数据要充分考虑这点,一般可以采取如下方式:

  1. 如果运行导入程序的职责不具备完全访问分类账的权限,那可以包装一下导入程序,在调用导入程序之前进行数据的过滤
  2. 如果不希望受到数据访问权限的限制,也可以专门设置一个完整权限访问的职责,用它来进行凭证的导入

 

至此整个“总账数据访问安全性控制”系列已全部结束,下面是系列文章的链接:

 

总账数据访问安全性控制(5)

总账数据访问安全性控制(4)

总账数据访问安全性控制(3)

总账数据访问安全性控制(2)

总账数据访问安全性控制(1)

 

-

使用Custom.pll修改标准Form的LOV

九月 21, 2008 in Oracle EBS二次开发

 

在开发过程中,经常碰到需要修改标准Form中LOV的需求,一般来说都是做一些条件限制。在不修改标准Form的fmb文件的前提下,可以通过Custom.pll来实现。

 

一、Custom.pll的工作机制

 

在EBS中大部分Form都是在TEMPLATE.fmb的基础上创建的,另外还有一些HR模块的Form是在HRTEMPLT.fmb的基础上创建的,这些模板Form在form级的触发器中会去调用custom.pll

这些Form级的触发器为:

  1. ZOOM
  2. WHEN-NEW-FORM-INSTANCE
  3. WHEN-NEW-BLOCK-INSTANCE
  4. WHEN-NEW-RECORD-INSTANCE
  5. WHEN-NEW-ITEM-INSTANCE
  6. WHEN-VALIDATE-RECORD

 

在HRMS模块,还有以下触发器也调用了custom.pll

  1. PRE-DELETE
  2. POST-DELETE
  3. PRE-UPDATE
  4. POST-UPDATE
  5. PRE-INSERT
  6. POST-INSERT
  7. POST-FORMS-COMMIT
  8. WHEN-CREATE-RECORD
  9. KEY-DELREC

 

Template_Trigger

在这些触发器中,会调用APP_STANDARD.EVENT过程中的call_all_libraries(event_name),call_all_libraries过程会调用custom.event(event_name)。

 

二、使用custom.pll修改标准form的LOV

 

从服务器下载custom.pll文件,使用form builder打开。点击PL/SQL Libraries,点击新建按钮,另存为pll文件,例如XXPOXPOEPO.pll,新建Package XXPOXPOEPO

 

XXPOXPOEPO

 

新建procedure set_po_vendor_lov如下:

procedure set_po_vendor_lov
is
    l_query_string           varchar2(2000);
    l_customer_group_id recordgroup;
    l_temp_id                 number;
    l_customer_lov         lov;

begin
    if name_in(‘system.cursor_item’) = ‘PO_HEADERS.VENDOR_NAME’ then
      l_query_string :=
‘SELECT DISTINCT
        pov.vendor_name,
        pov.segment1
   FROM po_vendors              pov
  WHERE pov.enabled_flag        = ”Y” ;

      if not id_null(find_group(‘CUX_SUPPLIER_NAME’)) then
          delete_group(‘CUX_SUPPLIER_NAME’);
      end if;
      l_customer_group_id := create_group_from_query(‘CUX_SUPPLIER_NAME’, l_query_string);
      set_lov_property(‘SUPPLIER_NAME’, GROUP_NAME, ‘CUX_SUPPLIER_NAME’);

    end if;
end set_po_vendor_lov;

首先,使用create_group_from_query来创建一个lov record group,然后将我们需要修改的LOV的group置换为我们创建的group。由于这个过程是在when-new-item-instance中调用的,为了防止其他非使用该Lov的Item也执行改过程,所以在程序的开始进行了name_in(‘system.cursor_item’) = ‘PO_HEADERS.VENDOR_NAME’条件的判断,另外,由于record group创建一次在第二次如果再次创建就会报错,所以使用了

if not id_null(find_group(‘CUX_SUPPLIER_NAME’)) then
  delete_group(‘CUX_SUPPLIER_NAME’);

end if;

 

删除group再创建(delete_group只能删除由程序创建的record group)。之所以用这种逻辑而不在创建的时候判断是否已经存在该group是因为这个query_string是动态的,所以在每次都创建才能保证每次LOV的结果是正确的。

接下来,就要把我们的pll添加到custom里面去,点击custom的Attached Libraries,点击添加按钮,选择XXPOXPOEPO。双击打开custom.pll中的custom package,将procedure event过程修改为如下:

 

procedure event(event_name varchar2) is

  form_name      varchar2(30) := name_in(‘system.current_form’);
  block_name     varchar2(30) := name_in(‘system.cursor_block’); 
  –item_name      varchar2(30) := name_in(‘system.cursor_item’);

begin
  if event_name = ‘WHEN-NEW-ITEM-INSTANCE’ then
    if    form_name = ‘POXPOEPO’
        and block_name = ‘PO_HEADERS’
        –and item_name = ‘PO_HEADERS.VENDOR_NAME’
    then
         XXPOXPOEPO.set_po_vendor_lov;
    end if;
  end if;
end event;

在开始的时候,我是在custom过程中去判断当前Item是否等于VENDOR_NAME(红颜色的代码),结果发现添加了改条件之后,某一些Form会出现no data found的错误(例如应用开发员的功能form),这是因为该Form在打开的时候system.cursor_item为空,所以要把item的判断写进了自己客户化的pll中。

最后,把custom.pll和xxpoxpoepo.pll上传到服务器$AU_TOP/resource目录下,使用下面的命令编译pll,退出EBS再重新登陆,LOV就生效了

f60gen module_type=LIBRARY module=CUSTOM userid=apps/apps

支持MOAC功能的Form开发步骤

九月 11, 2008 in Oracle EBS二次开发

 

在R12版本中,OU的控制采取了MOAC的方式,使用户的操作得到了改善。
而如果客户化的Form能够支持MOAC的功能,需要在界面上提供当前用户可以选择的OU字段供用户选择。

 

功能展示如下图:

MOAC_Example

 

这样在Form的开发过程中需要如下的开发步骤:

1,PRE-FORM 触发器初始化MOAC配置环境
  添加如下代码:
  MO_GLOBAL.init(‘ONT’);

  — global.mo_ou_count
  — global.mo_default_org_id
  — global.mo_default_ou_name

  IF l_default_org_id IS NOT NULL THEN — default org id not null
    MO_GLOBAL.SET_POLICY_CONTEXT(‘S’,l_default_org_id);
  ELSE
    MO_GLOBAL.SET_POLICY_CONTEXT(‘M’,null);
  END IF; — default org id not null  
  这段代码的作用是根据预制文件的设置,初始化OU的信息,将用户可以访问的OU信息插入到mo_glob_org_access_tmp表中,
  同时将默认的OU ID、OU Name和OU Count分别写到global.mo_default_org_id, global.mo_default_org_id, global.mo_default_ou_name

  具体细节可以查看数据库包:mo_global

 

2,WHEN-CREATE-RECORD触发器中拷贝OU默认值

  在此触发器中将默认的OU ID和OU Name拷贝给Form界面上对应的自动,实现创建记录的时候默认带出默认OU信息。

  copy(name_in(‘global.mo_default_org_id’),’<block_name.org_id>’);
  copy(name_in(‘global.mo_default_ou_name’),’<block_name.org_name>’);

 

3,创建OU的LOV
  Form界面上的OU 名称字段创建一个LOV,LOV对应记录组的SQL语句如下:

  SELECT hr.organization_id organization_id, hr.NAME organization_name
    FROM hr_operating_units hr
   WHERE mo_global.check_access(hr.organization_id) = ‘Y’
   ORDER BY organization_name

 

其它没有特殊的步骤。

ORACLE EBS二次开发能学到技术吗?

十二月 28, 2007 in Oracle EBS二次开发

 

经常有同学问我:“有人说做Oracle EBS二次开发学不到技术,是真的吗?”

Oracle EBS是一个技术的混合体,它包括了数据库、中间件技术、开发工具以及通过这些系统和工具设计出来的系统。
而对于一个Oracle EBS的二次开发顾问来说,你能接触到的还不仅是Oracle的数据库和它的各种中间件技术以及开发工具,更多的是要学习和理解Oracle EBS这套应用系统的实现,从理解它的设计理念、软件架构、技术实现,到后台的表结构设计,这才是它真正魅力所在。

从中可以学习Oracle EBS这么大的一个系统,整个系统有200多个独立的应用组成,这些应用可以独立成为一个应用,而将它们各应用组成又可以形成一个更大的集成应用系统,其中模块的设计、模块后台表结构的设计、模块之间集成的设计在当今的其它软件系统中难得一见的。

而为了支持庞大的应用以及各种行业的业务流程,后台的数据库结构设计是整个Oracle EBS应用设计的关键所在,近20000(11.5.10.2)张数据库基表,同时很多表列都在100列以上,加上基表间的各种关系,根本就不可能画出完成的ER图,更不可能添加各种约束条件。

而这么庞大的一个应用系统为了满足企业的各种需求,其中使用了IT业中的各种最新技术以及最流行的技术

因此从这个系统开始,我们就可以发展出很多的技术方向:

  1. Oracle 数据库系统管理,即DBA
  2. Oracle EBS系统管理,同时负责数据库系统的维护和Oracle EBS系统的维护
  3. Oracle EBS系统支持:升级和维护
  4. 基于PL/SQL语言环境的Oracle传统技术开发
  5. 基于Java语言环境的Oracle Web开发
  6. 基于Oracle产品的BI/DW开发
  7. ……

综上所述,答案很明显了!!!