文档库 最新最全的文档下载
当前位置:文档库 › XYG Oracle EBS多语言Message开发教程(Web共享) V1.0

XYG Oracle EBS多语言Message开发教程(Web共享) V1.0

XYG Oracle EBS多语言Message开发教程(Web共享) V1.0
XYG Oracle EBS多语言Message开发教程(Web共享) V1.0

OUM

XXXXXX D OCUMENT T EMPLATE Oracle EBS技术开发之

EBS多语言Message开发教程

Author: 王宪(samt007@https://www.wendangku.net/doc/4113612554.html,)

Creation Date: 2014-12-24

Last Updated: 2014-12-24

Document Ref: Version: DRAFT 1A

Approvals:

编制人:

审核人:

批准人:

XXXXXX Document Template

Oracle EBS技术开发之文档控制 ii

1 文档控制1.1 变更记录

1.2 审阅

XXXXXX Document Template

Oracle EBS技术开发之文档控制 iii

Contents内容

1文档控制 ....................................................................................................................... i i 1.1变更记录 .. (ii)

1.2审阅 (ii)

2EBS多语言Message的开发需求 (1)

2.1目前的开发现状以及问题 (1)

2.2Oracle对多语言消息的开发支持 (1)

3客户化EBS多语言消息开发教程 (3)

3.1多语言消息的开发规范教程 (3)

3.1.1快速查询是否有现成的消息可供我们使用。 (3)

3.1.2快速新增一个消息。 (4)

3.1.3自动处理消息(分配消息的语言环境等)。 (6)

3.2多语言消息的使用教程 (7)

3.2.1如果是Pkg等存储过程或者函数的使用方式。 (7)

3.2.2如果是Form功能使用的方式 (8)

4客户化EBS多语言消息处理Pkg详解 (10)

4.1基本对象的定义 (10)

4.2Pkg的处理逻辑的代码 (10)

5未结和已结的问题 (13)

5.1未解决的问题 (13)

5.2已结问题 (13)

XXXXXX Document Template

Oracle EBS技术开发之EBS多语言Message的开发需求 1 of 16

2 EBS多语言MESSAGE的开发需求

由于多语言的开发还是明年的工作重点,而且标准功能实际上也是支持多语言提示消息的程序开发。

所以从现在开始,新开发的程序,涉及到Message消息提示的部分都必须要用多语言来处理。

2.1 目前的开发现状以及问题

以前,我们开发程序,为了方便和提高工作效率,经常将程序的提示消息写在程序里面。实际上是非常不合适的做法。主要是会有几个问题:

1. 消息的内容写在程序里面了,如果该内容有变化,则要修改程序。程序的稳定性差!

2. 对多语言功能不支持!如果有了英文的ERP的使用需求,由于消息是写在程序里面,所以不支持

英文的提示(消息提示还是中文!)。除非修改程序。

3. 由于有大量的消息写在程序里面,可能会导致程序的代码量增加,不便程序的阅读。并且,同样

类型的错误的信息不可以被公用!

2.2 Oracle对多语言消息的开发支持

所以,Oracle的标准用法是使用

FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;

在EBS的应用开发者下定义中文和英文消息,然后提交请求"生成信息"来生成消息,使用这种方式可

以适用于多语言和修改人机界面的提示信息,而不用去修改源程序。

XXXXXX Document Template Oracle EBS 技术开发之

EBS 多语言Message 的开发需求

2 of 16

而研究过标准功能程序的人都知道,实际上Oracle 的所有消息提示都是用这个方法来定义并使用。 举个例子:

做自动产生并登记销售订单的时候,API 报的错误:

问题:这个消息提示:对字段 XXX 的验证失败。是怎么做到的?哪里定义的?哪里调用? 首先,先定义在消息里面(其中有一个输入参数&Attribute ):

然后,在API 的包(验证销售订单行的包OE_Validate_Line )调用:

XXXXXX Document Template Oracle EBS 技术开发之

EBS 多语言Message 的开发需求

3 of 16

PS :如果用户用的是英文环境,则会输出对应的英文的Message : Validation failed for the field - &ATTRIBUTE

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息开发教程 4 of 16

3 客户化EBS多语言消息开发教程

考虑到,很多时候消息都是特定一个程序在用,别的程序一般不会使用;所以,为了提高多语言消息的处理的工作效率,这里封装了几个快捷处理的存储过程和Pkg。主要是用标准消息的API自动生

成对应的消息!

都是封装在这个包:

XYG_ALD_MESSAGES_PKG

具体的使用办法结合在本章的开发教程里面。

3.1 多语言消息的开发规范教程

举个例子,我要添加一个错误的提示消息:不存在采购订单头。则要做的动作是:

3.1.1 快速查询是否有现成的消息可供我们使用。

查询语句:

SELECT * FROM TABLE(XYG_ALD_MESSAGES_PKG.CHECK_MESSAGE('不存在采购订单头','采

购订单',50,'ZHS'));

用法说明:

这里返回的是你要的消息的所有信息。上面的例子是:消息中包含关键字:'采购订单'的,并且和'不存

在采购订单头'的相似度超过50%的中文语言的所有消息。

强烈建议在新建消息之前最好查询一下是否有现成的消息可供使用。如果有,则不需要再新建消息了!

否则消息更加难管理!

XXXXXX Document Template Oracle EBS 技术开发之

客户化EBS 多语言消息开发教程

5 of 16

如果上面有一个消息的定义是可供我们使用的,则直接使用即可,不要新建了。如果没有,则继续做。

3.1.2 快速新增一个消息。

前面第一步的检测,是没有现成的消息代码可用,那现在要新增一个消息了。当然,您可以直接去应用开发员-->消息 那里直接添加。效果都是一样的,但是我的考虑会有几个困难:

第一点:开发人员必须在Toad 的开发界面和EBS 的定义界面切换,操作麻烦,降低工作效率。 第二点:当日后程序要正式上线的时候,必须要将你新定义的消息都搬到正式环境里面去,那工作量是很大的,因为一般来说,一个程序都有40个以上的消息,一个一个来定义,那真的是痛苦死了!而且,还要中英文环境都复制!那加一倍了。

第三点:有很多消息都是一次性使用的,自己定义消息的名称可能会比较麻烦。要自己搞编号什么的。 所以,我考虑的是,如果可以用消息的API ,在Toad 里面直接添加,那效率会更加快。

而且这里也增加了一套自动命名消息名称的逻辑。利用这个逻辑,可以不用过多的考虑如何编消息名称。为什么?因为很多时候,消息都是被某个程序一次性的使用。 所以,根据这边的客制化开发,快速新增一个消息的过程是:

3.1.2.1 首先要初始化Toad 等工具的环境变量。

这个是必须的。因为Toad 里面默认的是英文的环境,而且没有用户的环境变量。现在要配环境变量和语言的环境,代码: BEGIN

fnd_global.apps_initialize(user_id => 5954, resp_id => 20420,

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息开发教程 6 of 16

resp_appl_id => 1);

EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE=''SIMPLIFIED CHINESE''';

END;

3.1.2.2 情况1:消息的名称自己定义的。

前提条件是:确定这个消息可能会被后面的程序所使用。样例代码:

SELECT XYG_ALD_MESSAGES_PKG.ADD_MESSAGE('XYG'

,REPLACE('调用 *P_OBJECT_NAME 的时候,必要的参数不存在,请检查参数!','*','&')

,'XYG_ALD_PARAMETER_NOTFOUND'

) MESSAGE_NAME

FROM DUAL;

这个函数如果正常运行完毕,消息会自动通过API创建到EBS里面。

3.1.2.3 情况2:消息的名称让系统自动定义的。

前提条件:如果这个消息基本是属于这个程序所使用的,则消息的名称让系统自动命名即可。一般来说

比较建议用这个办法定义!快捷和方便,不需要考虑过多的问题。

命名的规则请看程序的代码的备注。

目前是:消息的模组_产业+模组简称_功能代码(年月)+3位流水码,例如:XYG_ALD_COMM001

代码样例:

SELECT XYG_ALD_MESSAGES_PKG.ADD_MESSAGE('XYG'

,REPLACE('收货地点:( *P_LOCATION_CODE )不存在!错误信息: *P_SQLERRM','*','&')

,''

,'AL'

,'API'

,'COMM'

) MESSAGE_NAME

FROM DUAL;

需要注意的是,上面的函数,如果成功用API创建了消息,则自动返回对应的消息名称。如果有错

误,则会直接提示。

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息开发教程 7 of 16

上面的几个参数都是非常重要的,具体的参数意思:

另外,为了保证以后上线的时候,消息的名称不变(因为消息的名称都已经写到代码里面了,不可以变了),所以,这里如果是自动获取了消息的名称,要记录下来。因为到时候还要上线的。

操作来说还是很简单的,直接将获取的名称写在对应的参数即可。

SELECT XYG_ALD_MESSAGES_PKG.ADD_MESSAGE('XYG'

,REPLACE('收货地点:( *P_LOCATION_CODE )不存在!错误信息: *P_SQLERRM','*','&') ,'XYG_ALD_COMM001'

,'AL'

,'API'

,'COMM'

) MESSAGE_NAME

FROM DUAL;

到时候上线程序的时候,消息可能要逐个上线。

当然,你也可以整合写在一个地方,统一执行也行。用BEGIN..END套起来即可。

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息开发教程 8 of 16

3.1.3 自动处理消息(分配消息的语言环境等)。

最后要做的是,将维护好的中文的语言分配到英文的语言环境里面去,然后逐个修改对应的英文的版

本:

直接执行下面的Pkg即可:

主要是做2个动作:

1. 自动增加语言(EBS启用的语言)。这里要注意的是,自动增加实际上是直接复制一个原始语言的版

本到目标的语言,具体的内容(如果是英文环境的)还是得具体到标准的消息的功能修改。

2. 自动提交处理消息的请求。

代码:

BEGIN

XYG_ALD_MESSAGES_PKG.DEAL_MESSAGE('XYG');

END;

注意:如果是在Form调用,必须要做:提交生成信息的请求,而且,必须要全部退出整个AP,重新

登录Form才有效果。如果是在Pkg用的,直接使用即可。

3.2 多语言消息的使用教程

消息已经定义好了,现在问题来了,如何使用消息?没使用经验的可能还真不知道。。。

不担心,本章节会详细说明。其实也很简单!

3.2.1 如果是PKG等存储过程或者函数的使用方式。

直接给个例子:

SELECT COUNT(*)

INTO L_COUNT

FROM XYG_ALP_POLINE_IMPORT_GTV

WHERE BATCH_ID = P_BATCH_ID

AND PO_NUMBER <> L_PO_NUMBER;

IF L_COUNT <> 0 THEN

X_RETCODE := 2;

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息开发教程 9 of 16

FND_MESSAGE.set_name('XYG', 'XYG_ALAPI_COMM006');

FND_MESSAGE.SET_TOKEN('P_PO_NUMBER',L_PO_NUMBER);

X_ERRBUF := FND_MESSAGE.get;

RETURN;

END IF;

或者(报异常的)例子:

FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;

APP_EXCEPTION.RAISE_EXCEPTION;

调试的例子:

3.2.2 如果是FORM功能使用的方式

如果是Form功能,使用的方式:

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息开发教程 10 of 16

1. 如果只是提示:

FND_MESSAGE.set_name('XYG','XXADIO_050224');

FND_MESSAGE.set_token('MESSAGE',' ADIO HUANG 2005-02-23');

FND_MESSAGE.show;/FND_MESSAGE.error;/FND_MESSAGE.Hint;

2. 如果是属于那种弹出窗口,让用户选择的:

FND_MESSAGE.set_name('XYG','XYG_ALW_JOB_PRINT_TYPE');

l_rsl := FND_MESSAGE.QUESTION('CURRENT','CHOOSE','CANCEL',1,2,3);

If l_rsl = 1 Then

https://www.wendangku.net/doc/4113612554.html,mit;

ElsIf l_rsl = 2 Then

Go_Block('WIP_OUTS_REQUISITION');

Go_Record(l_cur_record);

End If;

值得注意的是:经过测试,FND_MESSAGE.QUESTION('CURRENT','CHOOSE','CANCEL',1,2,3);里面的几个名称:'CURRENT','CHOOSE','CANCEL'都是要定义的,也必须定义在FND的应用下面!否则运行没多语言定义的效果。

XXXXXX Document Template Oracle EBS 技术开发之

客户化EBS 多语言消息开发教程

11 of 16

定义好之后,必须要执行:BEGIN XYG_ALD_MESSAGES_PKG .DEAL_MESSAGE ('FND'); END; 随便做的一个运行代码和执行的样例:

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息处理Pkg详解 12 of 16

4 客户化EBS多语言消息处理PKG详解

封装在这个包XYG_ALD_MESSAGES_PKG的处理的功能是比较实用的。

本章节主要是这个包的处理的代码。

4.1 基本对象的定义

因为这个包有一个检索消息的相似度的函数,而这个函数是返回一个Type为表格的。所以先要定义对

应的Type:

---相似度的。

CREATE OR REPLACE TYPE XYG_ALD_MESSAGE_SIM_OBJ AS OBJECT(

SOURCE_MESSAGE_TEXT VARCHAR2(2000)

,KEY_WORD VARCHAR2(2000)

,LANGUAGE_CODE VARCHAR2(4BYTE)

,APP_SHORT_NAME VARCHAR2(50BYTE)

,MESSAGE_NAME VARCHAR2(240BYTE)

,MESSAGE_TEXT VARCHAR2(2000)

,similarity NUMBER);

CREATE OR REPLACE TYPE XYG_ALD_MESSAGE_SIM_TAB AS TABLE OF

XYG_ALD_MESSAGE_SIM_OBJ;

4.2 Pkg的处理逻辑的代码

不多解析了,直接上代码最直接:

CREATE OR REPLACE PACKAGE APPS.XYG_ALD_MESSAGES_PKG

AS

/******************************************************************************

NAME: XYG_ALD_MESSAGES_PKG

PURPOSE: PKG For XYG_ALD_消息处理

REVISIONS:

Ver Date Author Description

--------- ---------- --------------- ------------------------------------

1.0 2014/12/22 Sam.T 1.新增

******************************************************************************/ ---全局参数

G_USER_ID NUMBER:=NVL(FND_PROFILE.VALUE('USER_ID'),-1);--

FND_https://www.wendangku.net/doc/4113612554.html,ER_ID;

--User ID, Sysadmin here

G_LOGIN_ID NUMBER:=NVL(FND_PROFILE.VALUE('login_ID'),-1);--

FND_GLOBAL.LOGIN_ID;

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息处理Pkg详解 13 of 16

---调试的级别

G_LEVEL0 CONSTANT NUMBER:=0;

G_LEVEL1 CONSTANT NUMBER:=1;

G_LEVEL2 CONSTANT NUMBER:=2;

G_LEVEL3 CONSTANT NUMBER:=3;

---调试方式

---是否为调试模式

/*

G_DEBUG_LEVEL:调试的级别

0:不启动调试

1:调试程序主要流程,不进入任何的循环

2:第一层主循环(游标的每批处理)的信息

3:第二层循环,进入到每一行的处理

*/

G_DEBUG_LEVEL NUMBER:= G_LEVEL0;

G_DEBUG_TYPE VARCHAR2(240):='DBMS_OUTPUT';---DBMS_OUTPUT直接输出

/FILE_OUTPUT文档输出/REQUEST_OUTPUT请求日志输出

type VARCHAR2_TBL_TYPE_1 is table of varchar2(1)index by binary_integer;

type VARCHAR2_TBL_TYPE_30 is table of varchar2(30)index by binary_integer;

type VARCHAR2_TBL_TYPE_50 is table of varchar2(50)index by binary_integer;

type VARCHAR2_TBL_TYPE_240 is table of varchar2(240)index by binary_integer;

type VARCHAR2_TBL_TYPE_2000 is table of varchar2(2000CHAR)index by binary_integer;

type NUMBER_TBL_TYPE is table of number index by binary_integer;

type DATE_TBL_TYPE is table of DATE index by binary_integer;

-----------------------------

---自动获取消息的名称

---命名规则:消息的模组_产业+模组简称_功能代码(年月)+3位流水码,例如:XYG_ALD_COMM001

---P_APP_SHORT_NAME:消息的注册应用

---P_INDUSTRY_CODE:消息的应用产业。可以看Lookup代码:XYG_INDUSTRY_CODE

---P_MOUDLE_CODE:消息的应用子模块。可以看Lookup代码:XYG_MOUDLE_CODE

---P_FUNCTION_CODE:可选参数。如果判断是一次性用的东西,直接输入对应的代码即可。

---------例如:付款通知单的代码是:PAYMNOTE,则这里P_FUNCTION_CODE='PAYMNOTE'

---------如果不输入,或者是公用的,则默认=TO_CHAR(SYSDATE,'YYMM')

---因为很多时候消息都是一次性用的,所以自动编码就很重要了。

--- SELECT XYG_ALD_MESSAGES_PKG.GET_MESSAGE_NAME('XYG','AL','API','COMM') FROM DUAL -----------------------------

FUNCTION GET_MESSAGE_NAME(P_APP_SHORT_NAME IN VARCHAR2

,P_INDUSTRY_CODE IN VARCHAR2

,P_MOUDLE_CODE IN VARCHAR2

,P_FUNCTION_CODE IN VARCHAR2DEFAULT NULL

,P_RAISE IN NUMBER DEFAULT

XYG_PUB_CONST_PKG.C_TRUE

)

RETURN VARCHAR2;

-----------------------------

---导入消息表格

---如果在Toad调用,则必须要求先调用fnd_global.apps_initialize初始化!

---注意:这个是客户化用的简化的版本,很多值都直接Default了。

---如果要完整的,请用:FND_NEW_MESSAGES_PKG.LOAD_ROW

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息处理Pkg详解 14 of 16

-----------------------------

PROCEDURE ADD_MESSAGE(X_ERRBUF OUT VARCHAR2--返回日志信息

,X_RETCODE OUT NUMBER--0:成功 1:警告 2:错误

,P_APP_SHORT_NAME IN VARCHAR2

,P_MESSAGE_NAME IN VARCHAR2

,P_MESSAGE_TEXT IN VARCHAR2

);

PROCEDURE ADD_MESSAGE(P_APP_SHORT_NAME IN VARCHAR2

,P_MESSAGE_NAME IN VARCHAR2

,P_MESSAGE_TEXT IN VARCHAR2

);

---异常的话返回-1..否则返回的是MESSAGE_NAME

FUNCTION ADD_MESSAGE(P_APP_SHORT_NAME IN VARCHAR2

,P_MESSAGE_TEXT IN VARCHAR2

,P_MESSAGE_NAME IN VARCHAR2DEFAULT NULL

,P_INDUSTRY_CODE IN VARCHAR2DEFAULT NULL

,P_MOUDLE_CODE IN VARCHAR2DEFAULT NULL

,P_FUNCTION_CODE IN VARCHAR2DEFAULT NULL

,P_RAISE IN NUMBER DEFAULT XYG_PUB_CONST_PKG.C_TRUE

)

RETURN VARCHAR2;

---注意都是增加在同一个应用。方便~P_APPLICATION_SHORT_NAME

PROCEDURE BATCH_ADD_MESSAGE(P_APP_SHORT_NAME IN VARCHAR2

,P_MESSAGE_NAME_TBL IN VARCHAR2_TBL_TYPE_30

,P_MESSAGE_TEXT_TBL IN VARCHAR2_TBL_TYPE_2000

);

-----------------------------

---检查消息,输出相似度一定的MESSAGE_NAME的表格类型

----P_KEY_WORD:主要是为过滤一定的数据用。例如:%业务实体%,多个关键字用百分号链接。例如:应用%无效

---主要是检查相似度(相似度:degree of similarity)一定的消息。让消息可以公用

---调用的时候必须要注意语言!这里默认中文的语言!

-----------------------------

FUNCTION CHECK_MESSAGE(P_MESSAGE_TEXT IN VARCHAR2

,P_KEY_WORD IN VARCHAR2

,P_DEGREE_OF_SIM IN NUMBER DEFAULT80

,P_LANGUAGE_CODE IN VARCHAR2DEFAULT'ZHS'

,P_RAISE IN NUMBER DEFAULT XYG_PUB_CONST_PKG.C_TRUE) RETURN XYG_ALD_MESSAGE_SIM_TAB

PIPELINED;

---批量检查信息是否有存在。

PROCEDURE BATCH_CHECK_MESSAGE(P_MESSAGE_TEXT_TBL IN VARCHAR2_TBL_TYPE_2000

,P_KEY_WORD_TBL IN VARCHAR2_TBL_TYPE_2000

,P_DEGREE_OF_SIM IN NUMBER DEFAULT80

,P_LANGUAGE_CODE IN VARCHAR2DEFAULT'ZHS'

);

-----------------------------

---自动处理导入消息表格

---注意:这里处理的是所有的消息,所以在一批消息行增加完毕之后,再调用这个Proc自动处理即可。

---主要是做2个动作:1 自动增加语言 2 自动提交处理的请求。

-----------------------------

XXXXXX Document Template

Oracle EBS技术开发之客户化EBS多语言消息处理Pkg详解 15 of 16

PROCEDURE DEAL_MESSAGE(P_APP_SHORT_NAME IN VARCHAR2); END;

XXXXXX Document Template

Oracle EBS技术开发之未结和已结的问题 16 of 16

5 未结和已结的问题5.1 未解决的问题

5.2 已结问题

相关文档