You are browsing the archive for 弹性域.

在Report中取得帐户描述(3)

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

 

本文介绍在 Oracle Report Builder中使用用户出口函数(USER_EXIT)取得账户的描述。

 

在Oracle EBS的环境下,使用Oracle Report Builder可以很方便的取得关键性弹性域相关的数据信息,主要分为两个步骤来实现:

1)根据弹性域动态创建SQL语句,这个步骤生成的输出作为第二步骤的输入;

2)根据输出的要求显示数据。

 

一、初始化

 

在编写的SQL语句中添加词义变量(通过Placeholder实现);调用FND FLEXSQL用户出口函数来创建查询,并指定参数设定。

这样一来,报表在运行SQL查询运行之前根据用户出口函数的参数指定将词义变量替换为具体的数据库列,如编写了如下的查询语句:

SELECT &LEXICAL1 alias, column
  FROM table
WHERE &LEXICAL2

如调用FND FLEXSQL用户出口函数的时候指定了弹性域有两个段组成,SEGMENT1的值小于2,即&LEXICAL1被替换为 “SEGMENT1||’\n’||SEGMENT2″,&LEXICAL2被替换为 “SEGMENT1 < 2″ 。这样实际的SQL查询语句则为:

SELECT SEGMENT1||’\n’||SEGMENT2 alias, column
  FROM table
WHERE SEGMENT1 < 2

在这个阶段,我们还可以使用SELECT, ORDER BY, GROUP BY或者WHERE 语句来更改SQL语句;保证每个词义变量调用一次FND FLEXSQL用户出口函数。

 

二、显示

 

这一步骤就是将取出的弹性域数据根据要求显示出来,使用FND FLEXIDVAL 用户出口函数来处理。需要添加一个公式列(Formula Clumn)来包括显示的弹性域信息。

必须为每一条记录调用一次FND FLEXIDVAL

 

三、详细的实现步骤

 

  1. 添加一个用户参数 P_CONC_REQUEST_ID(Number),这个参数是在用户出口函数初始化的时候需要使用
  2. 在报表触发器BeforeReport中调用用户出口函数 FND SRWINIT 来初始化环境:取得并发程序相关信息和预制文件信息
  3. 在报表触发器AfterReport中调用用户出口函数 FND SRWEXIT 来释放用户出口函数中使用的内存
  4. 定义SQL中需要使用的词义变量,即定义一个Placeholder,并根据需要取出的段来设置空时的值
  5. 在报表触发器BeforeReport中调用用户出口函数 FND FLEXSQL来初始化SQL
  6. 在报表触发器BeforeReport中调用用户出口函数 FND FLEXSQL,并设置MODE=”WHERE”来限制查询的数据
  7. 在报表触发器BeforeReport中调用用户出口函数 FND FLEXSQL,并设置MODE=”ORDER BY”来对段列的数据进行排序
  8. 显示段值或段值的描述,通过创建公式列(Formula Column),并在公式列的触发器中调用FND FLEXIDVAL用户出口函数来显示弹性域数据

 

四、示例展示 

 

下面以一个实际的例子将上面的步骤做出展示

目的:开发一个报表,打印出账户组合以及账户组合的描述、自然账户的描述

样式

Combination         Description                                                                                                                   Account Desc
———————–  ————————————————————————————————————-  ——————————–
100.1160.1210.0000.0000  US Company.EM2 Maintenance Plant.Receivables – Trade.Default.Future Use               Receivables
100.1160.5902.0000.0000  US Company.EM2 Maintenance Plant.Invoice Price Variance.Default.Future Use           Invoice Price Variance
100.1160.2220.0000.0000  US Company.EM2 Maintenance Plant.Uninvoiced Receipt Accrua.Default.Future Use     Uninvoiced Receipt Accrua
100.1160.4100.0000.0000  US Company.EM2 Maintenance Plant.Product Revenue.Default.Future Use                   Product Revenue

 

下载Oracle Report设计文件Download HR人员信息导入 Version 1

 

关于如何取得账户描述的系列已结束:

 

在Report中取得帐户描述(3)

在Report中取得帐户描述(2)

在Report中取得帐户描述(1)

用户出口函数USER EXIT介绍

 

-

在Report中取得帐户描述(2)

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

 

本文介绍通过SQL语句取得账户段值对应的描述。

 

编写SQL的思路

 

  1. 通过预制文件取得当前的帐簿信息
  2. 通过表gl_set_of_books表取得帐户结构ID
  3. 根据结构ID从弹性域相关表中取得段值的描述
  4. 并根据帐户段的设置来连接段

 

编写SQL来取得段的描述存在如下的问题

 

  1. SQL相对复杂
  2. 如果帐户段之间存在依赖关系就比较麻烦
  3. 写出的SQL移植性差
  4. SQL性能容易出现瓶颈

 

下面是取得一个段值描述的SQL语句

 

SELECT DESCRIPTION

FROM FND_FLEX_VALUES_VL B

WHERE B.FLEX_VALUE = 代码

AND EXISTS( SELECT NULL

                       FROM FND_ID_FLEX_SEGMENTS_VL D,

                                 GL_SETS_OF_BOOKS E

                     WHERE D.ID_FLEX_CODE = ‘GL#’

                         AND D.ID_FLEX_NUM = E.CHART_ACCOUNT_ID

                         AND E.SET_OF_BOOK_ID=预置文件GL_SET_OF_BKS_ID

                         AND D.APPLICATION_COLUMN_NAME=SEGMENT?

                         AND D.FLEX_VALUE_SET_ID= B.FLEX_VALUE_SET_ID)

 

其中SEGMENT? 代表了需要取得第几段的值,如果是第一段则为 SEGMENT1 ,依次类推;‘GL#’是帐户关键性弹性域的代码

 

如果是从属段,还需要添加额外一个条件:

 

SELECT DESCRIPTION

  FROM FND_FLEX_VALUES_VL B

WHERE B.FLEX_VALUE = 代码

   AND B.PARENT_FLEX_VALUE_LOW = 父段的代码

 

虽然在报表中我们推荐使用USER_EXIT的方式取得关键性弹性域的段值描述,但是上面的SQL在一些场合下也会使用到。

在Report中取得帐户描述(1)

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

 

Oracle EBS 11.5.10.2

 

本文是讲解如何使用USER_EXIT用户出口函数取得帐户组合的基础知识篇

 

一、帐户段描述的定义

 

帐户的结构是一个关键性弹性域,帐户段的描述既是对应值集中值的描述,可以通过以下步骤找到对应的帐户段设置 :

 

1. 切换到总帐超级用户职责或者具有相关权限的职责

2. 导航到菜单:Setup–>Financials–>Books–>Define中

3. 查询使用的帐簿,查看其中的Chart of Accounts字段的值

 

gl_sob_define

 

4. 导航到菜单:Setup–>Financials–>Flexfields–>Key–>Segments,查询出关键性弹性域 Accounting Flexfield,并查找出相应的结构

 

gl_sob_segs_enable

 

5. 查看帐户结构中定义的段,可以找出对应的值集名称

 

gl_sob_segs_define

 

6. 导航到菜单:Setup–>Financials–>Flexfields–>Validation–>Values,查找对应的值集,可以查看段值的描述信息

 

 gl_sob_seg_value_set

 

二、SRW内置包

 

SRW内置包是Oracle Report提供的用于PL/SQL应用开发的一个程序包,可以在PL/SQL中使用它的过程、功能和例外。
以下是比较常用的几个过程和函数:

  1. SRW.DO_SQL    执行一段SQL,可以执行DDL和DML语句
  2. SRW.MESSAGE    显示一个消息和消息号码
  3. SRW.REFERENCE    将引用的对象添加到构造依赖列表中,让Report在触发初始化构造的时候对值进行测定
  4. SRW.USER_EXIT    执行用户出口函数

 

需要注意的是:这个内置包是Oracle Report的东西,并不是Oracle EBS的东西,做Oracle EBS开发的同学们不要搞错了

用户出口函数USER EXIT介绍

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

 

用户出口函数的概念:

使用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开发手册