如何在ClientDataSet中调整记录顺序?
我试过了加一个NO.字段,但是每一动一次就要edit、post两次(本记录NO.-1,上一条记录NO.+1)速度太慢了,求更好的解法,注意:不能和Server有数据交换

解决方案 »

  1.   

    (1)数据库中表的记录的顺序是任意的,根据数据库管理的需要随机存放。读取记录时按照一定的排序条件进行顺序输出(有时不指定任何条件就按照磁盘物理位置先后作为顺序)。所以你调整它们的顺序是没有任何意义的。有效的做法是根据需要建立不同的索引,那么访问数据的速度就会增加,而且索引本身也是排序的。
    (2)根据你的描述,大概是希望在显示窗口(如DBGrid)中调整行序。事实上,DBGrid通过DataSource与DataSet联接,DBGrid只负责根据DataSet来显示当前需要显示的内容,DBGrid本身并没有任何域来保存数据的值,因此不改变数据集是不可能的。
        综上所述,要解决你的问题,应该从速度上考虑。比如增加和调整索引、过滤数据等等。俺曾经在一个项目中遇到过此类问题,似乎解决起来并不麻烦。方法和你的一样。
      

  2.   

    to cnsuyong(小可)
    首先:以上两条完全同意,我的情况和你描述的差不多,索引我已经建立了,关键的问题在于这里:
            LBCds.Edit;
            LBCds.FieldByName('lb_no').AsInteger :=LBCds.RecNo-1;
            LBCds.Prior;
            LBCDs.Edit;
            LBCds.FieldByName('lb_no').AsInteger :=LBCds.RecNo+1;
            LBCds.Next;
    慢阿
      

  3.   

    看看是不是相关的AfterEdit、AfterPost、Afterxxxx、Beforexxxx、Onxxxx等事件处理程序造成速度很慢;
    如果不是,再试试Edit之前断开DBGrid与DataSource的链接,Post之后恢复链接;
    如果不行,再试试利用Filter和Filtered来减少当前显示的记录数;
    如果还不能达到满意的程度,那么俺也没有更好的办法了。
    关注。
      

  4.   

    就你以上的几个语句会有“慢”地感觉?
    不可能的,clientdataset是基于内存的控件。
    是不是你关联的事件太多了?
      

  5.   

    to:: chun2000(冷水) ( ) 
    你是不是在lb_no上建立了索引,然后想将前后二条记录交换位置显示吗?
    这应该不会慢才对呀.
    用disabledControls;EnabledControls;
      

  6.   

    谢谢大家,问题已解决了,原来是有一个AfterScroll在作祟,呵呵,写完他以后忘了,给分给分!
      

  7.   

    各位,本人也遇到相同的问题,但是本人使用的是ado +本机access数据库,现在要求调整以后的纪录顺序要保存起来,该怎样做啊?