1、文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。Oracle EBS Form Trigger 学习大全打开,关闭,创建,更新记录的 trigger 次序PRE-在进入一个 form,或是导航到一个新的 block 时触发,PRE- 系列的触发器一般是在WHEN-NEW-INSTANCE 系列之前,它们如果失败了的话,就不能成功导航到下一个对象了,只能留在当前的位置。在这些触发器里可以设置一些判断条件来限制是否可以导航到新的位置。WHEN-NEW-INSTANCE这一类的 trigger 都是当鼠标光标每次落到一个新的 block,record ,item 上时触发的,而且就算失败
2、了,也不会发生什么错误。但是 when-new-form-instance,只有当 form启动时,光标导航到第一个导航块的第一个导航 item 时触发,如果一个应用有多个form,当光标在各个 form 之间转换时,并不会触发它。POST-TEXT-ITEM 和 WHEN-VALIDATE-ITEMPost-text-item 的触发点:当输入的光标从一个 Text-Item 转到其它 item,可以用它来改变 item 的值,而 when-Validate-item 虽然也是在离开前触发,但是作用不同,Post-Text-Item 本身是没有验证的,when-Validate-item 可
3、以用来补充一些验证(除了 form 本身的验证),但是当 form 验证成功以后,会把 item 标志为valid,而不会再去验证了,如果这时我们再去修改它的值,那么就有可能会把无效的值导入到数据库。在创建和更新一条记录时,先触发 when-Validate-item,再触发 Post-Text-Item,然后是 when-Validate-record。POST-系列的都是离开当前的 block,record,item 时触发的文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。WHEN-WINDOW-ACTIVATED做原材料属性修改平台时,第一次使用这个触发器,用来从另一个 wi
4、ndow 返回时,刷新当前 window,代码写在了这个触发器里。使用之前用 fnd_message.debug 试验了一下,打开窗口后不停的弹出 message。只要这个窗口在活动期间就会不停的执行这个触发起里面的代码,所以执行的代码应该用 if 条件限制一下。Form 的 Trigger 的优先级是从 item,到 block,到 form 级别,如果另外设置Execution Hierarch 属性(override,before,after),则按照设置后的顺序执行。如果是 override 的话,则执行完这个级别的触发器,就不往上执行了,before 就是执行完这个级别的触发器后,如
5、果上一个级别也有这个触发器的话,继续去执行,after 就是先去执行上一个级别的触发器,然后再回来执行。感觉触发器比较难理解的还是每一种触发器触发的时间,和在开发中怎么使用。目前了解的就是 pre-,when-new-instance,when-validate,post-query 和几个 on-触发器 验证代码写在 WHEN-VALIDATE-RECORD 和 PRE-INSERT 的不同验证代码写在 WHEN-VALIDATE-RECORD 和 PRE-INSERT 的不同1、写在 WHEN-VALIDATE-RECORD,可以及时地提示错误信息,如果验证时要和后台数据库关联的话,那么要
6、写在 PRE-INSERT,因为 PRE-INSERT,ON-INSERT 都是一条一条记录执行的,这样批量录入时,每一条记录的验证都可以取到最新的数据库记录。 2、 批量录入时,有一条的 PRE-INSERT 不成功,则所有记录都不能保存成功 Post-Query 和 When-New-Record-Instance 关系Post-Query 和 When-New-Record-Instance假定数据库中有 100 条记录,块设置显示行数为 10,那么当光标在显示出来的记录间移文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。动时,只触发 When-New-Record-Inst
7、ance,不触发 Post-Query。当光标移到第十一条记录时,触发 Post-Query 不可见 item 的 when-validate-item 使用问题:如果一个 item 是不可见的,那么改变它的值,还会触发 when-validate-item 吗?结果:会触发,但不是在改变它的值后触发,而是在光标移到另一个 block 时。关闭窗口时也触发了。测试:设 block1 的 item1 为不可见,在 item2 的 when-validate-item 给 tem1 赋值,运行时,改变 item2 的值后,在 block1 的各 item 间移动光标都没有触发 item1 的whe
8、n-validate-item,直到光标离开这个 block,或关闭窗口时才触发。 ACCEPT Trigger 讲解ACCEPT APP_STANDARD.EVENT(ACCEPT); 这个触发器处理菜单或工具条上调用Save and Proceed (保存并继续)动作。它执行保存,并移动到指定当作第一个导航块的块上。 替换这个触发器中的代码,或创建块级触发器并把执行类型指定为Override FOLDER_RETURN_ACTIONFOLDER_RETURN_ACTION这个触发器允许指定客户华的文件夹事件用需要的处理文件夹动作的代码替换 文档密级:内部公开此资料属深南电路所有,未经许可,
9、不得扩散。KEY_DUPRECAPP_STANDARD.EVENT(KEY-DUPREC);这个触发器禁用了 Oracle 表单默认的重复记录的功能 KEY-CLRFRMKEY-CLRFRMAPP_STANDARD.EVENT(KEY-CLRFRM);这个触发器在试图清空 form 前验证记录在原来的代码后添加附加的代码,通常你你应添加 GO_BLOCK 如果 form 中存在多个的区域,使用 GO_BLOCK 在调用清空 from 操作后重新填充控制菜单 KEY_MENUKEY_MENUAPP_STANDARD.EVENT(KEY-MENU);这个触发器禁用了 Oracle froms 的
10、Block Menu 命令为了启用从特定的块对替代的块通过键盘操作,那么编写块级 KEY_MENU 并且设定执行类型为Override 这个触发器会打开一个与弹出式菜单相同的 LOV KEY_LISTVALKEY_LISTVALAPP_STANDARD.EVENT(KEY-LISTVAL);文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。这个触发器执行弹性域操作或引用 LOV创建块或项级触发器并设置执行类型为Override,可以使用日历或动态执行弹性域 ON-ERRORON-ERRORAPP_STANDARD.EVENT(ON-ERROR);这个触发器处理服务器或客户端的所有的错
11、误,使用消息字典调用。为了捕获处理指定的错误,在调用 APP_STANDARD 前检查指定的错误 declareoriginal_mess varchar2(80);beginIF MESSAGE_CODE = THENoriginal_mess := MESSAGE_TYPE|to_char(MESSAGE_CODE)|: |MESSAGE_TEXT; your code handling the error goes heremessage(original_mess);ELSEAPP_STANDARD.EVENT(ON_ERROR);END IFend;文档密级:内部公开此资料属深南电路
12、所有,未经许可,不得扩散。POST-FORMPOST-FORM APP_STANDARD.EVENT(POST-FORM);这个触发器是预留为以后使用添加附加的代码在原有代码之后。 PRE-FORMPRE-FORMFND_STANDARD.FORM_INFO($Revision: $,$Date: $,$Author: $);APP_STANDARD.EVENT(PREFORM);APP_WINDOW.SET_WINDOW_POSITION(BLOCKNAME,FIRST_WINDOW);这个触发器初始化 Oracle 应用的内部值和菜单。在这里输入的值将在 Oracle 应用程序菜单Help
13、 About Oracle Applications中看到。你必须编辑应用程序的简称,应用的简称控制当用户选择help按钮后哪个应用的在线帮助文档将被调用。如果你将应用的简称设置为 FND,你的用户将会看不到任何帮助因为Oracle 应用程序将不能建立可用的帮助目标。Form 的名称是用户 form 名称( form 标题)。文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。Oracle 公司使用源控制系统,它可以自动更新以“$”开头的值,如果你不使用这个源控制系统你可以按你的开发信息编辑这些值。你必须编辑 APP_WINDOW 中的 BLOCKNAME 为你自己的 block.不要
14、编辑FIRST_WINDOW QUERY_FINDQUERY_FINDAPP_STANDARD.EVENT(QUERY_FIND);这个触发器将设置显示字符串Query Find is not available 在这个触发器中替代代码,当你创建窗口或 Row_LOV 在你的 form 中时创建块级触发器并设置执行类型为Override WHEN-NEW-FORM-INSTANCEWHEN-NEW-FORM-INSTANCEFDRCSID($Header: . $);APP_STANDARD.EVENT(WHENNEWFORMINSTANCE); app_folder.define_folde
15、r_block(template test,folder_block, prompt_block, stacked_canvas,window, disabled functions);-app_folder.event(VERIFY);调用 APP_STANDARD.EVENT 是为了在 query-only 模式下调用FND_FUNCTION.EXECUTE,调用 FNDRCSID 是为了 Oracle 应用程序的源控制系统(source control system).APP_FOLDER 只为了 Oracle 应用程序内部调用。客户化文档密级:内部公开此资料属深南电路所有,未经许可,不
16、得扩散。form 不需要 FDRCSID 或 APP_FOLDER 调用,但是如果将它们留在触发器中也没有影响。在现有的代码前添加附加代码。 WHEN-NEW-RECORD-INSTANCEWHEN-NEW-RECORD-INSTANCEAPP_STANDARD.EVENT(WHEN-NEW-RECORD-INSTANCE);这个触发器管理 Oracle 应用程序菜单和工具栏创建块级触发器并设置执行类型为Before WHEN-NEW-ITEM-INSTANCEWHEN-NEW-ITEM-INSTANCE APP_STANDARD.EVENT(WHEN-NEW-ITEM-INSTANCE);这
17、个触发器管理 Oracle 应用程序的菜单和工具栏如果你添加弹性域方法调用,你应该添加它在 APP_STANDARD.EVENT 调用前调用,通常,你不应该添加任何代码在这个触发器中,这样的代码将会影响你表单的速度并且影响每一个项 Oracle EBS Form 中,不能修改的 TriggerOracle 应用程序不支持修改 form 级的触发器CLOSE_THIS_WINDOW从菜单 Action-Close 调用触发器 APP_CUSTOM.CLOSE_WINDOW 。文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。CLOSE_WINDOWAPP_CUSTOM.CLOSE_WI
18、NDOW(:SYSTEM.EVENT_WINDOW);这个出发其处理所有关闭窗口的事件。编写处理关闭窗口的事件必须写在APP_CUSTOM.CLOSE_WINDOW 包中EXPORT App_standard.event(EXPORT);这个触发器是“Action,Export” 菜单中的选择。FOLDER_ACTIONApp_folder.event(:global.folder_action);KEY-COMMITApp_standard.event(KEY-COMMIT);这个触发器处理正常的提交或 form 调用KEY-EDITApp_standard.event(KEY-EDIT);
19、这个触发器处理弹性域或日历,编辑器操作。KEY-EXITApp_standard.event(KEY-EXIT);这个触发器处理关闭事件和退出 enter-query 状态KEY-HELPApp_standard.event(KEY-HELP);这个触发器调用窗口的帮助系统。LASTRECORDAPP_STANDARD.EVENT(LASTRECORD);这个触发器处理菜单(Go -LAST RECORD)事件文档密级:内部公开此资料属深南电路所有,未经许可,不得扩散。MENU_TO_APPCOREApp_standard.event(:global.menu_to_appcore);这个触发器支持 Special 菜单STANDARD_ATTACHMENTSAtchmt_api.invoke;这个触发器处理附件菜单或工具按钮的调用WHEN-WINDOW-CLOSEExecute_trigger(CLOSE_WINDOW);这个触发器集中了 form 的关闭事件WHEN-FORM-NAVIGATE你不能修改这个触发器,它包含了标准的行为,当最小化的表单被导航到的时候正常化这个表单。ZOOMAppcore_custom.event(ZOOM);这个触发器处理菜单或工具条按钮Action,Zoom 事件。