Как сделать свою "хитрую" пользовательскую сортировку?

"Внезапно" (как это часто бывает) обнаружилось, что элементы базы требующие отображения в отсортированном виде отображаются не так как хотелось бы пользователям.

Дело всё в том, что когда пользователь, например, вводит какие-нибудь товары, в названии которых есть и буквенная часть и числовая (представляющая порядковый номер)

ручка
резинка
ножницы
карандаш красный №1
карандаш красный №2
карандаш красный №3
...
карандаш красный №9
карандаш красный №10

и этот пользователь хочет отсортировать продукты по алфавиту, то он получит:

карандаш красный №1
карандаш красный №10

карандаш красный №2
карандаш красный №3
...
карандаш красный №9
ножницы
резинка
ручка

И вот тут на примере карандашей видим проблему:
После номера 1 идёт 10, а не 2 так как сравниваются коды символов стоящих под соответствующими номерами,
Так как поле текстовое, то другой сортировки ожидать и не приходится

Суть вопроса: есть-ли шанс переписать механизмы сортировки, так, чтобы текстовое поле парсилось на наличие цифр, или сортировка идёт в ядре, "куда простым смертным путь заказан"?

Нравится

6 комментариев

Можно создать в SelectQuery колонку типа "SQL Text" и там написать произвольную формулу или вызов SQL-функции, оперирующие значением другой колонки. Потом создать колонку в Dataset-е. И сортировать по ней.

"Зверев Александр" написал:произвольную формулу или вызов SQL-функции

что-то типа

select cast( 
	substring(YOUR_Field, PATINDEX('%№%', YOUR_Field), 2)
	as int)

"Андросов Дмитрий" написал:что-то типа

Мне кажется, автору темы этого будет недостаточно. Ведь "карандаш красный №1" должен быть ниже, чем "карандаш зелёный №2". Тут надо делить строку на буквы и цифры, цифры дополнять слева нулями до одинаковой длины и соединять обратно.

Всем спасибо за советы! Займусь реализацией, как будет возможность и отпишусь по результатам

"Зверев Александр" написал:
Мне кажется, автору темы этого будет недостаточно. Ведь "карандаш красный №1" должен быть ниже, чем "карандаш зелёный №2". Тут надо делить строку на буквы и цифры, цифры дополнять слева нулями до одинаковой длины и соединять обратно.

да, был невнимателен)
в таком случае лучше поле писать на клиенте (в террасофт, а не в БД) на стадии insert\update, а не выбирать в запросе

брать числа после "№" и дописывать их нулями до одинаковой длины.

Но, это не панацея - что если пользователь напишет номер после "#" или вообще просто так "карандаш 2"? тогда, конечно, можно регэкспами решить, но что, если он напишет карандаш версия 2 зеленый №3? т.е. "версия 2" обрабатывать не надо, а "№3" надо...

Здравтсвуйте, Дмитрий!
Думаю, что в данном случае, когда речь идет о наименовании товаров, не должно возникать ситуаций, когда пользователь обзывает товар, как хочет.
Должны быть четкие регламенты по определению названия для товаров, чтобы было проще ориентироваться.
Если речь идет о версиях товара, то можно, например, добавить поле для ввода версии, а потом назавние будет дополняться содержимым этого поля автоматически.

Показать все комментарии