Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка строкового поля как числового(D10/FoxPro/ADO) [dBase, FoxPro]


Страницы:   1 2

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]

Дополнить слева нулями до максимальной длины.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо