![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка строкового поля как числового(D10/FoxPro/ADO) [dBase, FoxPro]
Erick © (2008-07-02 10:48:00)В таблице есть строковое поле TStringField, примерный список его значений следующий:
001
002
10
2
25A
112А
112Б
112B
30
Нужно отсортировать набор данных по этому полю, как числовому.
Т.е.чтобы было
001
002
2
10
25А
30
112А
112Б
112B
Как это можно сделать?
P.S. Все это нужно сделать только средствами Delphi.
Erick (2008-07-02 16:10:00) [21]
> > Нужно отсортировать набор данных по этому полю, как числовому.
>
> > Т.е.чтобы было
> это не совсем "по числовому"
> если бы это было так то 002 и 2 это одно и то же и в сортировке
> позиция их была бы неопределена (сначала могла бы быть 2
> после 002), так же как 3х значений 112, ты тем не менее
> поставил их на вполне определенные "красивые" позиции...
>
002 и 2 -это должно быть одно и тоже, а 2 после 002 потому, что она и в начальном наборе идет тоже после.
Провайдер - OLE DB for ODBC
> Так убрать из строк нецифровые символы перед сортировкой.
Я же написал, что извращаться не хочется. Да и к тому же как быть символами А, Б, В? Хотя при беглом взгляде на набор, как правило, 112А, 112Б и т.д. идут в правильном порядке.
> Или, в свете [13], перед StrToInt.
Это как?
Desdechado (2008-07-02 16:08:00) [22]А эта функция может сравнивать, как угодно, хоть со StrToIntDef, хоть с учетом букв в конце или середине, хоть с пропуском. Короче, как напишешь.
Desdechado (2008-07-02 16:07:00) [23]TStringList.CustomSort
Туда подсовываешь свою функцию, которая для 2х значений скажет, какое больше. Собственно, я уже повторяюсь [3]
Johnmen (2008-07-02 15:59:00) [24]Так убрать из строк нецифровые символы перед сортировкой.
Или, в свете [13], перед StrToInt.
sniknik (2008-07-02 15:58:00) [25]> Нужно отсортировать набор данных по этому полю, как числовому.
> Т.е.чтобы было
это не совсем "по числовому"
если бы это было так то 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).
Erick (2008-07-02 15:51:00) [26]Сергей М. ты знаешь хот один алгоритм сортировки строк как числовых значений? Если, да, то поделись.
Erick (2008-07-02 15:50:00) [27]StrToInt не подойдет, т.к. 001, 112А в целое не переведет. Извращатся тоже как-то не хочется.
Сергей М. (2008-07-02 15:49:00) [28]
> Проблема то как раз в том, как отсортировать
А тебе что. не известен ни один алгоритм сортировки?
Erick (2008-07-02 15:48:00) [29]Проблема то как раз в том, как отсортировать. Есть мысли?
Desdechado (2008-07-02 15:24:00) [30]ClientDataset может быть оторванным от БД, самостоятельным набором данных
Отсортировать набор строк сам, надеюсь, сможешь?
А в нужном порядке скопировать записи в CDS вообще проблем не составляет.
Erick (2008-07-02 15:21:00) [31]
> В конце концов сортировать можно на клиенте ключевое поле,
> а потом переносить в какой-нибудь ClientDataSet результирующий
> набор в отсортированном виде.
Это как? Можно подробнее?
Anatoly Podgoretsky (2008-07-02 15:16:00) [32]> Desdechado (02.07.2008 11:52:06) [6]
Поддерживают, я на них и намекал, только вот FoxPro это СОМ сервер, а dBase нет.
Desdechado (2008-07-02 11:53:00) [33]В конце концов сортировать можно на клиенте ключевое поле, а потом переносить в какой-нибудь ClientDataSet результирующий набор в отсортированном виде.
Desdechado (2008-07-02 11:52:00) [34]
> Anatoly Podgoretsky © (02.07.08 11:41) [5]
Индексы по функциям поддерживает и фокс, и дбаз.
Наверняка найдется стандартная такого вида. Хотя могу ошибаться, т.к. с фоксом работал давно и не на дельфи. Там можно было свою притулить и зделать по ней индексный ключ.
Anatoly Podgoretsky (2008-07-02 11:41:00) [35]
> Использовать свою сортировку
АДО не имеет метода TCustomSort, предлагаешь писать модуль на ФоксПро? А что делать с dBase даже представить не могу.
Sergey13 (2008-07-02 11:37:00) [36]> [2] Поросенок Винни-Пух © (02.07.08 11:31)
Тогда, ИМХО, скорее всего поплывет сортировка по буквам
> 112А
> 112Б
> 112B
Desdechado (2008-07-02 11:31:00) [37]Использовать свою сортировку, которая в определенной функции будет возращать для двух значений, какое из них больше.
Поросенок Винни-Пух (2008-07-02 11:31:00) [38]в бде и локалsql каст таких строк к намберу не генерил исключений и возращал числа.
Sergey13 (2008-07-02 11:05:00) [39]Дополнить слева нулями до максимальной длины.