Функция для правильной сортировки чисел в текстовых полях
Вам не приходилось сталкиваться с проблемой, когда при сортировке названий организаций, адресов,
или
наименований товаров строки располагаются не совсем так, как ожидает пользователь? Например:
Да, полезная вещица :)
На всякий случай передаю вариант автодемонстрации
** Готовый текст для неоднократного автопросмотра вариантов сортировки
** === Вариант машинной сортировки
=MESSAGEBOX("Вариант машинной сортировки.",64,3000)
Use table1
replace name2 WITH "" ALL
Index on name1 to temp
SET ORDER TO temp
GO top
BROWSE && Строки сортируются в "машинном" понимании сортировки
** === Вариант продуманной сортировки
=MESSAGEBOX("Вариант продуманной сортировки.",64,3000)
Index on SortName(name1) to temp1
SET ORDER TO temp1
GO top
BROWSE && Строки сортируются более интеллектуально
** === Демонстрация работы SortName
=MESSAGEBOX("Демонстрация работы SortName."+CHR(13)+ ;
"Наблюдаем содержимое поля Name2",64,3000)
Replace name2 with SortName(Name1) all
GO TOP
BROWSE && Смотрим на содержимое поля Name2
USE
CANCEL
Igor Ilyin
04.11.04 12:05:17
Спасибо, мысль понял :) Добавлю в пример.
Igor Ilyin
09.11.04 11:03:19
Выложил новый дистрибутив. Добавлена демонстрация работы функции. Спасибо Щербакову С.Д. за идею.
Igor Ilyin
15.11.04 00:21:14
Вчера листал справочник "Жёлтые страницы". Аптеки там расположены правильно, а вот СМУ - нет.
Видимо, сортировали вручную :))). Заняться, что ли, изданием телефонных справочников? По крайней
мере, одно конкурентное преимущество у меня уже есть ;)
Roman Koltsov
11.10.05 06:08:26
Что-то сразу данная функция у меня не заработала. Запустил ее под отладчиком и обнаружил следующий
интересный факт, что нижеследующий блок исходного кода следует немного переписать, для того, чтобы
он у всех работал корректно:
*** ищем конец блока цифр
lnTextStart = lnDigitStart + 1
DO while Substr(lcDummyName, lnTextStart ) = DIGIT_DUMMY
lnTextStart = lnTextStart + 1
EndDo
Предлагаемый мной подход, с учетом того, что определено:
#DEFINE DIGIT_DUMMY "0"
*** ищем конец блока цифр
lnTextStart = lnDigitStart + 1
DO while Substr(lcDummyName, lnTextStart, 1) == DIGIT_DUMMY
lnTextStart = lnTextStart + 1
EndDo
Исправленный вариант работает верно при любых установках SET...
karly™
11.10.05 09:40:36
fixed
Спасибо за замечание :)
Aries
20.07.06 12:41:14
Игорь, не возражаешь, если я включу твою сортировку
в свой класс хидера?
karly™
20.07.06 14:06:26
Нет, конечно :)
Ну а если добавишь коммент про авторство - так еще и благодарен буду ;-)