Form Builder开发中TEMPLATE Form
原文见于Applications Developer Guide
(版权声明,本人原创或者翻译的文章如需转载,请于本人联系,违者必究)
这一章主要用于介绍起始开发你的应用程序forms的TEMPLETE form的内容。
l TEMPLATE Form 总览
l TEMPLATE Form里面的库
l TEMPLATE Form里面特别的触发器
TEMPLATE Form总览
TEMPLATE Form 是所有进行新form开发所要求的起始点。开始开发一个新的form,要拷贝位于$AU_TOP/forms/US(或者你的语言和平台相应的)的TEMPLATE Form,放到一个本地目录并改成合适的名称。
TEMPLATE Form 包含以下内容:
l 对位于APPSTANDform里的对象组(STANDARD_PC_AND_VA,STANDARD_TOOLBAR, and STANDARD_CALENDAR)的平台无关的引用。
l 几个平台无关附加库(包括FNDSQF, APPCORE, and APPDAYPK)。
l 几个带有必要代码的form级别的触发器。
l 包含包头和包体的程序单元包APP_CUSTOM,里面包含了窗口打开和关闭的默认行为。你一般要为你开发的form修改这里的代码。
l 应用程序调色板,包含引用可视属性(“canvas”和”button”)所必需的两种颜色,”纯色”(比如,黑色,白色,蓝色和红色),和各种以红,蓝和绿三色为内容命名的其它颜色(比如”r40g70b100”)。
l 很多用于支持日历,工具栏,alternative regions和菜单的引用对象(从对象组)。这些对象包括LOVs, blocks, parameters,属性类(property class)等等。
l TEMPLATE form包含用于展示典型的item和布局的示例对象。这些主要是作为示例提供的;要完全从你的form里移除,需要删除一些对象。
- Blocks: BLOCKNAME,DETAILBLOCK
- Window:BLOCKNAME
- Cavas-view:BLOCKNAME
TEMPLATE Form中的库
TEMPLATE Form 包含几个平台无关的附加库。一些是直接附加到TEMPLATE上的(FNDSQF, APPCORE, and APPDAYPK),而其他的都是附加到这三个库上面去的。但是,在Oracle Forms中,不同类型的附加库是没有区别的。如果其它库后来附加到这些库上面去,额外的库也会显示直接附加到TEMPLATE上。
下面的这些就是在11i中全部附加到TEMPLATE上的库。你也可能看到额外的库,特别是你的站点在多个国家使用Oracle Applications,或者你的站点使用Oracle Industry Applications.
注意:除了CUSTOM库,你一定不要修改任何Oracle Applications库,否则你可能严重损坏你的Oracle Applications产品。
APPCORE
APPCORE包含所有form需要的用来支持菜单,工具栏和必要的标准行为的包和过程。除此之外,它还包含了用于达到指定运行时行为的包,要依照the Oracle Applications User Interface Standards forForms–Based Products,比如字段启用的方式,特定类型窗口的行为,和动态的’特殊’菜单。最后,它还包含了各种其它工具来进行异常处理,消息级别等等。一些APPCORE事件程序调用位于VERT,GLOBE和CUSTOM库(按这个顺序)里面的程序。
APPCORE里面的过程和方法一般以”APP”作为名称开头。
APPDAYPK
APPDAYPK包含控制Oracle Applications 日历功能的包。
FNDSQF
FNDSQF包含消息字典,弹性域,profiles和concurrent processing相关的包和过程。它还有各种其它工具类用来导航,多币别,WHO字典等等的处理。
FNDSQF里面的过程和方法通常使用”FND”开头。
CUSTOM
CUSTOM库允许不改变Oracle Application代码来扩展Oracle Application forms。你可以使用CUSTOM库进行自定义,比如”放大”(比如移动到另一个form或者查询出指定的记录),强制业务规则(比如,供应商的名字必须大写),以及禁止一些不想在你站点上使用的字段。
你可以在CUSTOM库里面提供的过程壳里写代码,所有的逻辑都必须建立你想运行的form和block作为分支。Oracle Applications 发送实际给CUSTOM库。你的自定义代码将基于这些事件起效。
GLOBE
GLOBE库允许Oracle Applications开发人员包含全球或者区域功能到Oracle Application forms中去,但不需要修改Oracle Application基本form. Oracle Applications发送事件到GLOBE库,区域代码基于这些事件生效。GLOBE库调用位于JA,JE和JL库里面的程序。
VERT
VERT库允许Oracle Applications开发人员包含垂直行业功能(汽车,包装消费品,资源和其它行业)到Oracle Application forms中去,但不需要修改Oracle Application基本form. Oracle Applications发送事件到VERT库,垂直行业代码基于这些事件生效。VERT库调用位于其它库里面的程序。
JA
JA库包含用于亚洲/太平洋区域的特定代码,并会被GLOBE库所调用。
JE
JE库包含用于EMEA(欧洲/中东/非洲)区域的特定代码,并会被GLOBE库所调用。
JL
JA库包含用于拉丁美洲区域的特定代码,并会被GLOBE库所调用。
TEMPLATE form中的特殊触发器
TEMPLATE form包含几个必须存在的form级别的触发器,以便其它的方法可以正常执行。我们将在下面讨论关于如何安全修改这些触发器的特殊规则。
注意:在任何情况下都不能删除其中的任一触发器。
这些触发器中的文本必须存在于这些触发器中。尽管如此,开发人员通常需要在这些代码前后增加代码。这些触发器包括:
标准的Forms触发器:
- KEY-CLRFRM
- KEY-COMMIT
- KEY-DUPREC
- KEY-EDIT
- KEY-EXIT
- KEY-HELP
- KEY-LISTVAL
- KEY-MENU
- ON-ERROR
- POST-FORM
- PRE-FORM
- WHEN-FORM-NAVIGATE(reference)
- WHEN-NEW-BLOCK-INSTANCE
- WHEN-NEW-FORM-INSTANCE
- WHEN-NEW-ITEM-INSTANCE
- WHEN-NEW-RECORD-INSTANCE
- WHEN-WINDOW-CLOSED
- WHEN-WINDOW-RESIZED
用户命名的触发器:
- ACCEPT
- CLOSE_THIS_WINDOW(reference)
- CLOSE_WINDOW
- EXPORT(reference)
- FOLDER_ACTION
- FOLDER_RETURN_ACTION
- LASTRECORD(reference)
- MENU_TO_APPCORE(reference)
- QUERY_FIND
- STANDARD_ATTACHMENTS(reference)
- ZOOM(reference)
注意:你一定不要修改引用到form中的触发器,即使在OracleForms Developer 6i中从技术上来说你可以那么做。修改引用的触发器可能导致你的form上出现问题,或者可能引起将来升级上的问题。
经常需要修改的触发器
ACCETP
APP_STAND.EVENT(“ACCEPT”);
这个触发器处理“Action->保存和继续”的菜单选择和相应工具按钮的调用。它保存记录并移动到第一个导航block的下一条记录。
替换这个触发器里的代码,或者创建block级别的触发器并设置运行方式为覆盖。
FOLDER_RETURN_ACTION
Null;
这个触发器运行特定folder事件的自定义。
使用具体的代码替代上面的文字来处理folder动作。
注意:Oracle 公司不对这个触发器的修改进行技术支持,除非Oracle应用内部使用了它。
KEY–DUPREC
APP_STANDARD.EVENT(’KEY–DUPREC’);
这个触发器禁止了Oracle Forms上默认的复制记录的功能。
以便合适的处理”编辑->复制上一条记录”的菜单选择,需要在block级别上覆盖这个触发器(执行方式是’覆盖’)。这个应该复制一条记录,然后根据需要验证和清除字段。
KEY–CLRFRM
APP_STANDARD.EVENT(’KEY–CLRFRM’);
这个触发器在尝试清空form的时候对当前记录进行验证。
可以在已提供的文本后面添加任意代码。典型的,如果在你的form里有alternative regions的话,你可以加对 GO_BLOCK的调用,在清空form操作之后,GO_BLCOK调用将重新填充你的区域。
KEY–MENU
APP_STANDARD.EVENT(’KEY–MENU’);
这个触发器禁止了OracleForms的Block菜单命令。
在一个特定的block上通过键盘启用Alternative Regions上的操作,需要在block级别上覆盖KEY-MENU触发器.这个触发器将打开一个和Alternative Region control poplist拥有一样选择的触发器。
KEY–LISTVAL
APP_STANDARD.EVENT(’KEY–LISTVAL’);
这个触发器执行弹性域的操作或者LOV的调用。
创建block或者item级别的这个触发器来覆盖form级别的以便在字段上使用日历或动态调用弹性域。
ON–ERROR
APP_STANDARD.EVENT(’ON–ERROR’);
这个触发器处理所有的错误,不论是服务端的还是客户端的,使用消息字典调用。
如果要处理特定的错误,需要在调用APP_STANDARD之前检查这个错误。
declare
original_mess varchar2(80);
begin
IF MESSAGE_CODE = <your message number>THEN
original_mess := MESSAGE_TYPE||’–’||
to_char(MESSAGE_CODE)||’: ’||MESSAGE_TEXT;
––– your code handling the error goes here
message(original_mess);
ELSE
APP_STANDARD.EVENT(’ON_ERROR’);
END IF;
End;
POST–FORM
APP_STANDARD.EVENT(’POST–FORM’);
这个触发器是保留用于将来使用的。
可以在提供的代码前加任何代码。
PRE–FORM
FND_STANDARD.FORM_INFO(’$Revision:<Number>$’,
’<Form Name>’,
’<Application Shortname>’,
’$Date: <YY/MM/DD HH24:MI:SS> $’,
’$Author: <developer name> $’);
APP_STANDARD.EVENT(’PRE–FORM’);
APP_WINDOW.SET_WINDOW_POSITION(’BLOCKNAME’,
’FIRST_WINDOW’);
这个触发器初始化Oracle Applications的内部值和菜单。你这里输入的值可以通过Oracle Applications菜单选择”帮助->关于Oracle Applications”来参看。
你必须修改应用程序缩写名。这个应用程序缩写名控制着访问哪一个应用程序的在线帮助当用户按工具栏上的帮助按钮。如果你保留应用缩写名为FND,你的用户将看不到任何帮助,因为Oracle Appliations不能构造一个有效的目标帮助文档。
Form名称是用户的form名称(form的标题).这个只是用来参考用的,别的任何地方都不会使用它。
Oracle公司使用的源代码管理系统自动把这个值更新成以’$’开头的值。如果你不使用哪个源代码管理系统,你可以而且必须使用你自己的开发信息来修改这些值。
你也必须修改对APP_WINDOW的调用以便使用你自己的block名称(你的第一个block)来替代BLOCKNAME.不要修改字符串FIRST_WINDOW。
QUERY_FIND
APP_STANDARD.EVENT(’QUERY_FIND’);
这个触发器发出一个默认的消息表明查找功能是不可用的。
当你在你的form里新建一个查找窗口的或者一个行的LOV的时候,需要替代这个触发器里代码,或者是在block级别覆盖这个触发器。
WHEN–NEW–FORM–INSTANCE
FDRCSID(’$Header:... $’);
APP_STANDARD.EVENT(’WHEN–NEW–FORM–INSTANCE’);
––app_folder.define_folder_block(’template test’,
’folder_block’, ’prompt_block’, ’stacked_canvas’,
’window’, ’disabled functions’);
––app_folder.event(’VERIFY’);
这个触发器里APP_STANDARD.EVENT的调用支持在只查询模式被FND_FUNCTION.EXECUTE所调用。FDRCSID的调用支持Oracle Applications源代码管理系统。APP_FOLDER的调用仅供Oracle Applications内部使用。自定义的forms不需要调用FDRCSID和APP_FOLDER,但是把它留在触发器里也没有任何害处。
可以在已有文本之前加任意其它代码。
注意:Oracle公司不对在这个触发器里对APP_FOLDER调用所做的修改进行技术支持,除非是Oracle Applications内部使用。
WHEN–NEW–RECORD–INSTANCE
APP_STANDARD.EVENT(’WHEN–NEW–RECORD–INSTANCE’);
这个触发器管理Oracle Applications菜单和工具栏的状态。
根据需要创建block级别的触发器,并设置执行方式为”之前”.
WHEN–NEW–BLOCK–INSTANCE
APP_STANDARD.EVENT(’WHEN–NEW–BLOCK–INSTANCE’);
这个触发器管理Oracle Applications菜单和工具栏的状态。
根据需要创建block级别的触发器,并设置执行方式为”之前”.
WHEN–NEW–ITEM–INSTANCE
APP_STANDARD.EVENT(’WHEN–NEW–ITEM–INSTANCE’);
这个触发器管理Oracle Applications菜单和工具栏的状态。
如果你加了对flexfields方法的调用,你应该把它加到对APP_STANDARD.EVENT调用之前。通常来说,你不应该在这个触发器里加入任何其它代码,比如可以影响form中每个item的代码,因为那将影响form的性能。
根据需要创建block级别和item级别的触发器,设置执行方式为”之前”。
不能修改的触发器
Oracle Applications不支持对下面这些触发器任意形式的修改。
CLOSE_THIS_WINDOW
当选择菜单Action->关闭窗口的时候,这个触发器调用APP_CUSTOM.CLOSE_WINDOW。
CLOSE_WINDOW
APP_CUSTOM.CLOSE_WINDOW(:SYSTEM.EVENT_WINDOW);
这个触发器处理所有窗口关闭事件.处理窗口关闭事件的代码必须放在APP_CUSTOM.CLOSE_WINDOW包里。
EXPORT
app_standard.event(’EXPORT’);
这个触发器处理“Action->Export”菜单选择的调用。
FOLDER_ACTION
app_folder.event(:global.folder_action);
这个触发器处理Folder菜单上的所有入口的调用。
KEY–COMMIT
APP_STANDARD.EVENT(’KEY–COMMIT’);
这个处理器通常处理commits或者调用forms.
注意:Oracle公司强烈建议不要使用调用form。这个程序仅是为了向前兼容而已。
KEY–EDIT
APP_STANDARD.EVENT(’KEY–EDIT’);
这个触发器进行弹性域的操作,或者日历或者编辑器的调用。
KEY–EXIT
APP_STANDARD.EVENT(’KEY–EXIT’);
这个触发器处理关闭事件,并离开输入-查询模式。
KEY–HELP
APP_STANDARD.EVENT(’KEY–HELP’);
这个触发器调用窗口帮助系统。
LASTRECORD
APP_STANDARD.EVENT(’LASTRECORD’);
这个触发器处理菜单事件Go->Last Record。
MENU_TO_APPCORE
APP_STANDARD.EVENT(:global.menu_to_appcore);
这个触发器支持Special菜单。
STANDARD_ATTACHMENTS
atchmt_api.invoke;
这个触发器处理附件菜单入口或者相应工具栏按钮的调用。
WHEN–WINDOW–CLOSED
execute_trigger(’CLOSE_WINDOW’);
这个触发器集中Oracle Applications或者Window Manager菜单窗口关闭事件。
WHEN–FORM–NAVIGATE
你不可以修改这个引用的触发器。它支持特定标准行为,比如当导航到最小化的form的时候,恢复到正常大小。
为使用这个form事件,需要为全局变量GLOBAL.WHEN_FORM_NAVIGATE设置用户定义触发器的名字。通常需要在调用GO_FORM之前就要立刻为这个全局变量设置。
ZOOM
appcore_custom.event(’ZOOM’);
这个触发器处理’Action->Zoom’菜单选择或者相应工具栏按钮的调用。