ITPub博客

首页 > 数字化转型 > ERP > USER_EXIT

USER_EXIT

原创 ERP 作者:eworm 时间:2009-04-28 21:49:28 0 删除 编辑

转载:http://www.itpub.net/thread-1156625-1-1.html

在讲解使用USER_EXIT之前先说明一下用户出口函数的概念:
说简单一点,用户出口函数就是使用PRO*C编写的函数(以Oracle的说法是第三代语言写的),而这类函数基本上没有任何的文档,以Oracle的说法就是“undocumented”,也没有源代码可以看到,因为系统只有编译好的可执行文件。

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是用户出口函数的名称和参数

[@more@]
suixing2k66讲解USER_EXIT

有的同学提问了关于SRW.USER_EXIT的用法,也没有太多的人回答,就个人的了解给大家做个讲解:

在讲解使用USER_EXIT之前先说明一下用户出口函数的概念:
说简单一点,用户出口函数就是使用PRO*C编写的函数(以Oracle的说法是第三代语言写的),而这类函数基本上没有任何的文档,以Oracle的说法就是“undocumented”,也没有源代码可以看到,因为系统只有编译好的可执行文件。

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中需要去调用用户出口函数的时候就使用SRW.USER_EXIT函数来实现,在Oracle Report工具中经常使用SRW.USER_EXIT来取得一些和弹性域有关的值,最常见的就是关键性弹性域的描述,大家都知道,Oracle EBS中关键性弹性域中段值的描述是通过独立型值集来定义的,自己来写SQL取得段的描述比较麻烦,主要是随着系统设置的不同,弹性域段的结构是不一样的,而且会出现段之间存在依赖关系的情况,这样取得段值的描述就更麻烦了,而且在报表需求中可能有的地方需要显示一段,有的地方是两段,等等的需求。

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

在Report中如何使用弹性域的用户出口函数在开发手册上已经有了比较详细的使用说明,做一下简单的介绍,
大的步骤有两个:
1。使用 FND FLEXSQL 取得数据,FND FLEXSQL提供的功能就是动态组建SQL语句,并根据提供的参数进行查询
2。使用 FND FLEXIDVAL 来格式化数据并显示在报表上面,FND FLEXIDVAL提高的功能就是根据FND FLEXSQL取出的数据根据提供的参数进行格式化

详细的实现步骤在这儿就不说了,如果有人还需要就在以后再讲吧。

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

而在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中也有,即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怎么使用就记下,下次需要的使用就使用它。



当然如果大家对怎么去实现一个PRO*C的函数有兴趣的话,可以参考开发文档,也可以和我一起讨论!
另外对于理解上面的东西,了解弹性域的东西也是很有必要的,可以参考弹性域文档,也可以和我讨论!

最后我把上面提到的一个Report和一个Form也上传给大家吧。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7988176/viewspace-1021429/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论
  • 博文量
    29
  • 访问量
    338277