Хочу сделать разную сортировку результата в зависимости от параметра. Накидал тестовый пример, но он не работает
ВЫБРАТЬ
3 КАК НомерСтроки,
"ААА" КАК Наименование
ПОМЕСТИТЬ втТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2 КАК НомерСтроки,
"БББ" КАК Наименование
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1 КАК НомерСтроки,
"ВВВ" КАК Наименование
;
ВЫБРАТЬ
*
ИЗ втТаблица
УПОРЯДОЧИТЬ ПО
ВЫБОР КОГДА &Параметр = ИСТИНА ТОГДА
1
ИНАЧЕ
2
КОНЕЦ ВОЗР
Показать
При этом такое упорядочивание работает (сортирует именно по 2 полю):
// ...
УПОРЯДОЧИТЬ ПО
2
и такое тоже работает:
// ...
УПОРЯДОЧИТЬ ПО
ВЫБОР КОГДА &Параметр = ИСТИНА ТОГДА
НомерСтроки
ИНАЧЕ
Наименование
КОНЕЦ ВОЗР
Показать
Почему вариант с "ВЫБОР КОГДА" с номером поля не отрабатывает?
В общем это не одно и то же, т.к. в случае с использованием "ВЫБОР" в "УПОРЯДОЧИТЬ" результатом должен являтся ПРИОРИТЕТ. Тут вроде неплохо разъяснено. Ну а моя задача решается тогда просто:
ВЫБРАТЬ
3 КАК НомерСтроки,
"ААА" КАК Наименование,
0 КАК Значение
ПОМЕСТИТЬ втТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2 КАК НомерСтроки,
"БББ" КАК Наименование,
1 КАК Значение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1 КАК НомерСтроки,
"ВВВ" КАК Наименование,
4 КАК Значение
;
ВЫБРАТЬ
*
ИЗ втТаблица
УПОРЯДОЧИТЬ ПО
ВЫБОР КОГДА &Параметр ТОГДА
Наименование
ИНАЧЕ
НомерСтроки
КОНЕЦ ВОЗР
Запрос.Текст = "
.........................
...............................
|УПОРЯДОЧИТЬ ПО
Ссылка //Направление"
Если Условие Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"//Направление","УБЫВ");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст,"//Направление","");
КонецЕсли;
(2) Подобный код активно используется в конфигурации ERP. Этот код претендует на звание основного варианта решения вопроса. Но код с "ВЫБРАТЬ" также используется в коде конфигурации, хоть и очень редко. Хочу понять как он работает. Меня именно этот вариант сейчас интересует.
Запрос = Новый Запрос("
|ВЫБРАТЬ
| РасчетыСКлиентами.ЗаказКлиента КАК Заказ,
| РасчетыСКлиентами.Валюта КАК ВалютаВзаиморасчетов,
| (-РасчетыСКлиентами.КОплатеОстаток) КАК СуммаВзаиморасчетов
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Остатки(,
| ЗаказКлиента В (&ОбъектыРасчетов)
| ) КАК РасчетыСКлиентами
|ГДЕ
| РасчетыСКлиентами.СуммаОстаток < 0
|УПОРЯДОЧИТЬ ПО
| ВЫБОР КОГДА РасчетыСКлиентами.ЗаказКлиента ССЫЛКА Документ.ВозвратТоваровОтКлиента ТОГДА
| 1
| ИНАЧЕ
| 2
| КОНЕЦ
|");
Разве сортировка осуществляется не по Реквизитам запроса (НомерСтроки, Наименование)
По умолчанию сортировка по наименованию, какие флаги ей не ставь. Почему вы уверены что работает, не пойму.
Да и 1 и 2 это разве указатель на номер реквизита в запросе?
Да и 1 и 2 это разве указатель на номер реквизита в запросе?
Да, я проверял через обработку консоли запросов. Если ноль поставить, то ругается, что должно быть больше нуля и меньше или равно количеству результирующих полей.
| РасчетыСКлиентами.ЗаказКлиента КАК Заказ,
| РасчетыСКлиентами.Валюта КАК ВалютаВзаиморасчетов,
понять сложно как сортируется..если заказ один и валюта одна. Если в результате несколько строк получается, можно попробовать поменять с 2 на 3(чтобы понять работает или нет)
Потому, что мой запрос из первого поста работает и сортирует по выбранному номеру поля. Но стоит использовать его вместе с "ВЫБОР", как сортировать прекращает.
Секция УПОРЯДОЧИТЬ ПО как понятно из названия сортирует результат запроса определенным образом - либо по-убыванию, либо по-возрастанию. В эту секцию необходимо передать поля по которым будет производится сортировка и указать метод для каждого из них (убывание, возрастание). Если метод не указан, то сортировка происходит по-возрастанию. Порядок полей в секции имеет принципиальное значение, если в результате запроса окажутся записи с одинаковыми полями, то эти записи будут отсортированы по второму полю, если оно указано или по внутреннему идентификатору, если второе сортировочное поле не указано. И так далее. сортировка происходит рекурсивно по всем указанным полям.
Вот может кого на мысли наведет, такая ошибка, если указать 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
В общем это не одно и то же, т.к. в случае с использованием "ВЫБОР" в "УПОРЯДОЧИТЬ" результатом должен являтся ПРИОРИТЕТ. Тут вроде неплохо разъяснено. Ну а моя задача решается тогда просто:
ВЫБРАТЬ
3 КАК НомерСтроки,
"ААА" КАК Наименование,
0 КАК Значение
ПОМЕСТИТЬ втТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2 КАК НомерСтроки,
"БББ" КАК Наименование,
1 КАК Значение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1 КАК НомерСтроки,
"ВВВ" КАК Наименование,
4 КАК Значение
;
ВЫБРАТЬ
*
ИЗ втТаблица
УПОРЯДОЧИТЬ ПО
ВЫБОР КОГДА &Параметр ТОГДА
Наименование
ИНАЧЕ
НомерСтроки
КОНЕЦ ВОЗР