起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: hero419

【结贴】自动排序问题请教**

[复制链接]
 楼主| 发表于 2008-9-3 14:42:20 | 显示全部楼层
我就是问代码怎么些呢,
例如:主表记录A1对应3条从表记录a、b、c,他们的序号分别是1、2、3,如果用户想调整他们的顺序,将c的序号手工改成1的话,保存后a、b、c的序号将自动更新为2、3、1。
回复 支持 反对

使用道具 举报

发表于 2008-9-3 15:55:50 | 显示全部楼层
如要把c的序号改成2或3呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-3 23:16:56 | 显示全部楼层
想改成几就改成几,在序号它后面的自动顺延。

用户没有提过自动排序的需求么,如果想要添加一条数据显示在中间平台一般怎么处理?
回复 支持 反对

使用道具 举报

发表于 2008-9-4 08:39:38 | 显示全部楼层
路过,插一句吧,我觉得这是一个逻辑的问题,设想如果不用电脑,手工是怎么给这些记录重新排序的呢?把逻辑考虑清楚就知道怎么处理了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-4 11:22:48 | 显示全部楼层
呵呵,手工的话自然是重写一遍,抄东西抄漏了,肯定要充抄拉~~

现在客户希望借助计算机系统完成这个工作,即添加的内容能排在指定的位置~~
我们西门子的EAM系统是可以实现这点的,客户于是就认为协同也行,可把我郁闷坏了。
回复 支持 反对

使用道具 举报

发表于 2008-9-4 14:19:21 | 显示全部楼层
1、平台肯定也能做到这点的。
2、建议搞了临时字段出来,初始值跟你的序号字段的值一样(至于是让临时字段表现出来让用户随便修改还是让实际的物理字段序号显示出来让用户修改,你自己决定);然后操作者随意修改排序的值,自己通过代码将相应的值进行修改,至于如何修改,这就是物理逻辑的问题了。
例如原先是 1、2、3、4;用户把4修改为1,那么你肯定要通过另一序号字段查找,原先是否有1这个序号的记录,如果有,那么就修改为2,如果没有查找比1大的值,如果没有,再加1再查找,直到找到最大序号的值循环才结束。
回复 支持 反对

使用道具 举报

发表于 2008-9-4 14:25:12 | 显示全部楼层
1、在数据集的AfterScroll中记录当前记录的编号到变量A中
2、用户选择新增后,根据A的值,来调整>=A的所有记录编号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-5 14:20:59 | 显示全部楼层
经过几天思考终于想出了一个还算不错的处理办法,思路如下:

1、建立“序号”字段,同时建立计算字段“行号”
//行号的获取代码
procedure TGZJHXX.FIELD_GZJHMXBC_HHCalcField(Field: TBizField; var Value: Variant);
begin
    Value := Field.DataSet.RecNo;
end;
//序号的获取代码
procedure TGZJHXX.DataSetGZJHMXAfterInsert(DataSet: TDataSet);
begin
    DataSetGZJHMX.FieldByName('XH').AsInteger := DataSetGZJHMX.RecordCount+1;
end;

2、数据集按照“序号”、“ID”(关键字,根据录入顺序自动生成的流水号)升序排列。

3、用户如需插入新数据,则修改序号即可,如下案例:
原始数据,序号按照录入顺序自动生成
序号  行号  ID
1     1     0001
2     2     0002
3     3     0003
添加第4条数据后数据集如下
序号  行号  ID
1     1     0001
2     2     0002
3     3     0003
4     4     0004
将第4条数据放到第2的位置显示,修改序号为1,保存后数据集按“序号”、“ID”升序排列。
序号  行号  ID
1     1     0001
1     2     0004
2     3     0002
3     4     0003

4、行号是根据排序获取的,我的思路就是刷新数据集的时候同步“序号”和“行号”。
//同步“序号”和“行号”的代码,从数据集最后一条记录开始
procedure TGZJHXX.DataSetGZJHMXAfterRefresh(DataSet: TDataSet);
begin
  DataSetGZJHMX.DisableControls;
  try
  DataSetGZJHMX.Last;
    while not DataSetGZJHMX.Bof do
    begin
       DataSetGZJHMX.Edit;
       DataSetGZJHMX.FieldByName('XH').AsInteger :=DataSetGZJHMX.FieldByName('HH').AsInteger;
       DataSetGZJHMX.Prior;
    end;
  finally
  DataSetGZJHMX.EnableControls;
  DataSetGZJHMX.ApplyUpdates;
  end;
end;
同步后的数据集如下
序号  行号  ID
1     1     0001
2     2     0004
3     3     0002
4     4     0003


5、这个想法看似不错,但存在缺陷。
我又插入第5条数据,要放到最前面,修改序号为0,数据集如下
序号  行号  ID
0     1     0005
1     2     0001
2     3     0004
3     4     0002
4     5     0003
刷新数据集,同步“序号”和“行号”,数据集如下
序号  行号  ID
1     1     0005
2     2     0001
3     3     0004
4     4     0002
5     5     0003
删除ID为0001的记录,数据集如下
序号  行号  ID
1     1     0005
3     2     0004
4     3     0002
5     4     0003
刷新数据集,同步“序号”和“行号”,问题出现,和上面的数据集相比第2、3条记录顺序变了
序号  行号  ID
1     1     0005
3     2     0002
3     3     0004
4     4     0003
仔细思考后发现,在同步ID为0002的记录的时候,序号同步为3后和ID为0004的记录序号相同了,在比较ID的时候又排在了上面,于是在执行DataSetGZJHMX.Prior的时候就把ID为0004的记录给跳过了,所以就出现了这个问题。
我是从Last往Frist更新的,其实从Frist往Last更新一样会有这个问题,貌似是因为数据集在做Prior或者Next的时候进行了数据集重新排序,所以想请教下,这个问题如何处理~~
回复 支持 反对

使用道具 举报

发表于 2008-9-5 17:22:25 | 显示全部楼层
删除记录,光标就自动滚动到下一条,即删除0001后,光标已经停到0004这条记录上了,你是否又去next数据集了。所有就跳过给0004重新赋序号的值的?你跟踪一下你的代码逻辑吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-5 18:58:41 | 显示全部楼层
你看我代码,刷新时我是先last数据集的,和当前光标所在位置无关~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-22 06:52 , Processed in 0.041742 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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