Как переопределить механизм сортировки TClientDataSet

Можно ли изменить способ использования индексов в TClientDataSet для сортировки записей? Прочитав этот вопрос, я подумал, что это было бы неплохо иметь возможность логически сортировать строковые поля в клиентском наборе данных. Но я понятия не имею, как переопределить поведение клиентского набора данных по умолчанию, когда дело доходит до индексов. Есть идеи?

PS: Мой CDS не привязан ни к одному провайдеру. Я ищу способ изменить механизм сортировки самого TClientDataSet (или родителя, в котором реализован этот механизм).


person iMan Biglari    schedule 29.07.2013    source источник
comment
Вы показываете данные из CDS пользователю? Если да, то какой компонент вы используете? Большинство компонентов типа Grid и ListView позволяют реализовать пользовательскую сортировку, поэтому, если в CDS нет того, что вам нужно, вы можете попробовать использовать его вместо этого.   -  person LightBulb    schedule 29.07.2013
comment
@LightBulb Я использую JvDBGrid.   -  person iMan Biglari    schedule 30.07.2013


Ответы (3)


Вы не можете переопределить механизм сортировки ClientDataSet, если только вы не перепишете соответствующую часть Midas.

Чтобы добиться правильной сортировки (независимо от того, что означает логический), вы можете ввести новое поле и установить его значения таким образом, чтобы при сортировке стандартным механизмом они давали требуемый порядок сортировки.

person Uwe Raabe    schedule 29.07.2013
comment
Доступен ли исходный код midas.obj? Я более чем готов изменить соответствующие части, если исходный код доступен и лицензионное соглашение разрешает его модификации. - person iMan Biglari; 30.07.2013
comment
c:\Program Files (x86)\Embarcadero\RAD Studio\9.0\source\data\dsnap\midas\ - person Uwe Raabe; 30.07.2013
comment
У меня нет указанной папки в папке установки XE2. :-( - person iMan Biglari; 31.07.2013
comment
Исходники midas включены начиная с D2010 в версии Professional и выше. Если вы не возились с настройкой, ее следует установить. - person Uwe Raabe; 31.07.2013
comment
Я попробую переустановить свой XE2 - person iMan Biglari; 31.07.2013
comment
Нашел. Исходный код Midas устанавливается, если вы решите установить C++ Builder - person iMan Biglari; 05.08.2013

Прочтите отличную онлайн-статью Understanding ClientDataSet Indexes от Кэри Дженсен.

В нем объясняется, как использовать различные способы сортировки и индексации с помощью IndexDefs, Имена индексных полей и IndexName.

Изменить: ответьте на свой комментарий.

Вы не можете переопределить метод сортировки в TClientDataSet, но можете добавить сделай это:

Если вы хотите выполнить пользовательскую сортировку для чего-либо еще, кроме существующих полей, вам нужно добавить Расчетные поля. Поле, выполните расчет порядка в OnCalcFields, затем добавьте это поле в файл IndexDefs.

person Jeroen Wiert Pluimers    schedule 29.07.2013
comment
Я прочитал статью. Я хочу переопределить фактический метод, который сравнивает и позиционирует записи в соответствии с текущим индексом. Что-то вроде docwiki.embarcadero.com/Libraries/XE4/en/ - person iMan Biglari; 29.07.2013
comment
У меня есть еще один вопрос относительно использования вычисляемых полей и индексов. До сих пор мне не удавалось использовать внутренние вычисляемые поля в индексе: stackoverflow.com/questions/17896329/ - person iMan Biglari; 30.07.2013
comment
Хм, это очень плохо. Я думал, что делал что-то подобное в прошлом, но я больше не помню этот проект. Простите за это. Можете ли вы загрузить небольшой пример (только код) на что-то вроде gist.github.com, тогда я смогу чтобы изучить это позже на этой неделе. Напишите здесь комментарий, когда загрузите пример. - person Jeroen Wiert Pluimers; 30.07.2013
comment
У меня есть проект, работающий с полем fkInternalCalc и установленным для него IndexName. Это не работает для полей fkCalculated, потому что они не видны реализации midas, которая обрабатывает индекс. - person Uwe Raabe; 30.07.2013

Я бы попытался добиться желаемой сортировки с помощью оператора SQL, который передает ClientDataSet.

Например, если бы я имел дело со следующими строками в 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 будет зависеть от используемой СУБД.

person Sam    schedule 29.07.2013
comment
Мой CDS — это набор данных в памяти. - person iMan Biglari; 29.07.2013
comment
Все данные на компьютере находятся в памяти, что такого особенного в вашей CDS? :-) - person Sam; 29.07.2013
comment
ClientDataSet не может выполнять SQL. - person Uwe Raabe; 29.07.2013
comment
@UweRaabe Я знаю это! Я предлагал ему использовать SQL для feed CDS. Я думаю, что есть некоторые компоненты запроса, которые имеют встроенную CDS. Во всяком случае, ОП, кажется, вполне полон решимости решить свой точный вопрос, а не обязательно проблему логической сортировки. - person Sam; 29.07.2013
comment
@Sam Моя CDS заполнена данными, поступающими из последовательного порта, а не из СУБД. - person iMan Biglari; 01.10.2013
comment
@iManBiglari о, хорошо. Всего наилучшего. - person Sam; 03.10.2013