Вывести первое изменение актуальной цены
Есть периодический регистр сведений с ценами товаров и артикулом
например:
арт дата цена
117105 - 01.02.2022 - 55
117105 - 01.08.2022 - 50
117105 - 01.09.2022 - 55
117105 - 01.10.2022 - 55
124106 - 01.06.2022 - 380
124106 - 15.06.2022 - 400
124106 - 01.07.2022 - 400
124106 - 01.08.2022 - 390
Нужно получить последнюю цену
важно, если для товара установлена одна и та же цена несколько раз подряд (с разными периодами), необходимо выводить самую раннюю дату действия данной цены за указанные периоды.
Правильный ответ такой
арт цена_1 дата_1 цена_2 дата_2
117105 55 01.09.2022. 50 01.08.2022
124106 390 01.08.2022 400 15.06.2022
как с помощью скд добиться такого результата?
например:
арт дата цена
117105 - 01.02.2022 - 55
117105 - 01.08.2022 - 50
117105 - 01.09.2022 - 55
117105 - 01.10.2022 - 55
124106 - 01.06.2022 - 380
124106 - 15.06.2022 - 400
124106 - 01.07.2022 - 400
124106 - 01.08.2022 - 390
Нужно получить последнюю цену
важно, если для товара установлена одна и та же цена несколько раз подряд (с разными периодами), необходимо выводить самую раннюю дату действия данной цены за указанные периоды.
Правильный ответ такой
арт цена_1 дата_1 цена_2 дата_2
117105 55 01.09.2022. 50 01.08.2022
124106 390 01.08.2022 400 15.06.2022
как с помощью скд добиться такого результата?
По теме из базы знаний
- Минимализмы
- Ведомость по остаткам ТМЦ на складах с ценой номенклатуры по типу и валюте для ТиС 9.2
- Установка розничных цен / наценка из документа Поступление товаров (Приходная накладная) + разблокировка реквизитов Номенклатуры для конфигурации Розница v2.2, v2.3, v3
- Первый 1 000 000 рублей на своих разработках на Инфостарте
- Государственные контракты в УТ 11.5, КА 2.5.с выгрузкой в ЕИС (Госзакупки)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)Отбираешь в первой Вт Номеклатура, как тебе надо, либо всю, либо условие ставишь по группе. Выводишь поля Номеклатура и Артикул. Вот второй Вт ЦеныНоменклатуры.СрезПоследних выводишь поля по всей номеклатура, можно так же по аналогичному уловичию как в ВТ1, указываешь в ВТ2 поля которые тебя интересуют и потом к Вт1 присоединяешь левым соединением Вт2 по номенклатуре. И все.
Это тебе как пример. Указываешь СрезПоследних, указываешь период который тебя интересует в РС ЦеныНоменклатуры и пошла жара
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ Вт1
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И Номенклатура.ПометкаУдаления = ЛОЖЬ
И Номенклатура.Ссылка В ИЕРАРХИИ(&Ссылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МАКСИМУМ(ЦеныНоменклатурыСрезПервых.Период) КАК Период,
ЦеныНоменклатурыСрезПервых.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПервых.Цена КАК Цена
ПОМЕСТИТЬ Вт2
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПервых(
,
Номенклатура В ИЕРАРХИИ (&Ссылка)
И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПервых
СГРУППИРОВАТЬ ПО
ЦеныНоменклатурыСрезПервых.Номенклатура,
ЦеныНоменклатурыСрезПервых.Цена
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Вт1.Артикул КАК Артикул,
Вт1.Ссылка КАК Ссылка,
Вт2.Период КАК Период,
Вт2.Цена КАК Цена
ИЗ
Вт1 КАК Вт1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Вт2 КАК Вт2
ПО Вт1.Ссылка.Ссылка = Вт2.Номенклатура.Ссылка
ПоказатьЭто тебе как пример. Указываешь СрезПоследних, указываешь период который тебя интересует в РС ЦеныНоменклатуры и пошла жара
ВЫБРАТЬ
"Товар1" КАК Артикул,
ДАТАВРЕМЯ(2022, 2, 1) КАК Дата,
55 КАК Цена
ПОМЕСТИТЬ мТаб
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар1",
ДАТАВРЕМЯ(2022, 8, 1),
50
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар1",
ДАТАВРЕМЯ(2022, 9, 1),
55
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар1",
ДАТАВРЕМЯ(2022, 10, 1),
55
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 6, 1),
380
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 6, 15),
400
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 7, 1),
400
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"Товар2",
ДАТАВРЕМЯ(2022, 8, 1),
390
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
мТаб.Артикул,
мТаб.Дата,
мТаб.Цена
ПОМЕСТИТЬ м1
ИЗ
мТаб КАК мТаб
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
мТаб.Артикул,
ДАТАВРЕМЯ(2000, 1, 1),
0
ИЗ
мТаб КАК мТаб
СГРУППИРОВАТЬ ПО
мТаб.Артикул
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
м1.Дата,
м1.Цена,
МАКСИМУМ(м11.Дата) КАК Дата1,
м1.Артикул
ПОМЕСТИТЬ м2
ИЗ
м1 КАК м1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ м1 КАК м11
ПО м1.Дата >= м11.Дата
И (НЕ м1.Цена = м11.Цена)
И м1.Артикул = м11.Артикул
СГРУППИРОВАТЬ ПО
м1.Цена,
м1.Дата,
м1.Артикул
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 999
ВложенныйЗапрос.Дата КАК ДатаС,
МАКСИМУМ(м2.Дата) КАК ДатаПо,
м2.Цена,
м2.Артикул КАК Артикул,
ВложенныйЗапрос.Дата1 КАК ДатаПредыдущая
ПОМЕСТИТЬ мИтого
ИЗ
м2 КАК м2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
м2.Артикул КАК Артикул,
м2.Цена КАК Цена,
м2.Дата1 КАК Дата1,
МИНИМУМ(м2.Дата) КАК Дата
ИЗ
м2 КАК м2
СГРУППИРОВАТЬ ПО
м2.Артикул,
м2.Дата1,
м2.Цена) КАК ВложенныйЗапрос
ПО м2.Артикул = ВложенныйЗапрос.Артикул
И м2.Дата1 = ВложенныйЗапрос.Дата1
СГРУППИРОВАТЬ ПО
м2.Цена,
м2.Артикул,
ВложенныйЗапрос.Дата,
ВложенныйЗапрос.Дата1
УПОРЯДОЧИТЬ ПО
Артикул,
ДатаПо
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
мИтого.Артикул,
мИтого.ДатаС,
мИтого.Цена,
мТаб.Дата,
мТаб.Цена КАК Цена1
ИЗ
мИтого КАК мИтого
ЛЕВОЕ СОЕДИНЕНИЕ мТаб КАК мТаб
ПО мИтого.Артикул = мТаб.Артикул
И мИтого.ДатаПредыдущая = мТаб.Дата
логика запроса как бы такая должна быть, помещаем данные во временные таблицы
1.Получаем срез последних (это актуальные цены)
2.Получаем дату предыдущей цены в разрезе товаров (макс дата от таблицы 1 где цены не равны)
3.Получаем дату первой установки текущей цены используя таблицы из п.1 и п.2
тренировался на примере курса валют (очень похожий пример) получился такой запрос
1.Получаем срез последних (это актуальные цены)
2.Получаем дату предыдущей цены в разрезе товаров (макс дата от таблицы 1 где цены не равны)
3.Получаем дату первой установки текущей цены используя таблицы из п.1 и п.2
тренировался на примере курса валют (очень похожий пример) получился такой запрос
выбрать первые 100
таб.Период,
таб.Валюта,
таб.Курс
Поместить Пром
из
регистрСведений.КурсыВалют.СрезПоследних таб
;
выбрать
Пром.Валюта,
Максимум(ЕстьNull(таб.Период,Пром.Период)) как Дата
поместить табДо
из
Пром
левое соединение
регистрСведений.КурсыВалют таб
по Пром.Валюта = таб.валюта
и Пром.КУрс <> таб.Курс
сгруппировать по
Пром.Валюта
;
//выбрать * из табДо
Выбрать
ЕстьNull(таб1.Период,Пром.Период) как ПериодС,
Пром.*
из
Пром
левое соединение табДо
по Пром.Валюта = табДо.валюта
левое соединение
регистрСведений.КурсыВалют таб1
по Пром.Валюта = таб1.валюта
и Пром.Курс = таб1.Курс
и ТабДо.Дата <= таб1.Период
и Пром.Период > таб1.Период
левое соединение
регистрСведений.КурсыВалют таб2
по Пром.Валюта = таб2.валюта
и Пром.Курс = таб2.Курс
и ТабДо.Дата <= таб2.Период
и таб1.Период > таб2.Период
где
таб2.Период есть null
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот