powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сортировка
7 сообщений из 7, страница 1 из 1
Сортировка
    #35155058
IgorProgrammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно решить проблему (класса грид)
Есть условная таблица(курсор)
Код Тазвание Цена
1-1 Товар1 10
2-3 Товар2 8
1-2 Товар3 9

При нажатии на колонку таблица должна сортироваться с пожеланием пользователя...
Кликнул с шифтом добавился индекс если уже существует, то отсортировать asc/desc
Кликнул с ctrl удалили индекс

Пока приходит только одно решение...
Каждый раз при клике пересобирать курсор с нужной сортировкой...
типа
select * from таблица order by cena desc, code asc

Но существет проблемка с символьными кодами... 1-1 они сортируются через функцию _sort в классе колонке стоит имя функции для сортировки с параметрами в данном случае _sort(1,code)
что б неБыло проблем с отображением типа:
не правильно правильно
1-1 1-1
1-10 1-2
1-2 1-10
Но для сортировки через функцию надо уже совсем другой селект типа:
select *, _sort(1,code) as Col1 from таблица order by Col1,cena
Где Col1 это имя колонки (соответственно при следующем селекте уже делать анализ)
если такая колонка существует, то просто выбрать ее(для ускорения)

Но вся Эт идеология через-Чур муторная получается...
Может кто-то сталкивался с такой проблемой и может направить на путЪ истинный

Сейчас грид работает с сортировкой по одному полю... И туда еще куча прибамбахов натыкано...
Типа красивая всплывающая подсказка, фильтр (собери сам :) ), DragAndDrop внутри и с паралельных проектов... и т. д.
Разрушать все Это не хочется... Но как говорится, кто платит то и музыку заказывает...

С Ув. Игорь.
...
Рейтинг: 0 / 0
Сортировка
    #35155127
Код: plaintext
1.
select *, val(substr(code,  1 , atc("-", code) - 1 )) as code1, val(substr(code, atc("-", code) +  1 )) as code2 order by code1, code2, ... 
...
Рейтинг: 0 / 0
Сортировка
    #35155159
IgorProgrammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий Маликовselect *, val(substr(code, 1, atc("-", code) -1)) as code1,
val(substr(code, atc("-", code) + 1)) as code2 order by code1, code2,

Вопрос не вправильности селекта...
Хоть ваш вариант и не подходит...
...
Рейтинг: 0 / 0
Сортировка
    #35155185
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это курсор, то индексируй его через INDEX ON ...
Проверка наличия индекса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
llRet = .F.
lcOrder = upper('MyOrder')
for i =  1  to tagcount('', "MyCursor")
	if upper(tag(i,"MyCursor")) == lcOrder
		llRet=.t.
		exit
	endif
endfor
SET ORDER TO ... - выбор индекса
Смотри хэлп про функции KEY(), ORDER(), TAG(), DESCENDING(), TAG()

при REQUERY() индексы обновляются
...
Рейтинг: 0 / 0
Сортировка
    #35155237
IgorProgrammer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TИндекс

У меня сейчас и работает по одному индексу...

А надо что Б в зависимости что пользователь наклацает, выстроить ему таблицу...
по разным полям(некоторые отсортированы через функции) и некоторые по возрастанию, а некоторые по убыванию...

SET ORDER TO не позволяет такого делать...
...
Рейтинг: 0 / 0
Сортировка
    #35155275
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сортировка
    #35155329
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorProgrammer Dima TИндекс

У меня сейчас и работает по одному индексу...

А надо что Б в зависимости что пользователь наклацает, выстроить ему таблицу...
по разным полям(некоторые отсортированы через функции) и некоторые по возрастанию, а некоторые по убыванию...

SET ORDER TO не позволяет такого делать...

А значения какого типа? для обратной сортировки чисел достаточно их с минусом взять: str(99999999 - [число], N) где N размер поля, 9999999 это девятка N+1 раз
Для дат - str([максимальная дата] - [дата])
хуже всего со строками, хотя можно функцию сделать для переворачивания строки. Коды символов менять на 255-код например, если collate = RUSSIAN, то с этим еще поизвращатся придется.
Изврат конечно получится, но работать должно.

Например сделать функцию конвертации строки Revert(MyField) такую чтобы возвращала значение в результате которого получается обратная сортировка по MyField, тогда для тех полей что надо в обратном порядке эту функцию задействовать. Например: index on str(Field1) + Revert(Field2) + Field3 ...

Второй вариант твой селект ID записей из исходного курсора, затем в исходном курсоре поле "порядок сортировки" и заполнить по RECNO() первого и отсортировать.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сортировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]