You are browsing the archive for 2008 九月.

使用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

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

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

 

下面介绍数据访问安全性控制两个不足的地方

 

一、凭证查找

 

在凭证查找的窗口中,凭证批号和凭证号的列表没有按照数据安全的设置进行屏蔽,因此会出现列表能够选择出来的凭证批和凭证是无法查找出来的,这样给用户的使用带来了一定的不方便。如下:

 

gl_access_set_journal_entry

注:此凭证通过具有权限的职责查询出来

 

如上图的凭证:06-NOV-02 Project Mfg To Consolidation USD
此凭证所有的凭证行的账户组合的平衡段值都是03的,而我的职责分配了数据权限集只能访问平衡段值为:01的。但是这个凭证名称在查找窗口的凭证列表中还是出现的,只是我选择了它之后查找没有结果,如下图:

 

gl_access_set_journal_entry_find

 

gl_access_set_journal_find_no_result 

 

二、账户组合录入

 

在总账模块输入账户组合时,如果设置了数据安全性屏蔽是按照平衡段或者管理段来进行屏蔽的时候,在录入账户组合的时候,用户可以看到不该看到的段值,只是在确认段组合的时候提示没有权限操作账户组合,无法完成录入,这样也给操作人员带来一定的麻烦。
数据访问权限集中设置了只能访问平衡段值为:01的。但是选择平衡段的时候还是能够看到所有的段值。只有确认账户组合的时候才会弹出:您无权访问此账户。如下图:

 

  gl_access_set_gcc_segment_val

 

gl_access_set_gcc_no_access

 

==

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

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

 

本文描述实现总帐数据访问安全性控制的设置步骤

 

一、定义数据访问权限集

路径:总账超级用户–>设置–>财务系统–>数据访问权限集

定义数据访问权限集有以下主要3个步骤:

  1. 输入数据访问权限集的信息:名称、说明、科目表、日历、访问权限集类型和默认分类账
  2. 给数据访问权限集分配分类账/分类账集
  3. 设置权限:只读、读和写

 

定义示例

1)全部分类账类型

  1. 访问权限集类型:全部分类账
  2. 访问详细资料中选择分类账/分类账集的名称
  3. 设置权限:Read and Write

 

gl_access_set_full_ledger_define

 

2)平衡段值类型

  1. 访问权限集类型:平衡段值
  2. 访问详细资料中选择分类账/分类账集的名称和特定的平衡段值:指定只能读写平衡段值为01的
  3. 设置权限:Read and Write

 

gl_access_set_bsv_define

 

二、分配数据访问权限集给职责

 

给相应的职责分配预制文件:GL:数据访问权限集/GL_ACCESS_SET_ID的值为已定义的数据访问权限集的名称,如下图中给职责“General Ledger, AroneZhang”分配权限集“Data Access Set, AroneZhang”:

gl_access_set_assign_resp

 

 

三、登录系统验证安全性控制

 

注:下图是通过一个具备完整权限的用户查询出的凭证信息:“06-NOV-02 Project Mfg To Consolidation USD”

 

gl_access_set_journal_entry

 

 

切换到职责:General Ledger, AroneZhang,再次查询凭证信息,由于凭证行账户组合的平衡段都是03,因此无法查找出凭证信息:

 

gl_access_set_journal_find_no_result

 

其它较细节的功能就留给读者自己去试验了。

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

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

 

EBS版本:12.0.0以上

 

在Oracle EBS 12 之前,很多项目中希望按照某些规则进行总账数据的屏蔽只能通过客户化开发来实现,如按照OU进行凭证的屏蔽,同时FSG报表的数据也需要按照同样的规则屏蔽相关数据.这样的要求需要开发人员修改较多的数据库视图定义和PL/SQL程序,同时导致EBS的升级是一个较麻烦的事情。

在Oracle EBS 12之中,Oracle对数据安全性的控制作了独立的设计。

后续文章中,我将结合功能和技术对总账的数据安全性控制做一个介绍,由于内容设计系统功能和技术层面,因此会分做多篇文章来描述。

 

数据访问权限集(Data Access Set)介绍

 

Oracle EBS12 中,通过数据访问权限集来控制职责能够访问哪些分类账,它可以限制用户只能够存取某些平衡段值或管理段值,或者授权给一个职责只能读取或者同时具备读写分类账中数据的权限。
如果分类账和分类账集分配给同一个数据存取集,必须保证它们是共享同样的账户结构、会计日历和期间类型

系统中可以定义如下三种类型的数据访问权限集:

  1. 全部分类账
  2. 平衡段值(BSV)
  3. 管理段值(MSV)

 

全部分类账(Full Ledger):
用户可以存取整个分类账的数据。如:在数据访问权限集中包含2个分类账,A和B,可以设置用户只能够读取A分类账中的数据,没有写数据的权限;而设置用户能够同时读写B分类账中的数据

 

平衡段值(Balancing Segment Values/BSV):
授权用户存取所有或者某些特定分类账平衡段值的账户组合。譬如,可以定义一个数据访问权限集来控制分类账A的数据读取:对平衡段值01只有读取权限;对平衡段值02具有读写权限;而对于平衡段值03则没有读写的权限

管理段值(Management Segment Values/MSV):
授权用户存取所有或者某些特定分类账管理段值的账户组合。譬如,可以定义一个数据访问权限集来控制分类账A的数据读取:对管理段值100只有读取权限;对平衡段值200具有读写权限;而对于平衡段值300则没有读写的权限。要启用管理段的控制必须账户结构定义中指定了管理段。

 

满足下列条件时,Oracle General Ledger自动生成数据访问权限集:

  1. 创建一个分类账
  2. 定义一个分类账集

 

系统为分类账生成的数据访问权限集和分类账同名,这个权限集使用了“全部分类账”的访问权限集类型,提供了完全读写整个分类账数据的权限。

系统为分类账集生成的数据访问权限集和分类账集同名,这个权限集使用了“全部分类账”的访问权限集类型,提供了完全读写所有分配给分类账集中分类账的数据权限。

 

如果只需要控制和系统生成数据访问权限集一致的权限控制,直接使用系统生成的数据访问权限集,无须而外手工创建数据访问权限集。
只有当需要更小粒度的控制分类账、分类账集、特定平衡段值或特定管理段值的数据读取权限的时候,才需要手工创建数据访问权限集。

 

下一篇文章将描述如何设置数据访问权限集以及将其分配给某职责。

Oracle Report迁移到BI Publisher

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

 

在Oracle Report中,数据模型和布局是在一个RDF文件中,而在BI Publisher中,数据模型和模板已经分离出来,因此Oracle提供了从Oracle Report转换到BI Publisher的转换工具,以便我们可以转向新的报表方式。

 

为了转换Oracle Report RDF文件到BI Publisher中的数据源和布局文件,需要进行两个步骤的转换工作:

  1. 将RDF文件转换为XML格式
  2. 将XML格式的报表文件转换为数据模型文件和布局文件

 

下面是转换示意图:

Migrate_Report_BIPubliser

 

一、前提条件

为了使BIP工具能够对RDF报表进行转换,必须满足以下条件:

  1. Oracle Report 9i以上的报表
  2. 需要先将RDF文件转换为XML格式

 

使用Oracle Report Designer另存功能或者位于$ORACLE_HOME/bin目录下的Oracle Report工具 rwconverter将RDF文件转换为XML格式的文件,如下面的例子:

D:\Oracle_home\BIN>rwconverter batch=yes source= h:\reports\raxinv.rdf dest= h:\reports\raxinv.xml dtype=xmlfile overwrite=yes

 

二、数据模型转换

使用DataTemplateGenerator API将Oracle Report的数据模型和PL/SQL逻辑转换为BIP中的数据模板和PL/SQL数据包。

API可以通过命令行或者脚本来调用,调用成功后会生成如下的文件:

  1. 数据模板(REPORT.xml)
  2. PL/SQL包声明文件(REPORTS.pls)
  3. PL/SQL包体文件(REPORTB.pls)

 

转换命令如下:

java oracle.apps.xdo.rdfparser.DataTemplateGenerator H:\report\raxinv.xml

oracle.apps.xdo.rdfparser.DataTemplateGenerator 位于中间服务器的$JAVA_TOP路径下,因此转换最好登录EBS中间服务器执行;

注:数据文件XML必须是完整的路径,否则转换失败

 

三、布局转换

使用RTFTemplateGenerator API将Oracle Report的布局转换为BIP的RTF模板文件,由于在RTF模板文件中不支持PLSQL,因此转换过程中不会转换任何的格式触发器的代码,转换器会将格式触发器中的代码写到日志中,开发人员需要在RTF模板中使用XSL来实现格式触发器的功能。

API可以通过命令行或者脚本来调用,调用成功后会生成如下的文件:

  1. RTF模板
  2. 日志文件

 

转换命令如下:

javaw.exe oracle.apps.xdo.rdfparser.RTFTemplateGenerator H:\report\raxinv.xml

oracle.apps.xdo.rdfparser.RTFTemplateGenerator 位于中间服务器的$JAVA_TOP路径下,因此转换最好登录EBS中间服务器执行;

注:数据文件XML必须是完整的路径,否则转换失败

 

四、批量转换

上面的三个步骤可以合并起来自动完成,不但可以完成一个报表的转换,还可以完成一个文件目录下所有报表的批量转换

下面是转换一个目录下所有RDF文件的脚本,需要使用如下的Java库:

  1. Collections.zip:从Sun Microsystems公司下载
  2. xmlparserv2-904:JAVA_TOP目录下
  3. 指向Oracle Applications JAVA_TOP(需要BIP的库)

 

下面是成批转换的Shell脚本:

#!/bin/sh
# This script will generate a report for each template in the current directory
# Create a variable to hold the classpath
classpath=”DIR/collections.zip:DIR/xmlparserv2-904.zip:JAVA_TOP directory”
if [ $# -eq 0 ] then
    for file in *.rdf
    do
        echo “Processing … $file”
        if test -f $file
        then
            # Convert the rdf to xml
            echo yes | $ORACLE_HOME/bin/rwconverter.sh batch=yes source=$file dest=$file dtype=xmlfile overwrite=yes; \
            #Create a variable to hold the new xml file name, this is just a simple replace
            # statement
            xfile=”${file//rdf/xml}”;
            # Generate the data template plus plsql
            echo yes | /local/java/jdk1.5.0_06/bin/java -classpath
            $classpath oracle.apps.xdo.rdfparser.DataTemplateGenerator $xfile;
            # Generate the RTF template
            echo yes | /local/java/jdk1.5.0_06/bin/java –classpath
            $classpath oracle.apps.xdo.rdfparser.RTFTemplateGenerator $xfile;
        fi
    done
else
    echo usage: $0
    echo this script will generate a data template and supporting plsql    and an RTF template in the current directory
fi

可以将上面的Shell脚本另存为一个脚本文件,然后进行转换操作。