-
В таблице есть строковое поле TStringField, примерный список его значений следующий: 001 002 10 2 25A 112А 112Б 112B 30
Нужно отсортировать набор данных по этому полю, как числовому. Т.е.чтобы было 001 002 2 10 25А 30 112А 112Б 112B Как это можно сделать? P.S. Все это нужно сделать только средствами Delphi.
-
Дополнить слева нулями до максимальной длины.
-
в бде и локалsql каст таких строк к намберу не генерил исключений и возращал числа.
-
Использовать свою сортировку, которая в определенной функции будет возращать для двух значений, какое из них больше.
-
> [2] Поросенок Винни-Пух © (02.07.08 11:31)
Тогда, ИМХО, скорее всего поплывет сортировка по буквам
> 112А > 112Б > 112B
-
> Использовать свою сортировку
АДО не имеет метода TCustomSort, предлагаешь писать модуль на ФоксПро? А что делать с dBase даже представить не могу.
-
> Anatoly Podgoretsky © (02.07.08 11:41) [5]
Индексы по функциям поддерживает и фокс, и дбаз. Наверняка найдется стандартная такого вида. Хотя могу ошибаться, т.к. с фоксом работал давно и не на дельфи. Там можно было свою притулить и зделать по ней индексный ключ.
-
В конце концов сортировать можно на клиенте ключевое поле, а потом переносить в какой-нибудь ClientDataSet результирующий набор в отсортированном виде.
-
> Desdechado (02.07.2008 11:52:06) [6]
Поддерживают, я на них и намекал, только вот FoxPro это СОМ сервер, а dBase нет.
-
> В конце концов сортировать можно на клиенте ключевое поле, > а потом переносить в какой-нибудь ClientDataSet результирующий > набор в отсортированном виде.
Это как? Можно подробнее?
-
ClientDataset может быть оторванным от БД, самостоятельным набором данных Отсортировать набор строк сам, надеюсь, сможешь? А в нужном порядке скопировать записи в CDS вообще проблем не составляет.
-
Проблема то как раз в том, как отсортировать. Есть мысли?
-
> Проблема то как раз в том, как отсортировать
А тебе что. не известен ни один алгоритм сортировки ?
-
StrToInt не подойдет, т.к. 001, 112А в целое не переведет. Извращатся тоже как-то не хочется.
-
Сергей М. ты знаешь хот один алгоритм сортировки строк как числовых значений? Если, да, то поделись.
-
> Нужно отсортировать набор данных по этому полю, как числовому. > Т.е.чтобы было это не совсем "по числовому" если бы это было так то 002 и 2 это одно и то же и в сортировке позиция их была бы неопределена (сначала могла бы быть 2 после 002), так же как 3х значений 112, ты тем не менее поставил их на вполне определенные "красивые" позиции... > Как это можно сделать? если бы еще провайдер данных не был бы тайной... ну допустим это jet тогда запрос SELECT ID,Field1 FROM Table1
ORDER BY CInt(iif(IsNumeric(Field1), Field1, Left(Field1, Len(Field1)-1))), Field1
упорядочит результат именно так ка тебе нужно (в [0], и с данными оттуда же),если же насчет "числового" это была не оговорка, то убери второе условие сортировки (..., Field1).
-
Так убрать из строк нецифровые символы перед сортировкой. Или, в свете [13], перед StrToInt.
-
TStringList.CustomSort Туда подсовываешь свою функцию, которая для 2х значений скажет, какое больше. Собственно, я уже повторяюсь [3]
-
А эта функция может сравнивать, как угодно, хоть со StrToIntDef, хоть с учетом букв в конце или середине, хоть с пропуском. Короче, как напишешь.
-
> > Нужно отсортировать набор данных по этому полю, как числовому. > > > Т.е.чтобы было > это не совсем "по числовому" > если бы это было так то 002 и 2 это одно и то же и в сортировке > позиция их была бы неопределена (сначала могла бы быть 2 > после 002), так же как 3х значений 112, ты тем не менее > поставил их на вполне определенные "красивые" позиции... >
002 и 2 -это должно быть одно и тоже, а 2 после 002 потому, что она и в начальном наборе идет тоже после.
Провайдер - OLE DB for ODBC
> Так убрать из строк нецифровые символы перед сортировкой.
Я же написал, что извращаться не хочется. Да и к тому же как быть символами А, Б, В? Хотя при беглом взгляде на набор, как правило, 112А, 112Б и т.д. идут в правильном порядке.
> Или, в свете [13], перед StrToInt.
Это как?
|