如何删除网格中的重复记录?

时间:2009-06-26 12:57:26

标签: delphi delphi-2009

早上好!

从网格控件中删除重复记录的最佳方法是什么?我使用Delphi 2009和devEx quantumGrid组件。

我尝试循环遍历所有记录,当找到重复记录时,将其添加到列表并在网格上应用过滤器。我发现这是一个耗时的逻辑。这种方法还有两个缺点。

[1]当重复记录更多地说10K记录时,应用过滤器需要花费大量时间,因为要过滤掉大量条目。

[2]循环遍历所有记录对于像1M行这样的大结果集来说本身很耗时。

SQL查询返回不同的行,但是当用户隐藏网格中的任何列时,它就像是有重复的记录(在内部它们是不同的)。

还有其他方法吗?

对此有任何想法都非常有帮助!

谢谢&问候, 帕。

4 个答案:

答案 0 :(得分:1)

您是否可以将数据集更改为不首先返回重复记录?我通常只会返回我想要显示的记录,而不是从数据库中返回不需要的记录,然后使用数据库网格来尝试抑制不需要的记录。

答案 1 :(得分:0)

由于您刚才提到的原因,检查重复项总是有点棘手。在这种特殊情况下执行此操作的最佳方法可能是在数据到达网格之前进行过滤。

如果此网格从数据库获取其记录,请尝试调整SQL查询以不返回任何重复记录。 (“distinct”关键字在这里很有用。)数据库服务器通常可以做得比你做得好得多。

如果没有,那么您可能正在从某种对象列表中加载结果集。尝试过滤列表并剔除重复的对象,然后再将加载到网格中。然后它结束了,你不必过滤网格本身。这不费时间。

答案 2 :(得分:0)

我已经与DevExpress的Quantum Grid合作了一段时间,他们的支持形式http://www.devexpress.com/Support/Center/非常出色。当您发布问题时,DevExpress工作人员将直接回答您的问题。话虽如此,我快速搜索了你并找到了一些相关的文章。

如何隐藏重复的行值: http://www.devexpress.com/Support/Center/p/Q142379.aspx?searchtext=Duplicate+Rows&p=T1|P0|83

突出显示网格中的重复记录: http://www.devexpress.com/Support/Center/p/Q98776.aspx

不幸的是,看起来你必须遍历表格才能隐藏重复的值。我建议您在将数据传输到网格之前尝试清理数据。理想情况下,您将更新生成数据的代码/ sql。如果无法做到这一点,您可以编写一个TcxCustomDataSource,它将在首次加载数据时清理数据。这应该有更好的性能,因为您不会使用网格的api来访问数据。

修改

ExpressQuantumGrid不会自动隐藏看起来像重复的行,因为用户隐藏了一列。请参阅:http://www.devexpress.com/Support/Center/p/Q205956.aspx?searchtext=Duplicate+Rows&p=T1|P0|83

<强>海报

  

例如,我有一个数据集   包含两个字段ID和TXT。 ID是   一个独特的字段和TXT字段可以   包含重复值。所以当   数据集连接到网格   所有列都可见,记录是   独特。见image1.bmp。但如果我   隐藏ID列然后显示网格   重复的行。见image2.bmp。

DevExpress团队

  

对不起,我们的ExpressQuantumGrid   套房不支持这样的   功能,因为这个任务是   非常具体。但是,你可以   手动实施。

答案 3 :(得分:0)

有数千行我会在数据库中添加一个名为Sum或Hash的附加字段,或者如果你不能更改数据库,如果它是ClientDataSet则添加一个计算字段,但这会在显示时间带来开销

使用快速简单的东西计算哈希字段的内容,就像文本字段中所有字符的总和一样。所有欺骗现在都很容易识别。将此字段添加到您的Unique或Distinct Query参数中,或过滤掉该字段。

只是一个想法。