FROM批量处理界面效果
当遇到对FORM上记录进行批量处理时,一般情况下都会选择在记录前面加上复选框,然后勾选上需要处理的数据,最后获取勾选的记录数据进行业务处理:
如果只是添加复选框,显得界面效果太单调,勾选结果显示也不够明显,将勾选的行进行特殊显示,会使得勾选效果更好。
通过在标准界面查找类似业务,找到对应API:
app_record.highlight('SELECTED_DATA');高亮显示当前行所有ITEM
app_record.highlight('');取消高亮显示当前行所有ITEM
效果如下图:
这样看起来用户会更明确的看到选择的行。
效果已经做出来,但是在操作上,用户会有一些不便,选择几行或者全选还好。但是如果一次连续选择50条,100条用户需要点击100次?用户会疯掉。
解决方法:
在我们用电脑选择多个对象时,习惯性使用CTRL或者SHIFT键来多选记录,可以考虑使用这个方法来处理。
通过查找标准FORM的库代码,找到了解决方法。
核心在一个SYSTEM属性
name_in('SYSTEM.MOUSE_BUTTON_MODIFIERS');
返回varchar2。
在WHEN-MOUSE-CLICK触发器时,这个属性会返回在你点击鼠标时,同时按住的那些按键名称用’+’拼接起来,如:同时按住Ctrl和Shift时返回Shift+Control+。有了这个后面问题就好解决了,只需要判断返回值是否包含Control或者Shift即可。
处理逻辑:
1. 按住Ctrl点击左键,如果原来勾选高亮显示,则变成取消勾选高亮显示,反之,则变成勾选高亮。
2. 按住Shift时需要增加一个变量记录上一次点击行Last_record
然后再根据当前点击行,循环中间所有行,勾选高亮显示,按住Shift的优先级应该高于Ctrl。
注意:因为勾选复选框时会触发WHEN-CHECKBOX-CHANGED,然后也触发WHEN-MOUSE-CLICK事件,这样按住CTRL会导致做两次事件,此时需要判断去跳过其中一个事件。
这样,就有多种操作方式选择记录了,使用户操作更加个性化,同时节省操作时间。
附:批量处理界面数据获取的心得:
对于这种勾选批量处理界面数据获取,首先想到的就是去循环界面所有记录去检查是否勾选,从而获取数据。这种方法简单,代码也很好写。但是当在界面操作时,问题就会出现:只勾选一条记录,却要去循环整个界面所有数据,还包含没有fetch到界面的数据。使得处理速度大大增加。“想尽办法去避免循环界面“这是我在做这个功能一个的体会(全选是不可避免的要循环界面了)。所以这种勾选模式要提前去获取数据。首先定义一个全局Table类型的变量,当勾选某一条记录时,将值存在Table(:SYSTEM.CURSOR_RECORD)里,取消勾选时Table.delete(:SYSTEM.CURSOR_RECORD)。这样在最后处理逻辑是只需要循环Table就行了。避免去Fetch不需要的数据(处理过程中,Table中间delete掉的记录在获取时会报No_data_found异常,只需要抛出异常跳过就行了)。即使勾选第一条和最后一条,虽然循环Table和循环界面次数一样,但是速度却有很大差别。