FROM批量处理界面效果
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和循环界面次数一样,但是速度却有很大差别。
关于作者:
昵称: 档案信息: 联系方式:你可以通过联系作者 点击查看发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/2800 |
对本文的评价:
(BUG:忘记有Clear_record的操作了,Clear_record会导致Table变量里的数据与界面上位置不同,出现错误,解决方法:1,置空块触发器KEY-CLRREC;2,同步更新Table中的数据)。
以上是未看到标准FORM的做法时自己的设计,在Oracle中有标准的API来专门处理类似的批量业务功能。详细参考APPCORE.pll中的公共程序包APP_MULTI和app_multi_private,里面有Oracle设计的一套标准框架,对于各种情况的考虑更加详细。
我按照你的方法把这个功能实现了,学习了。。。
PROCEDURE when_checked IS
temp NUMBER; — Use to change the value of last_click_record and curr_click_record as needed.
BEGIN
IF checkbox_checked(‘PT_HEADERS.SELECT_FLAG’) THEN
IF name_in(‘SYSTEM.MOUSE_BUTTON_MODIFIERS’) IS NULL THEN
:parameter.last_click_record := :system.cursor_record;
ELSIF name_in(‘SYSTEM.MOUSE_BUTTON_MODIFIERS’) = ‘Shift+’ THEN
:parameter.curr_click_record := :system.cursor_record;
END IF;
–fnd_message.debug(‘:parameter.last_click_record=’ || :parameter.last_click_record || ‘:parameter.curr_click_record=’ || :parameter.curr_click_record);
IF :parameter.last_click_record IS NOT NULL
AND :parameter.curr_click_record IS NOT NULL
AND name_in(‘SYSTEM.MOUSE_BUTTON_MODIFIERS’) = ‘Shift+’ THEN
IF :parameter.last_click_record > :parameter.curr_click_record THEN
temp := :parameter.curr_click_record;
:parameter.curr_click_record := :parameter.last_click_record;
:parameter.last_click_record := temp;
END IF;
go_record(:parameter.last_click_record);
FOR i IN :parameter.last_click_record .. :parameter.curr_click_record
LOOP
app_record.highlight(‘SELECTED_DATA’);
pt_temp_record.insert_temp_record(‘CUX_PFM_PRODTEAM_HEADERS’,
:pt_headers.header_id);
:pt_headers.select_flag := ‘Y’;
EXIT WHEN :system.last_record = ‘TRUE’;
next_record;
END LOOP;
END IF;
END IF;
END when_checked;