|
本节介绍如何在窗体中使用Message。使用Message应该是挺简单的,主要是两个步骤:设置Message和显示Message。
1. 设置Message
我觉得按照是否需要在Message Dictionary定义Message可以分为两种。下图显示的是在Message窗体中定义了一个名为DEMVC_SHIP_BEFORE_ORDER的Message。
Oracle建议Name采用大写字母加下划线的命名方式,Application就是需要用到该Message的Application,Language当前语言(应该与后面的翻译有关),Number在显示的时候有时会用到(前面还会带前缀,不填的话就不出现,前缀也会省略),Current Message Text就是要显示的文本了,带’&’的则说明该Message带参数,图中的Message就有&ORDERDATE和&SHIPDATE两个参数。
定义Message信息时除了语法、语义上的注意事项外,还需遵循一些编码规范。比如说:定义的参数最好有特定的含义并且易于区分,尽量不要将一些仅表达语义的短语作为参数传入(因为Oracle在翻译Message的时候默认不会翻译参数,相当于这些参数都是硬编码的)。
在Message Dictionary定义完Message后,在窗体中显示Message之前,还需要在窗体中定义Message。步骤为1FND_MESSAGE.SET_NAME设置MESSAGE_NAME和Application Short Name;2 FND_MESSAGE.SET_TOKEN设置MESSAGE参数,注意必要时对参数进行格式转换。
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;
有些Message并不需要先在Message Dictionary中定义,只需在窗体中定义后就可直接调用,如:
Example 1
/* Set up a specific string (from a variable) and show it */
FND_MESSAGE.SET_STRING (sql_error_message);
FND_MESSAGE.ERROR;
Example 2
/* Set up a specific string and show it */
FND_MESSAGE.SET_STRING (’Hello World’);
FND_MESSAGE.SHOW;
下例展示了FND_MESSAGE.RETRIEVE函数的用法。我的理解是必须在服务器端执行APP_EXCEPTION.RAISE_EXCEPTION过程后才RETRIEVE到信息。
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*/
再来看下fnd_message.get的用法,我感觉有点像赋值。
fnd_message.set_name(appl_short_name,message_name);
fnd_message.get(window_title);
set_window_property(’WINDOW_NAME’, TITLE,
window_title); |
|