Как сделать свою "хитрую" пользовательскую сортировку?
"Внезапно" (как это часто бывает) обнаружилось, что элементы базы требующие отображения в отсортированном виде отображаются не так как хотелось бы пользователям.
Дело всё в том, что когда пользователь, например, вводит какие-нибудь товары, в названии которых есть и буквенная часть и числовая (представляющая порядковый номер)
ручка
резинка
ножницы
карандаш красный №1
карандаш красный №2
карандаш красный №3
...
карандаш красный №9
карандаш красный №10
и этот пользователь хочет отсортировать продукты по алфавиту, то он получит:
карандаш красный №1
карандаш красный №10
карандаш красный №2
карандаш красный №3
...
карандаш красный №9
ножницы
резинка
ручка
И вот тут на примере карандашей видим проблему:
После номера 1 идёт 10, а не 2 так как сравниваются коды символов стоящих под соответствующими номерами,
Так как поле текстовое, то другой сортировки ожидать и не приходится
Суть вопроса: есть-ли шанс переписать механизмы сортировки, так, чтобы текстовое поле парсилось на наличие цифр, или сортировка идёт в ядре, "куда простым смертным путь заказан"?
Нравится
Можно создать в 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" надо...
Здравтсвуйте, Дмитрий!
Думаю, что в данном случае, когда речь идет о наименовании товаров, не должно возникать ситуаций, когда пользователь обзывает товар, как хочет.
Должны быть четкие регламенты по определению названия для товаров, чтобы было проще ориентироваться.
Если речь идет о версиях товара, то можно, например, добавить поле для ввода версии, а потом назавние будет дополняться содержимым этого поля автоматически.