壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3004|回复: 13

[OAF] 关于数据集排序问题

[复制链接]
发表于 2008/7/29 09:07:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
在一个表格中,通过列排序功能对一个数据集进行排序.表格中有一列是单选列,发现,如果单选列做了选择,将不允许排序.报错信息为"
由于该表包含将会丢失的未完成更改,因此无法对其进行排序。",请教,这种问题如何处理.

已偿试方案:单选列验证关闭!
发表于 2008/7/29 10:04:28 | 显示全部楼层
单选列的一个属性"Warn Abount Changes"设置为False。

试一下
 楼主| 发表于 2008/7/29 10:38:44 | 显示全部楼层
在单选属性中,没有这个属性呢!
 楼主| 发表于 2008/7/29 10:40:16 | 显示全部楼层
这里用的是singleSelection!
发表于 2008/7/29 14:25:28 | 显示全部楼层
检查一下PageLayout Region的这个属性是否设置为True了
 楼主| 发表于 2008/7/30 08:37:13 | 显示全部楼层
现在完成的设置有:PageLayout Region-》Warn Abount Changes = False
排序字段的 Warn Abount Changes = False

不过问题还是一样的。
发表于 2008/9/21 17:23:17 | 显示全部楼层
这个问题是这样子的:
1、现象:若在页面上的Table中设有排序功能,并且在这个Table所对应的VO中存在临时字段。OAF将无法对这个Table中的数据进行排序。

2、结论:OAF是不支持对有临时字段的VO进行排序的。正如错误提示的那样“由于该表包含将会丢失的未完成更改,因此无法对其进行排序。"

3、原因:当用户点击sort功能的时候,OAF内部会先去得到用户刚才向服务端提交的希望进行排序的字段,然后把它拼接在原来VO的SQL中,最后去调用VO中的executeQuert()进行重新查询。而此时,若是在VO中存在临时字段,而临时字段中又被附上了值,那么,Oracle的查询机制将不值如何保存用户的临时值,所以,才会抛出一个系统警告。

4、解决:既然知道了在点击排序功能后,会调用executeQuery(),那就好办了。我们可以重载这个方法。当用户点击排序功能的时候,我们先压一个变量到trancation中,然后重载executeQuerty()时,写上这么一段代码。
public void executeQuerty()
{
    if ("Y".equals(getTranction().getTransientValue("sortByUserName")))//这是一段伪码,在VO中得到Tranction可以先得到AM,然后再取得Tranction,最后强转成OADBTranction。在processFormRequest中捕获排序技能后将在Tranction中压入一个sortByUserName的变量,值为Y
    {
      getTranction().removeTransientValue("sortByUserName")));//一定要马上移除
      //writing the source what you want.      
      ....   --A
    }
    else
    {
      super.executeQuerty();
    }
}
在A处写上你自己的代码,这里的代码要完成以下的几个操作。
一、建议找到VO中的主key,然后按照临时字段建立与主key的Hashmap。
二、进行JDBC的查询。
三、根据查询处来的结果,对照刚才建立的Hashmap,重新将临时值附上值。

完毕

评分

参与人数 2努力值 +10 收起 理由
Michael + 5 推荐,学习
atomic79 + 5 不错,加分!!

查看全部评分

发表于 2008/9/22 09:44:00 | 显示全部楼层
解释的详细,够好!
发表于 2008/9/22 23:20:47 | 显示全部楼层
谢谢Sumury,分析的很细致。
又学到点东西。
我在用OAF,但对Java不是很熟。
关于Hashtable/Hashmap,如果有时间,可不可以讲解一下?(或者推荐点资料也行)

谢谢!
发表于 2008/9/23 20:43:40 | 显示全部楼层
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。 以上只是表面的不同,它们的实现也有很大的不同。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

在OAF中常常是用的是HashMap,但是需要注意的是OAF中使用的是com.sun.java.util.collections.Hashmap,而不是java.util.Hashmap

两者是继承关系,不过com.sun.java.util.collections.Hashmap是有bug的。

有时候,你使用map.get("<key>"),是得不到你要的相应的值得。

我当初还不信,进去Debug,居然真的没有,com.sun.java.util.collections.Hashmap,是有些怪异。

若是,发现用map.get("<key>")取不到值,可以用下面的一段代码去遍历Hashmap

      com.sun.java.util.collections.Iterator it = ((OAMessageChoiceBean)webBean.findChildRecursive(
          "printFlagCho")).getPPRMap().entrySet().iterator();
      boolean blnDisabled = true;
      while (it.hasNext())
      {
        Entry e = (Entry)it.next();
        if ("disabled".equals(((AttributeKey)e.getKey()).getAttributeName()))
        {   
          blnDisabled = ((Boolean)((OADataBoundValueViewObject)e.getValue()).getValue(
              pageContext.getRenderingContext())).booleanValue();
          break;
        }
      }
      //调用getPPRMap()得到HashMap之后直接读取key的值“disabled”通常是取不到值的,所以要用以上这种遍历的方式。
发表于 2012/11/26 15:29:26 | 显示全部楼层
解释的真不错{:soso_e163:}
发表于 2012/11/26 15:39:31 | 显示全部楼层
sumury 真心强悍  我当初也是试了半天 才发现是 虚拟列的问题  但是没想出来怎么解决!
发表于 2013/2/25 11:28:50 | 显示全部楼层
在processFormRequest中捕获排序技能,这个怎么实现啊
发表于 2013/5/16 20:49:00 | 显示全部楼层
好贴,学习了,谢谢smmuy
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 09:02 , Processed in 0.018725 second(s), 18 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表