Последняя дата продажи и поступления. Обычные формы.
Всем доброго дня! УТ 10.3. Подскажите, как в запросе вытащить еще и дату последней продажи ?
ВЫБРАТЬ
ПартииТоваровНаСкладах.Номенклатура,
МАКСИМУМ(ПартииТоваровНаСкладах.Регистратор.Дата) КАК ДатаПоступления
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
И ПартииТоваровНаСкладах.ВидДвижения = &ВидДвижения //приход
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладах.Номенклатура
ПоказатьПо теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
ВЫБРАТЬ
"Продажа" КАК операция,
МАКСИМУМ(Продажи.Период) КАК Дата
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Номенклатура = &Номенклатура
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Поступление",
МАКСИМУМ(ПоступлениеТоваровУслугТовары.Ссылка.Дата)
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
ПоступлениеТоваровУслугТовары.Номенклатура = &Номенклатура
И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
ПоказатьВЫБРАТЬ
Продажи.Номенклатура,
Продажи.ХарактеристикаНоменклатуры,
МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ Количество > 0
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура,
Продажи.ХарактеристикаНоменклатуры
ПоказатьДумаю, вы понимаете к чему приведет в вашем первом запросе ПартииТоваровНаСкладах.Регистратор.Дата, в плане производительности?
Да и в моем запросе тоже я бы подумал хотя бы о том, что дата последней продажи более чем за, скажем, текущие 365 дней уже никого не волнует.
Ладно, будем полагать, что это нечастый запрос и что у вас в СУБД читатели не блокируют писателей.
(2)Спасибо, дату поступления сделал аналогично вашему запросу. Так Лучше ?
ВЫБРАТЬ
ПартииТоваровНаСкладах.Номенклатура,
МАКСИМУМ(ПартииТоваровНаСкладах.Период) КАК ДатаПоступления
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
ПартииТоваровНаСкладах.Номенклатура В Иерархии (&Номенклатура)
И ПартииТоваровНаСкладах.ВидДвижения = &ВидДвижения //приход
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладах.Номенклатура
Показать
(3) Да.
Теперь вы избавились от множества неявных левых соединений.
Правда, запрос с В Иерархии тоже тяжелый.
Чтобы не повторять тоже и в продажах рекомендуется сделать так (хар-ку давайте опустим, будем считать что у вас не ведется учет по хар-ам):
Теперь вы избавились от множества неявных левых соединений.
Правда, запрос с В Иерархии тоже тяжелый.
Чтобы не повторять тоже и в продажах рекомендуется сделать так (хар-ку давайте опустим, будем считать что у вас не ведется учет по хар-ам):
ВЫБРАТЬ
ПартииТоваровНаСкладах.Номенклатура,
МАКСИМУМ(ПартииТоваровНаСкладах.Период) КАК ДатаПоступления
Поместить ВТ
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
ПартииТоваровНаСкладах.Номенклатура В Иерархии (&Номенклатура)
И ПартииТоваровНаСкладах.ВидДвижения = &ВидДвижения //приход
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладах.Номенклатура
ИНДЕКСИРОВАТЬ ПО ПартииТоваровНаСкладах.Номенклатура;
ВЫБРАТЬ
Продажи.Номенклатура,
МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ Количество > 0
И Продажи.Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ)
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура,
Показать
Вариант 1 - Вытягивайте склад из ДокументПродажи и отбирайтесь.
Вариант 2 - используйте вместо Продажи РН.ТоварыНаСкладах, отбираясь по виду движения - расход, складу, виду регистратора - уж чем вы там продаете (ЧекККМ, ЧекККМКоррекции, ОтчетОРозничныхПродажах, РТУ и т.п.).
Скачайте УТ, там куча отчетов.
Отвечающих на множество вопросов типа, "а теперь мне нужен курс валюты на каждую дату продажи" или "а как учесть в продажах возвраты", или "а движения документа корректировки регистров надо учитывать в посл. продаже" и т.д. и т.п
P.S.
На всякий случай, использовать РН.ПартииТоваровНаСкладах для определения продаж не надо бы, по ряду причин.
Вариант 2 - используйте вместо Продажи РН.ТоварыНаСкладах, отбираясь по виду движения - расход, складу, виду регистратора - уж чем вы там продаете (ЧекККМ, ЧекККМКоррекции, ОтчетОРозничныхПродажах, РТУ и т.п.).
Скачайте УТ, там куча отчетов.
Отвечающих на множество вопросов типа, "а теперь мне нужен курс валюты на каждую дату продажи" или "а как учесть в продажах возвраты", или "а движения документа корректировки регистров надо учитывать в посл. продаже" и т.д. и т.п
P.S.
На всякий случай, использовать РН.ПартииТоваровНаСкладах для определения продаж не надо бы, по ряду причин.
(7)мне без соединения не обойтись, мне нужны еще данные из таблицы. Если склад вытаскиваю из Документа продажи РН, то запрос 18 сек идет, если из документа ОтчетОРозничныхПродажах(через него продажи), то 6 секунд, что тоже не мало. Причем строк в ВТТ 300.
Выбрать
ВТТ.Склад,
ВТТ.Номенклатура,
ВТТ.Остаток Как Остаток,
ВТТ.СуммаОстаток КАК СуммаОстаток,
ВТТ.ДатаПоступления,
Максимум(ОтчетОрозничныхПродажахТовары.Ссылка.Дата) как ПоследняяДатаПродажи
// МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи
ИЗ ВТТ как ВТТ
// Левое соединение
// РегистрНакопления.Продажи КАК Продажи ПО Продажи.Номенклатура = ВТТ.Номенклатура
// ГДЕ Продажи.Количество > 0 и
// Продажи.ДокументПродажи.Склад = ВТТ.Склад
Левое СОЕДИНЕНИЕ Документ.ОтчетОрозничныхПродажах.Товары КАК ОтчетОрозничныхПродажахТовары
ПО (ОтчетОрозничныхПродажахТовары.Номенклатура = ВТТ.Номенклатура)
И ОтчетОрозничныхПродажахТовары.Ссылка.Склад = ВТТ.Склад
Сгруппировать ПО
ВТТ.Склад,
ВТТ.Номенклатура,
ВТТ.ДатаПоступления,
ВТТ.Остаток,
ВТТ.СуммаОстаток
Показать
(8)
Кто вам сказал, что продажи оформляются только документом ОтчетОРозничныхПродажах?
По поводу левого соединения в вашем примере (хммм... "изобретательно" - не надо так):
Если хотите скрестить ужа по дате поступления и ежа по дате последней продажи, то делайте 3-и таблицы - в одной уж, в другой еж, в третьей соединение ужа с ежом.
Сколько выполняется такой вот код:
И, да, вот это вот "Продажи.ДокументПродажи.Склад" отсыпет вам левых соединений по числу регистраторов.
Еще не мешает проверить во всех ли документах продажи есть склад, если нет, то придется все же по РН.
Напоминаю - тянете продажи за весь период работы, если это нужно для какого-то хитрого отчета, то пусть выполняется хоть 30 минут.
Это только аналитику интересно (один раз за время его работы) узнать что у вас такой-то невнятный товар последний раз продался в 1913 году с ныне неиспользуемого склада.
В остальных случаях урезайте осетра, т.е. делайте ограничения по дате.
Кто вам сказал, что продажи оформляются только документом ОтчетОРозничныхПродажах?
По поводу левого соединения в вашем примере (хммм... "изобретательно" - не надо так):
Если хотите скрестить ужа по дате поступления и ежа по дате последней продажи, то делайте 3-и таблицы - в одной уж, в другой еж, в третьей соединение ужа с ежом.
Сколько выполняется такой вот код:
ВЫБРАТЬ
Продажи.Номенклатура,
МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи,
isNull(Продажи.ДокументПродажи.Склад, Значение(Справочник.Склады.ПустаяСсылка)) КАК Склад
Поместить ВТ_Еж
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ Количество > 0
И Продажи.Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ)
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура,
isNull(Продажи.ДокументПродажи.Склад, Значение(Справочник.Склады.ПустаяСсылка))
ПоказатьИ, да, вот это вот "Продажи.ДокументПродажи.Склад" отсыпет вам левых соединений по числу регистраторов.
Еще не мешает проверить во всех ли документах продажи есть склад, если нет, то придется все же по РН.
Напоминаю - тянете продажи за весь период работы, если это нужно для какого-то хитрого отчета, то пусть выполняется хоть 30 минут.
Это только аналитику интересно (один раз за время его работы) узнать что у вас такой-то невнятный товар последний раз продался в 1913 году с ныне неиспользуемого склада.
В остальных случаях урезайте осетра, т.е. делайте ограничения по дате.
(9) Я не говорил, что продажи оформляются только документом ОтчетОРозничныхПродажах, я сказал, что у нас продажи только этими документами. Меня интересуют остатки с датой последнего поступления и датой последней продажи. И да у нас товары есть, которые и 10 лет назад продажа была последняя.
Вот такой код работает быстрее всего, но в таблицу не попадают товары по которому не было продаж. Я так понимаю из-за отбора по ДокументПродажи.Склад в(&Склад). Как мне сделать, чтоб выводились все строчки с продажей 0 тоже.
Вот такой код работает быстрее всего, но в таблицу не попадают товары по которому не было продаж. Я так понимаю из-за отбора по ДокументПродажи.Склад в(&Склад). Как мне сделать, чтоб выводились все строчки с продажей 0 тоже.
ВЫБРАТЬ
Продажи.Номенклатура,
МАКСИМУМ(Продажи.ДокументПродажи.Дата) КАК ДатаПоследнейПродажи
ИЗ
РегистрНакопления.Продажи.Обороты(,,,Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ) и ДокументПродажи.Склад в(&Склад) ) КАК Продажи
ГДЕ КоличествоОборот > 0
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура
Показать
(10) Ну, дело ваше. Вот ответ на конкретный последний вопрос (причем первый запрос, просто скопировал у вас - тут уж сами за него отвечайте):
Смысл, думаю, понятен, код не проверял.
А так, смотрите сами, что у вас за база, может все регистрируется исключительно ПТУ, тогда и обращайтесь к товарной части проведенных ПТУ, будет быстрей.
ВЫБРАТЬ
Продажи.Номенклатура,
МАКСИМУМ(Продажи.ДокументПродажи.Дата) КАК ДатаПоследнейПродажи
Поместить ВтПродажи
ИЗ
РегистрНакопления.Продажи.Обороты(,,,Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ) и ДокументПродажи.Склад в (&Склад) ) КАК Продажи
ГДЕ КоличествоОборот > 0
СГРУППИРОВАТЬ ПО
Продажи.Номенклатура;
ВЫБРАТЬ Различные Номенклатура Поместить ВТНомПоступала ИЗ РегистрНакопления.ТоварыНаСкладах
ГДЕ Склад В (&Склад);
ВЫБРАТЬ Ном.Номенклатура КАК Номенклатура,
isNull(ВтПродажи.ДатаПоследнейПродажи, ДатаВремя(1, 1, 1)) КАК ДатаПоследнейПродажи
ИЗ ВТНомПоступала КАК Ном
ЛЕВОЕ Соединение ВтПродажи КАК ВтПродажи
ПО ВтПродажи.Номенклатура = Ном.Ссылка
ПоказатьСмысл, думаю, понятен, код не проверял.
А так, смотрите сами, что у вас за база, может все регистрируется исключительно ПТУ, тогда и обращайтесь к товарной части проведенных ПТУ, будет быстрей.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот