在TClientDataSet中重新排序行

时间:2015-06-10 07:52:45

标签: delphi

为了按某种顺序显示我的数据,我有ORDER列。所以我可以上下移动。那已经有效了,我只是为受影响的行交换ORDER号。我的问题是,当我删除一行时,我需要重新排序所有其他行。要以正确的顺序显示行,我使用.IndexFieldNames:=' ORDER',但是当我遍历所有行并分配新的ORDER编号时,使用活动索引它非常慢。当我删除.IndexFieldNames:=''时,行不再按正确顺序排列,新订单错误。

这是我的代码:

class procedure TDataModuleEx.ReOrderColumn(const aDataSet: TClientDataSet;
  const aFieldName: string; aResetClone: Boolean);
var
  clone: TClientDataSet;
  newOrderNo: Integer;
begin
  newOrderNo := 0;
  clone := TClientDataSet.Create(nil);
  try
    clone.CloneCursor(aDataSet, aResetClone);
    clone.IndexFieldNames := aFieldName;
    clone.IndexFieldNames := ''; //Indexed Edit is too slow
    clone.First;
    while not clone.eof do
    begin
      Inc(newOrderNo);
      clone.Edit;
      clone.FieldByName(aFieldName).AsInteger := newOrderNo;
      clone.Post;

      clone.Next;
    end;
  finally
    clone.Free;
  end;
end;

如何在有效删除行后对行进行重新排序?

1 个答案:

答案 0 :(得分:0)

我在一张有10 000条记录的桌子上进行了一些测试。过程ReOrderColumn重新编号约3秒钟。 ClientDataSet的。 ApplyUpdate大约需要30秒。

总共约33秒

我在Firebird数据库中编写了存储过程,该数据库重新编号为约3秒

SET TERM ^ ;

create or alter procedure REORDER
as
declare variable ID integer;
declare variable I integer;
BEGIN
  i = 0;
  FOR
    select new_table.id
    from new_table
    order by FORDER
    INTO :ID
    as cursor tcur
  DO
  BEGIN
    i = :i + 1;
    update new_table t set t.forder = :i
    where current of tcur;
  END
 END^

 SET TERM ; ^

来自德尔福

procedure Reorder;
begin
  //Apply changes to server
  dm1.ClientDataSet1.ApplyUpdates(0); 
  //execute stored procedure
  dm1.spReorder.ExecProc; <--- ABOUT 3 SEC FOR 10 000 records
  //Refresh dataset
  dm1.ClientDataSet1.Close;
  dm1.ClientDataSet1.Open;
end;