为了按某种顺序显示我的数据,我有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;
如何在有效删除行后对行进行重新排序?
答案 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;