首页 > Form开发 > FROM批量处理界面效果

FROM批量处理界面效果

FROM批量处理界面效果

当遇到对FORM上记录进行批量处理时,一般情况下都会选择在记录前面加上复选框,然后勾选上需要处理的数据,最后获取勾选的记录数据进行业务处理:

clip_image002

如果只是添加复选框,显得界面效果太单调,勾选结果显示也不够明显,将勾选的行进行特殊显示,会使得勾选效果更好。

通过在标准界面查找类似业务,找到对应API:

app_record.highlight('SELECTED_DATA');高亮显示当前行所有ITEM

app_record.highlight('');取消高亮显示当前行所有ITEM

效果如下图:

clip_image004

这样看起来用户会更明确的看到选择的行。

效果已经做出来,但是在操作上,用户会有一些不便,选择几行或者全选还好。但是如果一次连续选择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和循环界面次数一样,但是速度却有很大差别。

 

 

关于作者:

昵称:Juner
档案信息:汉得-张江技术中心-黄埔五期-技术顾问
联系方式:你可以通过jiajun.yan@hand-china.com联系作者
点击查看Juner Yan发表过的所有文章...
本文永久链接: http://blog.retailsolution.cn/archives/2800

 

 

对本文的评价:

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

 

 

  1. Juner Yan
    2011年8月28日12:31 | #1

    (BUG:忘记有Clear_record的操作了,Clear_record会导致Table变量里的数据与界面上位置不同,出现错误,解决方法:1,置空块触发器KEY-CLRREC;2,同步更新Table中的数据)。

    以上是未看到标准FORM的做法时自己的设计,在Oracle中有标准的API来专门处理类似的批量业务功能。详细参考APPCORE.pll中的公共程序包APP_MULTI和app_multi_private,里面有Oracle设计的一套标准框架,对于各种情况的考虑更加详细。

  2. handy
    2011年11月5日23:55 | #2

    我按照你的方法把这个功能实现了,学习了。。。
    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;

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.