是否可以更改使用索引TClientDataSet
对记录进行排序的方式?在阅读了这个问题之后,我认为能够在客户端数据集中对字符串字段进行逻辑排序会很好。但是我不知道在索引方面如何覆盖客户端数据集的默认行为。有任何想法吗?
PS:我的 CDS 未链接到任何提供商。我正在寻找一种方法来修改TClientDataSet
(或实现该机制的父级)本身的排序机制。
是否可以更改使用索引TClientDataSet
对记录进行排序的方式?在阅读了这个问题之后,我认为能够在客户端数据集中对字符串字段进行逻辑排序会很好。但是我不知道在索引方面如何覆盖客户端数据集的默认行为。有任何想法吗?
PS:我的 CDS 未链接到任何提供商。我正在寻找一种方法来修改TClientDataSet
(或实现该机制的父级)本身的排序机制。
您不能覆盖 ClientDataSet 的排序机制 - 除非您重写 Midas 的相应部分。
为了实现正确的排序(无论逻辑方式如何),您可以引入一个新字段并以某种方式设置其值,以便使用标准机制进行排序,它们将给出所需的排序顺序。
阅读Cary Jensen撰写的优秀在线文章理解 ClientDataSet索引。
它解释了如何使用IndexDefs、IndexFieldNames和IndexName使用各种排序和索引方法。
编辑:回复您的评论。
您不能覆盖TClientDataSet中的排序方法,但您可以添加执行以下操作:
如果您想对现有字段以外的任何其他内容进行自定义排序,则必须添加一个计算字段,在OnCalcFields事件中执行一种顺序计算,然后将该字段添加到IndexDefs
.
我会尝试使用提供给 ClientDataSet 的 SQL 语句来实现所需的排序。
例如,如果我在 FieldN 中处理以下字符串
a_1
a_20
a_10
a_2
我希望它们像这样排序(我认为这与逻辑上的意思相似
a_1
a_2
a_10
a_20
然后我会把 SQL 写成
SELECT FieldA,
FieldB,
... ,
FieldN,
CAST(SUBSTRING(FieldN, 3, 2) TO INTEGER) As FieldM '<== pseudocode
FROM TableA
ORDER BY FieldM
SubString 和 Cast to Integer 操作的确切语法取决于您使用的 DBMS。