Конференция "Базы" » Сортировка строкового поля как числового(D10/FoxPro/ADO) [dBase, FoxPro]
 
  • Erick (02.07.08 10:48) [0]
    В таблице есть строковое поле TStringField, примерный список его значений следующий:
    001
    002
    10
    2
    25A
    112А
    112Б
    112B
    30

    Нужно отсортировать набор данных по этому полю, как числовому.
    Т.е.чтобы было
    001
    002
    2
    10
    25А
    30
    112А
    112Б
    112B
    Как это можно сделать?
    P.S. Все это нужно сделать только средствами Delphi.
  • Sergey13 © (02.07.08 11:05) [1]
    Дополнить слева нулями до максимальной длины.
  • Поросенок Винни-Пух © (02.07.08 11:31) [2]
    в бде и локалsql каст таких строк к намберу не генерил исключений и возращал числа.
  • Desdechado © (02.07.08 11:31) [3]
    Использовать свою сортировку, которая в определенной функции будет возращать для двух значений, какое из них больше.
  • Sergey13 © (02.07.08 11:37) [4]
    > [2] Поросенок Винни-Пух ©   (02.07.08 11:31)

    Тогда, ИМХО, скорее всего поплывет сортировка по буквам

    > 112А
    > 112Б
    > 112B
  • Anatoly Podgoretsky © (02.07.08 11:41) [5]

    > Использовать свою сортировку

    АДО не имеет метода TCustomSort, предлагаешь писать модуль на ФоксПро? А что делать с dBase даже представить не могу.
  • Desdechado © (02.07.08 11:52) [6]

    > Anatoly Podgoretsky ©   (02.07.08 11:41) [5]

    Индексы по функциям поддерживает и фокс, и дбаз.
    Наверняка найдется стандартная такого вида. Хотя могу ошибаться, т.к. с фоксом работал давно и не на дельфи. Там можно было свою притулить и зделать по ней индексный ключ.
  • Desdechado © (02.07.08 11:53) [7]
    В конце концов сортировать можно на клиенте ключевое поле, а потом переносить в какой-нибудь ClientDataSet результирующий набор в отсортированном виде.
  • Anatoly Podgoretsky © (02.07.08 15:16) [8]
    > Desdechado  (02.07.2008 11:52:06)  [6]

    Поддерживают, я на них и намекал, только вот FoxPro это СОМ сервер, а dBase нет.
  • Erick (02.07.08 15:21) [9]

    > В конце концов сортировать можно на клиенте ключевое поле,
    >  а потом переносить в какой-нибудь ClientDataSet результирующий
    > набор в отсортированном виде.

    Это как? Можно подробнее?
  • Desdechado © (02.07.08 15:24) [10]
    ClientDataset может быть оторванным от БД, самостоятельным набором данных
    Отсортировать набор строк сам, надеюсь, сможешь?
    А в нужном порядке скопировать записи в CDS вообще проблем не составляет.
  • Erick (02.07.08 15:48) [11]
    Проблема то как раз в том, как отсортировать. Есть мысли?
  • Сергей М. © (02.07.08 15:49) [12]

    > Проблема то как раз в том, как отсортировать


    А тебе что. не известен ни один алгоритм сортировки ?
  • Erick (02.07.08 15:50) [13]
    StrToInt не подойдет, т.к. 001, 112А в целое не переведет. Извращатся тоже как-то не хочется.
  • Erick (02.07.08 15:51) [14]
    Сергей М.  ты знаешь хот один алгоритм сортировки строк как числовых значений? Если, да, то поделись.
  • sniknik © (02.07.08 15:58) [15]
    > Нужно отсортировать набор данных по этому полю, как числовому.
    > Т.е.чтобы было
    это не совсем "по числовому"
    если бы это было так то 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).
  • Johnmen © (02.07.08 15:59) [16]
    Так убрать из строк нецифровые символы перед сортировкой.
    Или, в свете [13], перед StrToInt.
  • Desdechado © (02.07.08 16:07) [17]
    TStringList.CustomSort
    Туда подсовываешь свою функцию, которая для 2х значений скажет, какое больше. Собственно, я уже повторяюсь [3]
  • Desdechado © (02.07.08 16:08) [18]
    А эта функция может сравнивать, как угодно, хоть со StrToIntDef, хоть с учетом букв в конце или середине, хоть с пропуском. Короче, как напишешь.
  • Erick (02.07.08 16:10) [19]

    > > Нужно отсортировать набор данных по этому полю, как числовому.
    >
    > > Т.е.чтобы было
    > это не совсем "по числовому"
    > если бы это было так то 002 и 2 это одно и то же и в сортировке
    > позиция их была бы неопределена (сначала могла бы быть 2
    > после 002), так же как 3х значений 112, ты тем не менее
    > поставил их на вполне определенные "красивые" позиции...
    >

    002 и 2 -это должно быть одно и тоже, а 2 после 002 потому, что она и в начальном наборе идет тоже после.

    Провайдер - OLE DB for ODBC

    > Так убрать из строк нецифровые символы перед сортировкой.

    Я же написал, что извращаться не хочется. Да и к тому же как быть символами А, Б, В? Хотя при беглом взгляде на набор, как правило, 112А, 112Б и т.д. идут в правильном порядке.

    > Или, в свете [13], перед StrToInt.

    Это как?
 
Конференция "Базы" » Сортировка строкового поля как числового(D10/FoxPro/ADO) [dBase, FoxPro]
Есть новые Нет новых   [134470   +16][b:0][p:0.001]