Упорядочивание в зависимости от параметра

1. PerlAmutor 129 17.01.17 14:49 Сейчас в теме
Хочу сделать разную сортировку результата в зависимости от параметра. Накидал тестовый пример, но он не работает

ВЫБРАТЬ 
	3 КАК НомерСтроки,
	"ААА" КАК Наименование
ПОМЕСТИТЬ втТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	2 КАК НомерСтроки,
	"БББ" КАК Наименование
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	1 КАК НомерСтроки,
	"ВВВ" КАК Наименование
;
ВЫБРАТЬ
	*
ИЗ втТаблица
УПОРЯДОЧИТЬ ПО
	ВЫБОР КОГДА &Параметр = ИСТИНА ТОГДА
		1
	ИНАЧЕ
		2
	КОНЕЦ ВОЗР
Показать


При этом такое упорядочивание работает (сортирует именно по 2 полю):

// ...
УПОРЯДОЧИТЬ ПО
    2


и такое тоже работает:
// ...
УПОРЯДОЧИТЬ ПО
	ВЫБОР КОГДА &Параметр = ИСТИНА ТОГДА
		НомерСтроки
	ИНАЧЕ
		Наименование
	КОНЕЦ ВОЗР
Показать


Почему вариант с "ВЫБОР КОГДА" с номером поля не отрабатывает?
SIrina9; +1
По теме из базы знаний
Найденные решения
14. PerlAmutor 129 17.01.17 16:58 Сейчас в теме
В общем это не одно и то же, т.к. в случае с использованием "ВЫБОР" в "УПОРЯДОЧИТЬ" результатом должен являтся ПРИОРИТЕТ. Тут вроде неплохо разъяснено. Ну а моя задача решается тогда просто:
ВЫБРАТЬ 
	3 КАК НомерСтроки,
	"ААА" КАК Наименование,
	0 КАК Значение
ПОМЕСТИТЬ втТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	2 КАК НомерСтроки,
	"БББ" КАК Наименование,
	1 КАК Значение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	1 КАК НомерСтроки,
	"ВВВ" КАК Наименование,
	4 КАК Значение
;
ВЫБРАТЬ
	*
ИЗ втТаблица
УПОРЯДОЧИТЬ ПО
	ВЫБОР КОГДА &Параметр ТОГДА
		Наименование
	ИНАЧЕ
		НомерСтроки
	КОНЕЦ ВОЗР
Показать
SIrina9; +1
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vovan_victory 63 17.01.17 14:59 Сейчас в теме
(1)

Запрос.Текст = "
.........................
............................... 
|УПОРЯДОЧИТЬ ПО
	Ссылка //Направление"

Если Условие Тогда
 Запрос.Текст = СтрЗаменить(Запрос.Текст,"//Направление","УБЫВ");
Иначе
 Запрос.Текст = СтрЗаменить(Запрос.Текст,"//Направление","");
КонецЕсли;
Показать
+
3. PerlAmutor 129 17.01.17 15:08 Сейчас в теме
(2) Подобный код активно используется в конфигурации ERP. Этот код претендует на звание основного варианта решения вопроса. Но код с "ВЫБРАТЬ" также используется в коде конфигурации, хоть и очень редко. Хочу понять как он работает. Меня именно этот вариант сейчас интересует.
+
4. vovan_victory 63 17.01.17 15:17 Сейчас в теме
(3)
Но код с "ВЫБРАТЬ" также используется в коде конфигурации

пример кода покажите
+
5. PerlAmutor 129 17.01.17 15:30 Сейчас в теме
(4) Общий модуль ВзаиморасчетыСервер:
		Запрос = Новый Запрос("
		|ВЫБРАТЬ
		|	РасчетыСКлиентами.ЗаказКлиента КАК Заказ,
		|	РасчетыСКлиентами.Валюта КАК ВалютаВзаиморасчетов,
		|	(-РасчетыСКлиентами.КОплатеОстаток) КАК СуммаВзаиморасчетов
		|ИЗ
		|	РегистрНакопления.РасчетыСКлиентами.Остатки(,
		|		ЗаказКлиента В (&ОбъектыРасчетов)
		|	) КАК РасчетыСКлиентами
		|ГДЕ
		|	РасчетыСКлиентами.СуммаОстаток < 0
		|УПОРЯДОЧИТЬ ПО
		|	ВЫБОР КОГДА РасчетыСКлиентами.ЗаказКлиента ССЫЛКА Документ.ВозвратТоваровОтКлиента ТОГДА
		|		1
		|	ИНАЧЕ
		|		2
		|	КОНЕЦ
		|");
Показать
+
6. vovan_victory 63 17.01.17 15:41 Сейчас в теме
(5)а результат сортировки какой получается после этой сортировки? Не понятно, по какому полю сортируется...
+
7. Plash 4 17.01.17 15:50 Сейчас в теме
Разве сортировка осуществляется не по Реквизитам запроса (НомерСтроки, Наименование)

По умолчанию сортировка по наименованию, какие флаги ей не ставь. Почему вы уверены что работает, не пойму.
Да и 1 и 2 это разве указатель на номер реквизита в запросе?
+
9. PerlAmutor 129 17.01.17 16:02 Сейчас в теме
(7)
Да и 1 и 2 это разве указатель на номер реквизита в запросе?


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


(6)
а результат сортировки какой получается после этой сортировки? Не понятно, по какому полю сортируется...


Нет возможности проверить.
+
10. vovan_victory 63 17.01.17 16:12 Сейчас в теме
(9)
Нет возможности проверить.

а как же Вы тогда утверждаете, что работает?


Судя по
        |    РасчетыСКлиентами.ЗаказКлиента КАК Заказ,
        |    РасчетыСКлиентами.Валюта КАК ВалютаВзаиморасчетов,

понять сложно как сортируется..если заказ один и валюта одна. Если в результате несколько строк получается, можно попробовать поменять с 2 на 3(чтобы понять работает или нет)
+
11. PerlAmutor 129 17.01.17 16:17 Сейчас в теме
(10)
а как же Вы тогда утверждаете, что работает?


Потому, что мой запрос из первого поста работает и сортирует по выбранному номеру поля. Но стоит использовать его вместе с "ВЫБОР", как сортировать прекращает.
+
8. Plash 4 17.01.17 15:54 Сейчас в теме
Секция УПОРЯДОЧИТЬ ПО как понятно из названия сортирует результат запроса определенным образом - либо по-убыванию, либо по-возрастанию. В эту секцию необходимо передать поля по которым будет производится сортировка и указать метод для каждого из них (убывание, возрастание). Если метод не указан, то сортировка происходит по-возрастанию. Порядок полей в секции имеет принципиальное значение, если в результате запроса окажутся записи с одинаковыми полями, то эти записи будут отсортированы по второму полю, если оно указано или по внутреннему идентификатору, если второе сортировочное поле не указано. И так далее. сортировка происходит рекурсивно по всем указанным полям.
+
12. пользователь 17.01.17 16:20
Сообщение было скрыто модератором.
...
13. PerlAmutor 129 17.01.17 16:25 Сейчас в теме
Вот может кого на мысли наведет, такая ошибка, если указать 0 индекс:

В предложениях УПОРЯДОЧИТЬ ПО и ИНДЕКСИРОВАТЬ ПО из констант могут быть только целые числа больше нуля, не превышающие число результирующих полей


И похоже, что это нормальная ситуация. Вот из статьи англоязычной, применительно к MSSQL:

USE AdventureWorks
GO
-- ColumnName (Recommended)
SEL ECT *
FROM HumanResources.Department
ORDER BY GroupName, Name
GO
-- ColumnNumber (Strongly Not Recommended)
SELECT *
FR OM HumanResources.Department
ORDER BY 3,2
GO
Показать


Осталось понять что именно меняется для случая SWITCH..CASE в ORDER BY
+
14. PerlAmutor 129 17.01.17 16:58 Сейчас в теме
В общем это не одно и то же, т.к. в случае с использованием "ВЫБОР" в "УПОРЯДОЧИТЬ" результатом должен являтся ПРИОРИТЕТ. Тут вроде неплохо разъяснено. Ну а моя задача решается тогда просто:
ВЫБРАТЬ 
	3 КАК НомерСтроки,
	"ААА" КАК Наименование,
	0 КАК Значение
ПОМЕСТИТЬ втТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	2 КАК НомерСтроки,
	"БББ" КАК Наименование,
	1 КАК Значение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	1 КАК НомерСтроки,
	"ВВВ" КАК Наименование,
	4 КАК Значение
;
ВЫБРАТЬ
	*
ИЗ втТаблица
УПОРЯДОЧИТЬ ПО
	ВЫБОР КОГДА &Параметр ТОГДА
		Наименование
	ИНАЧЕ
		НомерСтроки
	КОНЕЦ ВОЗР
Показать
SIrina9; +1
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот