http://www.erp100.com/html/43/2743-2432.html
定义Message
在系统Message Dictionary定义Message的优点在于:
1一次定义,多次引用;
2可定义参数,避免硬编码;
3可很好解决多语言环境下消息文本的转译问题。
下图定义了一个名为DEMVC_SHIP_BEFORE_ORDER的Message。
Oracle建议Message Name采用大写字母加下划线的命名方式不要超过30个字符,Application就是引用Message的应用,Language即语言环境,输入Number值在显示的时候会添加APP-前缀,为空的话无前缀也会省略,Current Message Text就是要显示的文本了,带’&’的则说明该Message带参数,图中的Message就有&ORDERDATE和&SHIPDATE两个参数。可定义Name相同Language不同的消息,用作多语言环境下的文本转译。
定义Message信息时除了语法、语义上的注意事项外,还需遵循一些编码规范。比如说:定义的参数最好有特定的含义并且易于区分,尽量不要将一些仅表达语义的短语作为参数传入(因为Oracle在翻译Message的时候默认不会翻译参数,相当于这些参数都是硬编码的)。
显示消息
显示消息可以调用消息字典中定义的消息,也可以显示服务器上出错信息和消息堆栈中的信息,还可以显示程序代码生成的消息文本。
1调用消息字典消息
步骤如下:
(1)FND_MESSAGE.SET_NAME设置MESSAGE_NAME和Application Short Name;
(2)2 FND_MESSAGE.SET_TOKEN设置MESSAGE参数,注意必要时对参数进行格式转换。
Eg:
IF (EVENT = 'WHEN-VALIDATE-ITEM') THEN
IF :ORDERS.DATE_SHIPPED IS NOT NULL THEN
IF :ORDERS.DATE_SHIPPED < :ORDERS.DATE_ORDERED THEN
FND_MESSAGE.SET_NAME('DEM','DEMVC_SHIP_BEFORE_ORDER');
FND_MESSAGE.SET_TOKEN('ORDERDATE',APP_DATE.DATE_TO_CHARDATE
(:ORDERS.DATE_ORDERED),FALSE);
FND_MESSAGE.SET_TOKEN('SHIPDATE',APP_DATE.DATE_TO_CHARDATE
(:ORDERS.DATE_SHIPPED),FALSE);
FND_MESSAGE.ERROR;
END IF;
END IF;
END IF;
2 显示服务器上出错信息和消息堆栈中的信息
Eg1:
FND_MESSAGE.SET_NAME (’FND’,’FLEX_COMPILE_ERROR’);
FND_MESSAGE.SET_TOKEN (’PROCEDURE’,’My Procedure’);
APP_EXCEPTION.RAISE_EXCEPTION;
/* Retrieve an expected message from the server side,
then show it to the user */
FND_MESSAGE.RETRIEVE;
FND_MESSAGE.ERROR;
/* Then either raise FORM_TRIGGER_FAILURE, or exit
routine*/
Eg2:
/* Get translated string from message file */
declare
msg varchar2(2000);
begin
FND_MESSAGE.SET_NAME (’FND’,’A_2000_BYTE_MSG’);
msg := FND_MESSAGE.GET;
end;
/* We now have a translated value in the msg variable
for forms built–in or other function */
3显示程序代码生成的消息(这也是我们经常用到的)。
Example 1
FND_MESSAGE.SET_STRING (’系统发生了一个严重的错误’);
FND_MESSAGE.ERROR;
Example 2
IF (FND_MESSAGE.WARN) THEN
WARNNING_FLAG :=‘Y’;
ELSE
WARNNING_FLAG :=‘N’;
END IF ;
Example 3
FND_MESSAGE.SET_STRING (’Hello World’);
FND_MESSAGE.SHOW;
Example 4
FND_MESSAGE.SET_STRING (’我要显示在状态栏上’);
FND_MESSAGE.HINT;
FND_MESSAGE.ERASE; --清空Form状态栏信息
Example 5
FND_MESSAGE.SET_STRING('确认后记录将不可修改,是否确认?');
IF FND_MESSAGE.QUESTION('是',null,'否',1,3,'question') = 3 THEN
:HEADER.INV_CONFIRM_FLAG := 'N';
ELSE
DO_KEY('commit_form');
END IF ;
Example 6
FND_MESSAGE.DEBUG ('这是一条调试信息');