You are browsing the archive for 2008 09月.

数据多语言转换开发(1)

3:15 am in Oracle EBS二次开发 by aronezhang

 

Oracle EBS 11.5.10.2

 

本文介绍Form中数据多语言转换的基础

 

Oracle EBS系统是一个多语言的系统,能够实现不同语言环境登录显示不同的语言信息,系统中多语言涉及到两个主要的方面:

  1. 界面的多语言,任何给用户看到的地方,都需要实现多语言来满足不同国家和地区的使用。界面的多语言使得不同的语言环境看到不同语言的界面
  2. 基础数据的多语言,很多用户看到的数据都是通过基础设置而来的,因此不但需要实现界面的多语言,还需要实现基础数据也多语言化。数据的多语言使得不同的语言环境看到不同语言的数据

 

多语言是什么东西呢?简单的说就是一个东西用多种语言来描述

 

本系列文章主要描述怎么样客户化一个表单来支持数据的多语言,界面的多语言不在讨论范围

 

一、功能一憋

 

下面以应用开发员职责中定义Form的界面作为实例,让我们来看看数据多语言转换是什么样的?

 

form_nls_demo_us 
(英文截图)

 

form_nls_demo_zhs 
(中文截图)

 

当以英文环境登录系统时,可以查询出如上图的数据,我们注意看 User Form NameDescription 两个列。可以看到其中的数据都是英文定义的,如第一行叫FNDADDSQ的Form,User Form Name 为:Register Sequence

当以中文环境登录系统时,可以查询出如上图的数据,我们注意看 用户表单名说明 两个列。可以看到其中的数据都是中文定义的,如第一行叫FNDADDSQ的表单,用户表单名为:注册序列

 

二、数据分类

 

要弄清楚数据多语言转换,需要先将数据进行分类,由于要实现多语言转换的对象是:数据。这就意味着可能多语言的量会比较大,就拿上面我们定义表单的例子来说,里面包括了字段:表单、应用、用户表单名和说明总共4个字段,那我们首先要清楚,哪些字段需要实现多语言转换,即哪些数据需要不同的环境下看到不同语言的表现?

因此数据会分为3类:

  1. 用户编码/代码基础数据类:为了知道多语言之后,我们所说的是同一个东西,我们需要一个用户能够识别的代码,不管它在什么语言环境下,都是一样的。如:表单FNDADDSQ
  2. 非多语言类:这类信息不要求不同的语言环境下显示不同的信息
  3. 多语言类:这类信息要求不同的语言环境显示不同的信息,如上面的应用、用户表单名和说明,这就是我们需要多语言转换的地方

 

三、实现步骤

 

  1. 开发一个具备数据多语言转换定义的界面,如上面的表单定义窗口
  2. 进入多语言数据界面,录入多语言数据
  3. 进入不同的语言环境,显示不同的语言数据

 

如何去开发一个具备多语言转换定义的界面我们后面在描述,我们先来看看如何使用一个多语言转换定义的界面。

 

当录入一条数据的时候,通过工具栏中的一个小地球仪的图标来定义多语言信息,当表单中实现了数据多语言功能后,光标进入相应的数据块,小地球仪就会亮起,否则失效

 

form_nls_toolbar

 

点击小地球仪,会弹出数据多语言转换窗口,如下图,注意看转换窗口的行和列:

    行(Row):Oracle  EBS系统安装了多少个语言,这个转换窗口就会显示出多少行,如我的环境安装了中文和英文,所以有两行

    列(Column):这个例子中有两列,分别是用户表单名和说明,这个说明开发表单时候设置的有哪些列是可以进行多语言转换的,因此理论上面可以有无限个列

 

如定义FNDADDSQ表单的时候,点击小地球仪之后显示如下的多语言转换界面:

第一行是英文对应的用户表单名和说明

第二行是中文对应的用户表单名和说明

所以上面中文和英文两个环境下,FNDADDSQ表单的用户表单名和说明显示是不同的

form_nls_define
(多语言转换界面)

 

对于FNDADDSQ表单的用户表单名和说明,每种语言有一行对应的数据。

 

后续将针对多语言后台表结构的设计来解析数据多语言转换的功能。

 

 

最后感谢Anson Locksley 提供资料。

 

 

HR人员信息导入(2)

4:02 am in Oracle EBS功能和流程 by aronezhang

 

 

本文紧接 HR人员信息导入(1) 进行描述HR人员信息导入过程。

 

Oracle EBS 11.5.10.2

 

一、基本必备信息

 

通过第一部分的手工录入数据,我们知道录入一个员工的信息时,界面上必须输入的字段有:

  1. 员工的姓 LAST_NAME
  2. 身份证号 NATIONAL_IDENTIFIER
  3. 员工编号 EMPLOYEE_NUMBER
  4. 员工类型 PERSON_TYPE_ID
  5. 性别SEX
  6. *移居国外者 (中国时需要) LOC_ITEM08
  7. *户口类型 (中国时需要) LOC_ITEM04
  8. *户口所在地 (中国时需要) LOC_ITEM05

 

二、APIs主要参数描述

 

hr_employee_api.create_employee过程的参数非常丰富,包含了一个员工几乎所有涉及到的属性,除了上述几个介绍的必备字段外,另外还有一些重要字段,下面介绍该过程的部分重要参数:

  1. p_validate 必填,该参数可选值TRUEFALSE,当参数输入TRUE时该过程仅对所填数据进行校验,并给出信息反馈,即使通过校验也不提交到数据库;FALSE时对输入的参数进行校验,当验证通过时将导入信息存入数据库
  2. p_hire_date 必填,雇佣日期,Oracle日期格式
  3. p_business_group_id 必填,当前创建人员所在的业务组ID
  4. p_last_name 必填,员工的姓
  5. p_sex 必填,员工性别,可以填入”M“或”F“表示男性或女性,系统会使用”SEX” HR快速编码中存在的值进行验证
  6. p_person_type_id 必填,所创建的员工类别的ID
  7. p_employee_number 必填,员工号,由当前业务组的员工编号生成方法来决定是输入值或得到值。当该生成方法设定为自动生成时,填入该参数的变量将会获得到一个由系统根据序列生成的员工编号。当业务组的生成方法设定为需要输入时,就需要给代入该参数的变量先赋值,然后传递给该参数,系统会校验该员工号是否有重复
  8. p_per_information4 条件必填,户口类型,当使用中国HRMS管理时该字段将为必填选项,输入员工的户口类型。当判断到当前位中国时会调用per_cn_emp_leg_hook.check_int_employee进行校验,对应参数p_hukou_type
  9. p_per_information5条件必填,户口所在地,当使用中国HRMS管理时该字段将为必填选项,输入员工的户口所在地。当判断到当前位中国时会调用per_cn_emp_leg_hook.check_int_employee进行校验,对应参数p_hukou_location
  10. p_per_information8条件必填,是否出国标示,当使用中国HRMS管理时该字段将为必填选项。当判断到当前位中国时会调用per_cn_emp_leg_hook.check_int_employee进行校验,对应参数p_expatriate_indicator
  11. p_original_date_of_hire 必填,原始雇佣日期
  12. p_date_of_birth 条件必填,当在该员工的分配信息中定义了工资单,就必须在员工信息界面输入该员工的出生日期

 

注:如果系统启用了描述性弹性域,而且其中包括了必填的字段,那也需要提供相关信息

 

三、常见APIs调用的错误及原因

 

a) ORA-20001: The mandatory argument XXXX value cannot be null

必填参数XXXX没有填写,注意当使用中国HRMS时p_per_information4/5/8均为必填项

b) ORA-20001: The value XXXX not valid for the XXXX field.

不同字段有其自己的验证规则,有些使用hr_lookups中的快速编码验证,有些根据Value Set中的值验证。

c) ORA-20001: You must enter the gender for an employee.

员工性别为填。

d) ORA-20001: Employee Number already exists.

员工工号在系统中已经存在,需要使用新的工号。

 

四、APIs调用实例

 

导入时的各变量定义及调用格式请参考附属脚本:hr_people_imp.tst

 

相关脚本下载:Download JDeveloper 11g中利用RestLet开发RESTful服务 Version 1

 

 

-

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

12:54 am in Oracle EBS二次开发 by aronezhang

 

本文介绍在 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介绍

 

-

HR人员信息导入(1)

9:16 am in Oracle EBS功能和流程 by aronezhang

 

Oracle EBS 11.5.10.2

 

本文讲述Oracle EBS HR项目实施时,通过开发导入的各种HR相关数据及API导入方法。这里描述HR人员基本信息导入的方法。

 

HR人事模块在上线前会导入大量人员基本信息。一般通过使用Oracle HR模块的标准API进行人员信息的导入, 一般导入步骤如下:

  1. 通常在系统中会先建立客户化临时表
  2. 将客户整理好的数据导入临时表中
  3. 在临时表进行数据的校验,校验根据当前客户的需求和系统的实际情况来完成
  4. 完成校验后的数据逐行调用API导入系统

 

 

利用标准界面创建员工

 

录入员工信息是在标准的员工的录入界面。

 

1. 完成了HR模块的基础模块设置后进入“中国HRMS管理员”或其他具有相关权限的职责

2. 打开标准Form,路径:中国HRMS管理员–>人员–>输入和维护;英文环境:China HRMS Manager–>People–>Enter and Maintain

3. 打开人员输入维护界面后如下图所示,会弹出查询窗口让用户新增数据或查找

hr_people_enter_and_maintain_find

 

4. 点击新建(New)按钮后就会进入人员的输入界面,这个时候我们可以看到主界面上有哪些是必输项,这些项都会以黄色标识。但实际在输入时会有一些项根据当前实际数据信息也动态变成必须

hr_people_enter_and_maintain_new

 

5. 首先我们在界面上输入当前所见的黄色区域,包括“”和“身份证号”,并切换一些Tab页面将其中的必输字段也填写完整后保存,回出现如下“在首次创建记录时,您必须选择活动类型的值”的提示信息

hr_people_enter_and_maintain_error

 

6. 在主界面右上方选择“操作(Action)”,选择创建雇佣后,就需要输入员工号并且自动带出右下方的起始日期。然后再保存的时候系统会提示必须设置员工性别,我们在使用下拉框“Gender”选择性别。完成上述选择后保存员工保存成功。(如果此时还有其他提示信息标识当前环境可能有部分不同的基础设置导致)

7. 员工信息建立后我们可以看到同时创建的信息包括1条默认主分配信息,从主界面下方点击Assignment按钮进入分配界面

hr_people_assignment

 

8. 同时还创建了一条员工服务期记录,同国主界面点击“Others”选择“Person Type Usage”打开界面

hr_people_perso_type_usage

 

9. 在第一节中我们描述了如何利用系统界面进行单条员工最少信息的录入。但是往往在项目实施阶段会有大批量的员工信息需要录入系统,通过手工录入或一些键盘指令软件如Dataload进行数据录入都是非常低效的,当涉及到上万条员工信息的时候需要消耗大量的时间。

因此我们使用Orocle标准的API,通过一些程序逻辑将数据进行导入。

当一条员工记录保存后通过第一节的内容,我们知道会同时生成3条数据包括1条员工基本信息,1条分配信息以及1条员工服务期记录。分别被保存在3张系统表中:

per_all_people_f
per_all_assignments_f
per_person_type_usages_f

10. 使用hr_employee_api.create_employee 过程,程序包版本$Header: peempapi.pkh 115.30 2006/03/03 05:38:37 lsilveir noship $ 创建员工信息,成功后也会在这三张表中生成记录。

 

后续将介绍如何使用hr_employee_api将人员信息导入系统

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

3:03 am in Oracle EBS二次开发 by aronezhang

 

本文介绍通过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在一些场合下也会使用到。