Form技巧:如果在输入Item之后,可以自动执行GO_BLOCK等内置函数
来源:互联网 发布:广铁集团网络招聘 编辑:程序博客网 时间:2024/06/05 06:10
很多时候,我们想实现这样子的操作效果:
当向一个特定的Item输入数据之后,自动触发一系列的动作,例如GO_BLOCK,然后Loop这个Block,向这个Block维护一定的值(或者检查值)。这样子可以很大程度方便User操作(因为是自动操作的)。
但是,众所周知,如果在WHEN-VALIDATE-ITEM等触发器用GO_BLOCK等导航的内置函数,会报错:FRM-40737存在非法的受限过程。因为验证的触发器是不可以导航到别的记录的(大部分触发器都不可以)。
这里发现一个触发器可以达到这个效果:KEY-NEXT-ITEM。
这个触发器KEY-NEXT-ITEM是当用户向对应的Item输入数据,然后点Tab按键或者Enter按键(当然,画面没有Enter就直接调用的按钮)的时候,会触发这个触发器。而这个触发器是可以随意做一些我们想做的动作。例如跳到别的Item,别的Block等等。
但是,用这个触发器的程序猿会发现,如果用户录入数据的导航方式不是:向特定的Item输入值之后,用键盘Tab(或者Enter)导航到下一个Item;而是用鼠标直接点击,那是触发不了KEY-NEXT-ITEM事件,从而导致程序有隐含的bug!
怎么办?这里给出一个解决方案,虽然不是最好的,但是却是可以用的:对于这个Item,禁用鼠标导航的操作方式!
如何禁用?其原理:利用当用户点Tab按键的时候,触发器的顺序是:先触发KEY-NEXT-ITEM;再触发WHEN-VALIDATE-ITEM。当用户直接用鼠标导航的时候,只是触发WHEN-VALIDATE-ITEM。所以在WHEN-VALIDATE-ITEM下手即可,用RAISE FORM_TRIGGER_FAILURE;禁用。
实现步骤:
1 增加一个参数::PARAMETER.CURRENT_KEY_MODE。目的是为了区分用户的录入之后,导航的方式。
2 在WHEN-VALIDATE-ITEM触发器直接写下面的代码:
Begin
---当有变更,而且CURRENT_KEY_MODE(输入之后的导航类型)不是KEY-NEXT-ITEM的时候,必须用tab按键或者enter导航!
FND_MESSAGE.DEBUG('WHEN-VALIDATE-ITEM1');
IF :MDS_CONTROL.SCHEDULE_DATE IS NOT NULL AND NVL(:PARAMETER.CURRENT_KEY_MODE,'WHEN-VALIDATE-ITEM') <> 'KEY-NEXT-ITEM' THEN
FND_MESSAGE.SET_STRING('请注意:该栏位输入之后,请按Tab按键或者Enter按键导航!');
FND_MESSAGE.HINT;
RAISE FORM_TRIGGER_FAILURE;---禁止用户用鼠标点击导航!
END IF;
FND_MESSAGE.DEBUG('WHEN-VALIDATE-ITEM2');
End;
3 然后在KEY-NEXT-ITEM增加代码:
Declare
l_cur_record Number;
Begin
FND_MESSAGE.DEBUG('KEY-NEXT-ITEM1');
If :MDS_CONTROL.SCHEDULE_DATE Is Not Null Then
:PARAMETER.CURRENT_KEY_MODE := 'KEY-NEXT-ITEM';
Go_Block('XYG_MANUFACTURE_NEED');
l_cur_record := :SYSTEM.cursor_record;
First_Record;
Loop
If Nvl(:XYG_MANUFACTURE_NEED.CHK,'N')='Y' AND NVL(:XYG_MANUFACTURE_NEED.SCHEDULE_DATE,SYSDATE) <> :MDS_CONTROL.SCHEDULE_DATE
AND NVL(:XYG_MANUFACTURE_NEED.PROCESS_STATUS,'N') = 'Y' ---没审核的不可以预排
Then
:XYG_MANUFACTURE_NEED.SCHEDULE_DATE := :MDS_CONTROL.SCHEDULE_DATE;
---2011-10-19 samt add
:XYG_MANUFACTURE_NEED.SCHEDULE_USER_ID := FND_GLOBAL.USER_ID;
:XYG_MANUFACTURE_NEED.SCHEDULE_USER :=SUBSTRB( XYG_PUB_COMMON_PKG.GET_FND_FULL_NAME(FND_GLOBAL.USER_ID,SYSDATE,0),1,240) ;--FND_GLOBAL.USER_NAME;
End If;
Exit When :SYSTEM.LAST_RECORD='TRUE';
Next_Record;
End Loop;
--:MDS_CONTROL.SCHEDULE_DATE := NULL; ---清空
Go_record(l_cur_record);
:PARAMETER.CURRENT_KEY_MODE := 'WHEN-VALIDATE-ITEM';
End If;
FND_MESSAGE.DEBUG('KEY-NEXT-ITEM2');
End;
----2014.9.26更新:
有个问题:
在Key-commit的时候,再判断这个头的ITEM_COPY是否<>ITEM,如果是,则自动删除行的内容。
然后当用户点到行Block的时候,系统判断上面的(是否有自动做了DELETE记录的标识),如果是=Y,则自动刷新行的BLOCK即可。
这样子的话,就可以完全防呆了,反正有做了修改,DB数据库一定会删除记录。只不过对于用户来说刷新动作晚了一点而已。
您已经修改了这个值,系统已经在后台将行记录清空。请鼠标点到行块以确认数据。
- Form技巧:如果在输入Item之后,可以自动执行GO_BLOCK等内置函数
- vuejs中,如何使一个自定义函数在vue渲染完之后再自动执行
- 函数可以在被调用之后定义
- 在 Linux 命令行脚本中执行 sudo 等命令时自动输入密码(使用expect)
- FORM内置系统函数
- 在main函数执行之前和之后执行一段代码
- atexit()函数(使main函数之后可以执行其他函数)
- 在main函数之前和之后执行一些操作
- 如何使得代码在main函数之前/之后执行
- 怎样在main()函数退出之后再执行一段代码?
- 怎样使代码在main函数前执行,怎样使代码在main函数之后执行
- Form开发技巧:Dependencies item(相依性Item)的编程
- 如果想在main函数之前或main函数之后做一些工作
- jQuery执行完一个输入框的回车事件代码之后,会自动刷新页面解决办法
- 在main函数执行之前和执行之后执行的方法
- 在main函数执行之前和执行之后执行的方法<转载>
- 在main函数执行之前和执行之后执行的方法
- 程序执行顺序,为何先执行main,在Main退出之后可否执行别的函数呢
- 了解 ArcScene 与 ArcGlobe
- 青蛙又回到了井里
- TDC----实现静态页面的动态操作(HTML直接调用TXT文本文件)
- 【第12天】口才模板
- 七夕夜、离别,涵情经河岸
- Form技巧:如果在输入Item之后,可以自动执行GO_BLOCK等内置函数
- 利用nginx+apache+mysql+php+memcached+squid搭建门户网站
- 如果不是异地
- 加载不同格式类型图片封转函数(流中加载)
- Android ApiDemos示例解析(175):Views->Lists->8. Photos
- (四) MvcContrib插件实现MVC的分页
- 关于osip协议栈的优化
- 服务器推送数据 和 客户端定时访问服务器的实现
- 数据结构队列之环形队列的动态数组实现:queue