Здравствуйте,сдал тестовое задание руководителю, но руководитель хотел бы на любую выбранную дату,которую ему захочется, вывести отчет по всем различным номенклатурам в регистре (последняя,предпоследняя цены и изменение цены в процентах), реализовать одним запросом,можно использовать подзапросы и конструкцию поместить, если есть параметр дата, то запрос пишется сложнее или легче?
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще, ведь когда критерием "последнего" является не одно поле "Дата", а сложная сортировка по ряду полей, то соединения
становятся сложными и неповоротливыми.
Что то тема популярная с предыдущими ценами.
Отвечал уже многократно
Вот примерчег К тому шаблону, Во временную таблицу добавить Максимум по текущему периоду
В результирующем запросе 2 соединения, по Текущему и Прошлому
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще, ведь когда критерием "последнего" является не одно поле "Дата", а сложная сортировка по ряду полей, то соединения
становятся сложными и неповоротливыми.
(6) (8)
Задача: "Получить 5 последних продаж по всем партнерам" в ИБ с тысячами документов в день.
Алгоритмы обхода и пакеты с кучей соединений приводили к неприемлемому времени
получения результата, но АВТОНОМЕРЗАПИСИ() как раз помог. Ниже инструкция как использовать АВТОНОМЕРЗАПИСИ() и критерий "последних" при сложной сортировке.
Идею получения последних 5 документов по каждому Партнеру реализуем на новой
функции запросов АВТОНОМЕРЗАПИСИ().
сначала идет описание логики решения, в внизу готовый запрос для консоли или СКД.
Даны такие ограничения системы и постановки задачи:
1. АВТОНОМЕРЗАПИСИ() работает только для временных таблиц;
2. Временные таблицы нельзя сортировать;
3. Нумеровать необходимо уже отсортированные документы;
4. Во вложенных запросах нельзя применять операцию УПОРЯДОЧИТЬ ПО без использования конструкции ПЕРВЫЕ.
Согласно условиям выше, чтобы пролучить пронумерованную по порядку таблицу документов используем
вложенный запрос для сортировки и АВТОНОМЕРЗАПИСИ() во внешнем запросе.
Причем, во вложенном ставим очень большое число, которое заведомо больше количества документов в БД.
1.
ВАЖНО1: Если установить значение парметра запроса "ДатаНачала", то будут выбираться документы
только после этой даты, а что было в прошлом нам не интересно.
ВАЖНО2: Во вложенном запросе необходимо сортировать только в таком порядке "Партнер, Дата"
Тогда в первой временной таблице "ВтДокументыПоПорядкуВсе" получим примерно такой состав данных:
3.
Далее получаем "ВтДокументыПоПартнеруПоследние"
Если пареметр запроса "КоличествоПоследних" = 5, то будут выбраны
только последние 5 документов по каждому партнеру и получим такую вт:
Собственно на этом все и "ВтДокументыПоПартнеруПоследние"
можно использовать в результирующем запросе.
Если это запрос в коде, то результирующий запрос группируем или Итоги по для наглядности.
Если это запрос в СКД, то результирующий запрос НЕ группируем - СКД все сделает сама по настройкам.
Готовый запрос для консоли
(секция в последнем пакете ВЫБРАТЬ ПЕРВЫЕ 100 только для того чтобы быстро понять, что все работает):
ВЫБРАТЬ
ДокументыПоПорядкуВсе.Партнер КАК Партнер,
ДокументыПоПорядкуВсе.Документ КАК Документ,
АВТОНОМЕРЗАПИСИ() КАК Порядок
ПОМЕСТИТЬ ВтДокументыПоПорядкуВсе
ИЗ
(ВЫБРАТЬ ПЕРВЫЕ 1000000000
РеализацияТоваровУслуг.Партнер КАК Партнер,
РеализацияТоваровУслуг.Ссылка КАК Документ
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Проведен
И РеализацияТоваровУслуг.Дата >= &ДатаНачала
УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслуг.Партнер,
РеализацияТоваровУслуг.Дата) КАК ДокументыПоПорядкуВсе
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВтДокументыПоПорядкуВсе.Партнер КАК Партнер,
МАКСИМУМ(ВтДокументыПоПорядкуВсе.Порядок) КАК ПорядокМакс
ПОМЕСТИТЬ ВтПорядокМаксПоПартнеру
ИЗ
ВтДокументыПоПорядкуВсе КАК ВтДокументыПоПорядкуВсе
СГРУППИРОВАТЬ ПО
ВтДокументыПоПорядкуВсе.Партнер
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВтДокументыПоПорядкуВсе.Партнер КАК Партнер,
ВтДокументыПоПорядкуВсе.Документ КАК Документ
ПОМЕСТИТЬ ВтДокументыПоПартнеруПоследние
ИЗ
ВтДокументыПоПорядкуВсе КАК ВтДокументыПоПорядкуВсе
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтПорядокМаксПоПартнеру КАК ВтПорядокМаксПоПартнеру
ПО ВтДокументыПоПорядкуВсе.Партнер = ВтПорядокМаксПоПартнеру.Партнер
ГДЕ
ВтДокументыПоПорядкуВсе.Порядок > ВтПорядокМаксПоПартнеру.ПорядокМакс - &КоличествоПоследних
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 100
ВтДокументыПоПартнеруПоследние.Партнер КАК Партнер,
ВтДокументыПоПартнеруПоследние.Документ КАК Документ,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
ВтДокументыПоПартнеруПоследние КАК ВтДокументыПоПартнеруПоследние
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВтДокументыПоПартнеруПоследние.Документ = РеализацияТоваровУслуг.Ссылка
ИТОГИ
СУММА(СуммаДокумента)
ПО
Партнер
(14)Что то про вложенный запрос я не подумал. В таком случае можно ограничить запрос с помощью Имеющие(блин ни как не могу запомнить синтаксис всегда пишу HAVING)
на выбранную дату вывести список всех номенклатур (оприходованных товаров) с последней и предпоследней ценой для каждой и изменением в процентах - то есть здесь,я так понял запрос вычисляющий как раз предпоследнюю и последнюю даты можно оставить как есть, там в конструкторе запросов по умолчанию высвечивается период, его получается,просто включить в пользовательских настройках и дальше она на дату будет смотреть последние изменения цены,ведь так?
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще
Увы работает только во временной таблице, а там сортировки нет, Агрегатные функции использовать нельзя
Такой запрос выдаст бред
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
АВТОНОМЕРЗАПИСИ() КАК НомерСтроки
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
Справочник.Номенклатура КАК Номенклатура
ИНДЕКСИРОВАТЬ ПО
НомерСтроки,
Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица.НомерСтроки КАК НомерСтроки,
ВременнаяТаблица.Ссылка КАК Ссылка
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
УПОРЯДОЧИТЬ ПО
ВременнаяТаблица.Ссылка.Наименование