用户出口函数USER EXIT介绍

1:46 am in Oracle EBS二次开发 by aronezhang

 

用户出口函数的概念:

使用PRO*C编写的函数(以Oracle的说法是第三代语言写的),而这类函数基本上没有任何的文档,以Oracle的说法就是“undocumented”,也没有源代码可以看到,因为系统只有编译好的可执行文件。用户出口函数主要用在Oracle Report和Oracle Form的开发中。

 

Report中使用USER_EXIT调用用户出口的语法:
        SRW.USER_EXIT (user_exit_string CHAR),其中user_exit_string是用户出口函数的名称和参数

Form中使用USER_EXIT调用用户出口的语法:
        USER_EXIT  (user_exit_string  VARCHAR2),其中user_exit_string是用户出口函数的名称和参数

 

那Oracle为什么要使用这类函数呢?,根据我的经验和理解:

  1. 为了提高性能,由于有的业务逻辑比较复杂,使用PRO*C来实现可以提高性能
  2. 和操作系统相关的一些操作,由于这类操作涉及操作系统权限、I/O等,使用PRO*C实现最适合
  3. 某些业务逻辑不想让外界知道,使用PRO*C最好,隐藏业务逻辑

 

一、Oracle Report中使用用户出口函数

 

而在Oracle Report中需要去调用用户出口函数的时候就使用SRW.USER_EXIT函数来实现,在Report中如何使用弹性域的用户出口函数在开发手册上已经有了比较详细的使用说明,大的步骤有两个:

  1. 使用 FND FLEXSQL 取得数据,FND FLEXSQL提供的功能就是动态组建SQL语句,并根据提供的参数进行查询
  2. 使用 FND FLEXIDVAL 来格式化数据并显示在报表上面,FND FLEXIDVAL提高的功能就是根据FND FLEXSQL取出的数据根据提供的参数进行格式化

 

在Oracle Report工具中经常使用SRW.USER_EXIT来取得一些和弹性域有关的值:

1)最常见的就是关键性弹性域的描述,Oracle EBS中关键性弹性域中段值的描述是通过独立型值集来定义的,自己来写SQL取得段的描述比较麻烦,主要是随着系统设置的不同,弹性域段的结构是不一样的,而且会出现段之间存在依赖关系的情况,这样取得段值的描述就更麻烦了,而且在报表需求中可能有的地方需要显示一段,有的地方是两段,等等的需求。

实际的例子可以查看GL模块中的标准报表 GLYRLGLG.rdf(Journals – Entry/日记帐 – 分录),当然有这种用法的报表非常多

 

2)而另外一个在Oracle Report常用的用户出口函数是关于本位币和外币转换和格式化的函数,由于很多使用需要在报表中即显示本位币的金额又需要显示外币的金额,但是系统中只存储了本位币的金额;而如果不使用用户出口函数来实现从本位币金额到外币金额的转换,那转换和格式化金额就比较麻烦,使用Oracle已经实现的用户出口函数就比较简单

 

在Report中实现本位币和外币转换格式化的例子有APXINAGE.rdf(Invoice Aging Report/发票帐龄报表),使用的例子:

BEGIN
   SRW.REFERENCE(:C_INV_DUE_AMT_3);
   SRW.REFERENCE(:C_BASE_CURRENCY_CODE);
   SRW.REFERENCE(:P_MIN_PRECISION);
   SRW.USER_EXIT(‘FND FORMAT_CURRENCY
       CODE=”:C_BASE_CURRENCY_CODE”
       DISPLAY_WIDTH=”15″
       AMOUNT=”:C_INV_DUE_AMT_3″
       DISPLAY=”:C_INV_DUE_AMT_3_F”
       MINIMUM_PRECISION=”:P_MIN_PRECISION”‘);
       RETURN(:C_INV_DUE_AMT_3_F);
END;

 

参数的详细解释请参考弹性域使用手册

 

 

二、Oracle Form中使用用户出口函数

 

Oracle Form中调用用户出口函数使用:USER_EXIT。在Form中用户出口函数的使用比较频繁,而且种类也比较繁杂,就拿我们经常使用的一个Form,用户定义的窗口(FNDSCAUS.fmb)
打开看它的源代码,其中就使用了好几个用户出口函数,包Fnd_Encrypt_Pwd中的过程Change_Password,
我摘出了其中的两个出口函数

 

procedure Change_Password is
begin
    — Call custom package to do any custom password inspection.
    user_exit(‘FND GLOBAL TYPE=USERNAME FIELD=”GLOBAL.USER_NAME”‘);
    –
    — Two entries match – encrypt new password
    –
    User_Exit(‘FND PWD TYPE=”USER” ‘||
        ‘USERNAME=”:USER.USER_NAME” ‘||
        ‘PASSWORD=”:USER.USER_PASSWORD” ‘||
        ‘OUT_E_USER_PWD=”:USER.ENCRYPTED_USER_PASSWORD” ‘||
        ‘OUT_E_ORCL_PWD=”:USER.ENCRYPTED_FOUNDATION_PASSWORD” ‘||
        ‘DECRYPT=”N”‘);
end Change_Password;

 

出于用户函数的特殊使用场合、使用目的和实现方法,导致了没有文档的情况,那我们怎么去使用它们呢,个人的经验只有一个办法:
看到Oracle怎么使用就记下,下次需要的使用就按照Oracle的用法去使用它。

 

关于如何开发PRO*C的程序,请参考Oracle Applications开发手册

无相关文章.