FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9210
Вход
Функция для правильной сортировки чисел в текстовых полях

При обычной сортировке название "Аптека N15" попадает между "Аптека N1" и "Аптека N2". Данная функция сортирует такие строки правильно.


 
Прислал: Игорь Ильин   Категория: Работа с данными


Функция для правильной сортировки чисел в текстовых полях

Вам не приходилось сталкиваться с проблемой, когда при сортировке названий организаций, адресов, или наименований товаров строки располагаются не совсем так, как ожидает пользователь? Например:

Доска 100мм --> Доска 80мм
Аптека N1 --> Аптека N15 --> Аптека N2
ул.Центральная д.100 --> ул.Центральная д.15

Эта простая функция решает задачу.


Протестировано в VFP6-7-8.

В VFP5 данный код не работает из-за отличающегося поведения функции Subsr()

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


 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.975) Вложение [3.26]kb
Дополнения пользователей
Функция для правильной сортировки чисел в текстовых полях
[+][?]
Щербаков Сергей Дмитриевич
03.11.04 18:08:06

Да, полезная вещица :)
На всякий случай передаю вариант автодемонстрации
** Готовый текст для неоднократного автопросмотра вариантов сортировки
** === Вариант машинной сортировки
=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

Нет, конечно :)

Ну а если добавишь коммент про авторство - так еще и благодарен буду ;-)
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика