您没有提供有关您的用例的许多详细信息,因此我将尝试给您一些提示:
“大量数据”表明您可能从 SQL 后端获得它。使用 'SELECT DISTINCT...' 或 'SELECT ... GROUP BY BRANCH_ID' (或类似的语法,取决于您使用什么 SQL 后端)将轻松快速地提供所需的结果。请确认,我会给你更多的细节。
正如其他人所说,一个简单的“克隆”是行不通的。最简单(也许更快)的解决方案,假设通常数据的 WRT 分支数量很少,是在数据集之外有一个索引。如果你真的想过滤你的原始数据,那么在你的数据上添加一个状态字段(例如布尔值)并在第一次出现时放置一个标志(例如'True')。
伪代码:(假设:您的 ClientDataSet 是 cds1 您的 cds1 有一个状态字段 cds1Status(布尔值)-这是可选的,仅当您想要排序/过滤/搜索 cds1 时才需要,您有一个 lIndex,它是一个 TStringList)
lIndex.Clear;
lIndex.Sorted:=True;
with cds1 do
try
DisableControls;
First;
while not Eof do //scan the dataset
begin
cVal:=cds1Branch_ID.AsString;
Edit; //we anyway update the Status field
if lIndex.Find(cVal, nDummy) then //nDummy - we don't use it.
begin //already in index
cds1Status.AsBoolean:=False; //we say here "No, isn't the 1st occurence"
end
else
begin //Not found! - Well, let's add it...
lIndex.Append(cVal); //update the index
cds1Status.AsBoolean:=True; //mark the first occurence
end;
Post; //save the changes in the status field
Next;
end; //scan
finally
EnableControls; //housekeeping
end;
//警告!- 未经测试。我是从头开始写的,但我认为你明白了……
...取决于您尝试完成的工作(这将是您可能与我们分享的最好的事情)以及您对 BRANCH_ID 的选择性,也许根本不需要状态引擎。如果您对该字段的选择性非常低(选择性=唯一值的数量/记录的数量),那么拥有一个新数据集并仅复制唯一值而不是将原始CD的每条记录放入其中要快得多编辑 + 发布状态。(更改数据集状态是昂贵的操作。特别是如果您的 cd 链接到远程数据存储 - 即服务器)。
h,
PS:我的解决方案主要是简单的。您也可以使用 lIndex.Sorted:=False 进行测试,并使用 lIndex.IndexOf 而不是 Find。在某些(罕见)情况下更好。取决于你的数据。如果您想让事情复杂化并且速度确实是一个问题,您可以实现一个成熟的 BTree 索引来执行您的搜索(可用的库)。您也可以使用 CDS 的索引引擎并索引 BRANCH_ID 并在克隆上执行许多“定位”,但是因为您的选择性显然 < 1,所以理论上扫描 cds 的整个索引应该比对唯一索引的扫描要慢,特别是如果您的定制索引是根据您的数据类型、结构、分布等量身定制的。
只是 my2c