Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Вниз

Сортировка строкового поля как числового(D10/FoxPro/ADO)   Найти похожие ветки 

 
Erick   (2008-07-02 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 ©   (2008-07-02 11:05) [1]

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


 
Поросенок Винни-Пух ©   (2008-07-02 11:31) [2]

в бде и локалsql каст таких строк к намберу не генерил исключений и возращал числа.


 
Desdechado ©   (2008-07-02 11:31) [3]

Использовать свою сортировку, которая в определенной функции будет возращать для двух значений, какое из них больше.


 
Sergey13 ©   (2008-07-02 11:37) [4]

> [2] Поросенок Винни-Пух ©   (02.07.08 11:31)

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

> 112А
> 112Б
> 112B


 
Anatoly Podgoretsky ©   (2008-07-02 11:41) [5]


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

АДО не имеет метода TCustomSort, предлагаешь писать модуль на ФоксПро? А что делать с dBase даже представить не могу.


 
Desdechado ©   (2008-07-02 11:52) [6]


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

Индексы по функциям поддерживает и фокс, и дбаз.
Наверняка найдется стандартная такого вида. Хотя могу ошибаться, т.к. с фоксом работал давно и не на дельфи. Там можно было свою притулить и зделать по ней индексный ключ.


 
Desdechado ©   (2008-07-02 11:53) [7]

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


 
Anatoly Podgoretsky ©   (2008-07-02 15:16) [8]

> Desdechado  (02.07.2008 11:52:06)  [6]

Поддерживают, я на них и намекал, только вот FoxPro это СОМ сервер, а dBase нет.


 
Erick   (2008-07-02 15:21) [9]


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

Это как? Можно подробнее?


 
Desdechado ©   (2008-07-02 15:24) [10]

ClientDataset может быть оторванным от БД, самостоятельным набором данных
Отсортировать набор строк сам, надеюсь, сможешь?
А в нужном порядке скопировать записи в CDS вообще проблем не составляет.


 
Erick   (2008-07-02 15:48) [11]

Проблема то как раз в том, как отсортировать. Есть мысли?


 
Сергей М. ©   (2008-07-02 15:49) [12]


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


А тебе что. не известен ни один алгоритм сортировки ?


 
Erick   (2008-07-02 15:50) [13]

StrToInt не подойдет, т.к. 001, 112А в целое не переведет. Извращатся тоже как-то не хочется.


 
Erick   (2008-07-02 15:51) [14]

Сергей М.  ты знаешь хот один алгоритм сортировки строк как числовых значений? Если, да, то поделись.


 
sniknik ©   (2008-07-02 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 ©   (2008-07-02 15:59) [16]

Так убрать из строк нецифровые символы перед сортировкой.
Или, в свете [13], перед StrToInt.


 
Desdechado ©   (2008-07-02 16:07) [17]

TStringList.CustomSort
Туда подсовываешь свою функцию, которая для 2х значений скажет, какое больше. Собственно, я уже повторяюсь [3]


 
Desdechado ©   (2008-07-02 16:08) [18]

А эта функция может сравнивать, как угодно, хоть со StrToIntDef, хоть с учетом букв в конце или середине, хоть с пропуском. Короче, как напишешь.


 
Erick   (2008-07-02 16:10) [19]


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

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

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

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

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

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

Это как?


 
Desdechado ©   (2008-07-02 16:14) [20]


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

Если это одно и то же, то их порядок зависи от алгоритма сортировки, т.к. некоторые алгоритмы могут переставлять в итоговом множестве равные значения.


 
Johnmen ©   (2008-07-02 16:17) [21]

Насчет хреновости согласен
http://sql.ru/forum/actualthread.aspx?tid=571982


> Я же написал, что извращаться не хочется.

Ну я уже догадался, что писать программу ты не хочешь :))


 
Сергей М. ©   (2008-07-02 16:21) [22]


> Erick   (02.07.08 15:51) [14]


Алгоритмы сортировки абстрактны, им по барабану что сортировать - хоть строки, хоть черта лысого. За работу с конкретными типами сортируемых этими алгоритмами данных отвечают другие алгоритмы - алгоритмы сравнения. Вот там как раз и важно содержимое твоих строк. Но о сравнении пока речь не идет - ты еще не определился с алгоритмом сортировки.


 
Erick   (2008-07-02 16:27) [23]


> TStringList.CustomSort
> Туда подсовываешь свою функцию, которая для 2х значений
> скажет, какое больше. Собственно, я уже повторяюсь [3]

Если к примеру я отсортирую в нужном порядке данное поле, то как сделать, то как сделать чтобы весь набор отсортировался? Т.е. если я значения этого поля пишу в TStringList или еще куда-то, потом сортирую, как мне как сохранить соответвствие между сзначениями этого и других полей?


 
Erick   (2008-07-02 16:30) [24]


> Алгоритмы сортировки абстрактны, им по барабану что сортировать
> - хоть строки, хоть черта лысого. За работу с конкретными
> типами сортируемых этими алгоритмами данных отвечают другие
> алгоритмы - алгоритмы сравнения. Вот там как раз и важно
> содержимое твоих строк. Но о сравнении пока речь не идет
> - ты еще не определился с алгоритмом сортировки.

Да хоть "пузырьком", как разница какой алгоритм использовать. Мне нужно отсортировать по возрастанию номера помещений, которые храняться в текстовом поле.


 
Desdechado ©   (2008-07-02 16:36) [25]


> как мне как сохранить соответвствие между сзначениями этого
> и других полей?

Номера помещений у тебя уникальны? Если да, то соответствие уже есть. А если нет, то не имеет значения, какое из них первое, какое - второе. Главное, чтобы строки в результирующем CDS не повторялись.
Это, я думаю, ты сообразишь.


 
Сергей М. ©   (2008-07-02 16:39) [26]


> Да хоть "пузырьком"


TStringList, если ты за него взялся, реализует QuickSort.

Тебе остается реализовать алгоритм сравнения.


 
Anatoly Podgoretsky ©   (2008-07-02 16:43) [27]

> Erick  (02.07.2008 16:27:23)  [23]

А что ИД нет?


 
MsGuns ©   (2008-07-02 16:56) [28]

Привести нативные значения полей к единому шаблону (формату) - строке
Например шаблон NNNNNNLLLL, где
 N - цифра и L - буква

Тогда получим такую картину

Нативные значения    Шаблон
 0001                        000001____
 1                              000001____
 234                          000234____
 25ПРСТ                   000025ПРСТ
 78А                          000078А___
 Б45                          999999Б45_

По шаблону и сортировать

Как получить шаблон - дело "техники". Можно в запросе (если сиквель позволяет), можно через доп.поле датасета (TClientDataSet)


 
Desdechado ©   (2008-07-02 17:18) [29]


> Привести нативные значения полей к единому шаблону (формату)
> - строке

Это если оно получится. А то появится какое-нибудь "ПомеЩение 1Б2" - и тогда шаблон резко менять надо. А судя по постановке, данные не формализованы, юзеры долбят, что хотят.


 
zorik ©   (2008-07-02 17:51) [30]

В FB у меня нечто схожее реализовано с помощью UDF. Тригер срабатывает на добавление - изменение записи и в дополнительное поле вносит преобразованое шаблонированое значение, которое преобразуется в UDF


 
Anatoly Podgoretsky ©   (2008-07-02 18:38) [31]


> Как получить шаблон - дело "техники". Можно в запросе (если
> сиквель позволяет), можно через доп.поле датасета (TClientDataSet)

О каком сиквеле идет речь?


 
Виталий Панасенко(дом)   (2008-07-02 21:23) [32]

приведи строковое к числовому и по нему отсортируй
типа select  id, cast(id as integer) FROM table order by 2


 
Johnmen ©   (2008-07-02 21:26) [33]


> Виталий Панасенко(дом)   (02.07.08 21:23) [32]
> приведи строковое к числовому и по нему отсортируйтипа select
>  id, cast(id as integer) FROM table order by 2


опять недосмотрел... (c) Виталий Панасенко(дом)


 
MsGuns ©   (2008-07-02 22:39) [34]

>О каком сиквеле идет речь?

О диалекте SQL. Не все они позволяют разобрать строку или проверить содержит ли она только цифры


 
MsGuns ©   (2008-07-03 10:05) [35]

>Desdechado ©   (02.07.08 17:18) [29]
>А то появится какое-нибудь "ПомеЩение 1Б2" - и тогда шаблон резко менять надо.

Ничего не надо менять. Если буквенная часть натива слишком широка, то будут использованы только первые символы. Ну и, конечно, сам шаблон изначально должен быть достаточно "широким" чтобы вместить все значения. Например его длина должна составлять две длины нативного поля - тогда все "влезет"


 
Desdechado ©   (2008-07-03 10:47) [36]


> Ничего не надо менять.

Ой, не кажи "гоп".
А если туда вколотят с дефисами/слэшами/пробелами и прочими знаками препинания, это ж какая маска нужна....


 
Anatoly Podgoretsky ©   (2008-07-03 12:13) [37]

> Desdechado  (03.07.2008 10:47:36)  [36]

Это попытка удаления гланд через заднее отверстие.


 
MsGuns ©   (2008-07-03 14:25) [38]

>Desdechado ©   (03.07.08 10:47) [36]

Какую ты "маску" придумал ? Сравниваются строки и только


 
Desdechado ©   (2008-07-03 15:19) [39]


> Какую ты "маску" придумал ?

Это ты придумал шаблон, а я всего лишь синоним к слову употребил...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.028 c
15-1229609835
Добежал
2008-12-18 17:17
2009.02.15
Политика NT - хранить настройки программы отдельно от программы


15-1229612286
axis_of_evil
2008-12-18 17:58
2009.02.15
Silicon Graphics Octane


15-1229929327
Slider007
2008-12-22 10:02
2009.02.15
С днем рождения ! 21 декабря 2008 воскресенье


15-1229870744
Кое кто
2008-12-21 17:45
2009.02.15
Интересная фраза (Не помню чья)


2-1230718655
b@v
2008-12-31 13:17
2009.02.15
Грнид и картинка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский