История цен номенклатуры

1. ghostrid3r 08.08.18 12:08 Сейчас в теме
Добрый день.
Подскажите пож-та. как можно в запросе выбрать историю цен, но не просто вытянуть ту цену которая была установлена документом "Установка цен номенклатуры", но и предыдущую цену.
т.е. нужно что то в виде
товар, тип цены, цена текущая, цена предыдущая
итак если у нас было за выбранный период 10 документов установок цен номенклатуры по товару, то мы должны вывести все 10 строк с текущей ценой и ее предыдущей ценой.
Пример
Товар1 Типцен1 20 18
Товар1 типцен1 18 19
Товар1 типцен1 19 22
и т.д.

Помогите пож-та не могу сообразить как сделать.
+
По теме из базы знаний
Найденные решения
14. SagittariusA 08.08.18 16:27 Сейчас в теме
(10)
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Период КАК ДатаАктуальнойЦены,
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.ВидЦены,
	ЦеныНоменклатурыСрезПоследних.Цена
ПОМЕСТИТЬ вт_ПериодАктуальныхЦен
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ГДЕ
	ЦеныНоменклатурыСрезПоследних.Цена <> 0
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	вт_ПериодАктуальныхЦен.ДатаАктуальнойЦены,
	вт_ПериодАктуальныхЦен.Номенклатура,
	вт_ПериодАктуальныхЦен.ВидЦены,
	МАКСИМУМ(ЦеныНоменклатуры.Период) КАК КрайняяДатаКАктуальной
ПОМЕСТИТЬ вт_ДляРасчетаПредыдущейЦены
ИЗ
	вт_ПериодАктуальныхЦен КАК вт_ПериодАктуальныхЦен
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО вт_ПериодАктуальныхЦен.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И вт_ПериодАктуальныхЦен.ВидЦены = ЦеныНоменклатуры.ВидЦены
			И (ЦеныНоменклатуры.Период < вт_ПериодАктуальныхЦен.ДатаАктуальнойЦены)
ГДЕ
	НЕ ЦеныНоменклатуры.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
	вт_ПериодАктуальныхЦен.ВидЦены,
	вт_ПериодАктуальныхЦен.Номенклатура,
	вт_ПериодАктуальныхЦен.ДатаАктуальнойЦены
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЦеныНоменклатуры.Период КАК ДатаПредыдущийЦены,
	вт_ДляРасчетаПредыдущейЦены.Номенклатура,
	вт_ДляРасчетаПредыдущейЦены.ВидЦены,
	ЦеныНоменклатуры.Цена КАК ПредыдущаяЦена
ПОМЕСТИТЬ вт_ПредыдущиеЦены
ИЗ
	вт_ДляРасчетаПредыдущейЦены КАК вт_ДляРасчетаПредыдущейЦены
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО вт_ДляРасчетаПредыдущейЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И вт_ДляРасчетаПредыдущейЦены.ВидЦены = ЦеныНоменклатуры.ВидЦены
			И вт_ДляРасчетаПредыдущейЦены.КрайняяДатаКАктуальной = ЦеныНоменклатуры.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	вт_ПериодАктуальныхЦен.Номенклатура,
	вт_ПериодАктуальныхЦен.ВидЦены,
	вт_ПериодАктуальныхЦен.Цена КАК АктуальнаяЦена,
	вт_ПредыдущиеЦены.ПредыдущаяЦена
ИЗ
	вт_ПериодАктуальныхЦен КАК вт_ПериодАктуальныхЦен
		ЛЕВОЕ СОЕДИНЕНИЕ вт_ПредыдущиеЦены КАК вт_ПредыдущиеЦены
		ПО вт_ПериодАктуальныхЦен.Номенклатура = вт_ПредыдущиеЦены.Номенклатура
			И вт_ПериодАктуальныхЦен.ВидЦены = вт_ПредыдущиеЦены.ВидЦены
ГДЕ
	вт_ПредыдущиеЦены.ПредыдущаяЦена <> 0
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
11. alex-l19041 8 08.08.18 16:08 Сейчас в теме
(1)
все 10 строк с текущей ценой
- уточните, как может быть 10(!) текущих цен?
+
12. ghostrid3r 08.08.18 16:14 Сейчас в теме
(11) имелось ввиду что на ту дату переоценки установленая цена является текущей. пример в (10)
+
2. user769014 08.08.18 12:36 Сейчас в теме
Например, выбрать из регистра сведений цен (срез последних) с периодом на 1 сек меньшим, чем в текущем регистраторе
+
3. SagittariusA 08.08.18 13:30 Сейчас в теме
Найти максимальный период по типу цены, который, в свою очередь, меньше периода текущей цены.
Потом просто соединить по виду цены и этому периоду, тем самым получить срез последних, который меньше текущей цены.
+
4. ghostrid3r 08.08.18 14:02 Сейчас в теме
(3) если я делаю максимальный период, то получаю 1 строку по данному периоду и все.
+
5. SagittariusA 08.08.18 14:54 Сейчас в теме
(4)
Нет под рукой базы, на которой смог бы наглядно запрос написать.

Сначала получаете текущие цены в разрезе товара и типа цены. Помещаете в ВТ.
Склеиваете эту ВТ с регистром цен по товару и виду цены, с условием, что дата меньше, чем дата текущей цены. Делаете группировку и берете максимум по дате.

Пример, что на выходе:
Товар1 Вид1 10 06.04.2001
Товар2 Вид1 5 08.06.2001

Помещаете в ВТ, и склеиваете еще раз (левым соединением), только уже по товару, виду цены, и периоду.

Товар1 Вид1 10 12
Товар2 Вид1 5 7
+
6. SagittariusA 08.08.18 14:57 Сейчас в теме
(5)
Сначала нужно высчитать, какая дата ближайшая к дате текущей цены. Так сказать, срез последних, но для меньшей даты.
Зная предыдущую дату, вы уже можете соединить две таблицы и из второй взять цену. Она-то и будет ближайшей к текущей.
+
8. ghostrid3r 08.08.18 15:04 Сейчас в теме
так выбирается только текущая дата цены и предыдущая дата цены. а таких дат за период может быть много

ВЫБРАТЬ
	ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
	ЦеныНоменклатуры.ТипЦен КАК ТипЦен,
	МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ДатаПереоценки
ПОМЕСТИТЬ ВТДатыПоследнихПереоценок
ИЗ
	РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
	ЦеныНоменклатуры.Период МЕЖДУ &ПериодНач И &ПериодКон

СГРУППИРОВАТЬ ПО
	ЦеныНоменклатуры.Номенклатура,
	ЦеныНоменклатуры.ТипЦен
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДатыПоследнихПереоценок.Номенклатура,
	ВТДатыПоследнихПереоценок.ТипЦен,
	МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ДатаПереоценки
ПОМЕСТИТЬ ВТДатыПредПереоценки
ИЗ
	ВТДатыПоследнихПереоценок КАК ВТДатыПоследнихПереоценок
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО ВТДатыПоследнихПереоценок.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И ВТДатыПоследнихПереоценок.ТипЦен = ЦеныНоменклатуры.ТипЦен
			И ВТДатыПоследнихПереоценок.ДатаПереоценки > ЦеныНоменклатуры.Период

СГРУППИРОВАТЬ ПО
	ВТДатыПоследнихПереоценок.Номенклатура,
	ВТДатыПоследнихПереоценок.ТипЦен
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДатыПоследнихПереоценок.Номенклатура,
	ВТДатыПоследнихПереоценок.ТипЦен,
	ВТДатыПоследнихПереоценок.ДатаПереоценки  ДатаПереоценкиТек,
	ВТДатыПредПереоценки.ДатаПереоценки КАК ДатаПереоценкиПред
ИЗ
	ВТДатыПоследнихПереоценок КАК ВТДатыПоследнихПереоценок
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДатыПредПереоценки КАК ВТДатыПредПереоценки
		ПО ВТДатыПоследнихПереоценок.Номенклатура = ВТДатыПредПереоценки.Номенклатура
			И ВТДатыПоследнихПереоценок.ТипЦен = ВТДатыПредПереоценки.ТипЦен
Показать
+
9. SagittariusA 08.08.18 15:14 Сейчас в теме
(8)
Может быть я вас не правильно понял?
Вам требуется вывести текущую цену, и цену, которая была предыдущей или же в одну строку вы хотите всю историю по цене вывести?
alex-l19041; +1
10. ghostrid3r 08.08.18 15:22 Сейчас в теме
(9) я хочу вывести так
Товар, цена новая, цена старая, дата переоценки
пример
товар1, 25руб, 22руб, 01/08/18
товар1, 22руб, 28руб 07/07/18
товар1, 28руб, 25руб 02/07/18
+
13. alex-l19041 8 08.08.18 16:26 Сейчас в теме
(10) тогда из регистра выбираете всю историю цены и в одну строку выводите по две строки данных
+
14. SagittariusA 08.08.18 16:27 Сейчас в теме
(10)
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Период КАК ДатаАктуальнойЦены,
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.ВидЦены,
	ЦеныНоменклатурыСрезПоследних.Цена
ПОМЕСТИТЬ вт_ПериодАктуальныхЦен
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ГДЕ
	ЦеныНоменклатурыСрезПоследних.Цена <> 0
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	вт_ПериодАктуальныхЦен.ДатаАктуальнойЦены,
	вт_ПериодАктуальныхЦен.Номенклатура,
	вт_ПериодАктуальныхЦен.ВидЦены,
	МАКСИМУМ(ЦеныНоменклатуры.Период) КАК КрайняяДатаКАктуальной
ПОМЕСТИТЬ вт_ДляРасчетаПредыдущейЦены
ИЗ
	вт_ПериодАктуальныхЦен КАК вт_ПериодАктуальныхЦен
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО вт_ПериодАктуальныхЦен.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И вт_ПериодАктуальныхЦен.ВидЦены = ЦеныНоменклатуры.ВидЦены
			И (ЦеныНоменклатуры.Период < вт_ПериодАктуальныхЦен.ДатаАктуальнойЦены)
ГДЕ
	НЕ ЦеныНоменклатуры.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
	вт_ПериодАктуальныхЦен.ВидЦены,
	вт_ПериодАктуальныхЦен.Номенклатура,
	вт_ПериодАктуальныхЦен.ДатаАктуальнойЦены
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЦеныНоменклатуры.Период КАК ДатаПредыдущийЦены,
	вт_ДляРасчетаПредыдущейЦены.Номенклатура,
	вт_ДляРасчетаПредыдущейЦены.ВидЦены,
	ЦеныНоменклатуры.Цена КАК ПредыдущаяЦена
ПОМЕСТИТЬ вт_ПредыдущиеЦены
ИЗ
	вт_ДляРасчетаПредыдущейЦены КАК вт_ДляРасчетаПредыдущейЦены
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО вт_ДляРасчетаПредыдущейЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И вт_ДляРасчетаПредыдущейЦены.ВидЦены = ЦеныНоменклатуры.ВидЦены
			И вт_ДляРасчетаПредыдущейЦены.КрайняяДатаКАктуальной = ЦеныНоменклатуры.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	вт_ПериодАктуальныхЦен.Номенклатура,
	вт_ПериодАктуальныхЦен.ВидЦены,
	вт_ПериодАктуальныхЦен.Цена КАК АктуальнаяЦена,
	вт_ПредыдущиеЦены.ПредыдущаяЦена
ИЗ
	вт_ПериодАктуальныхЦен КАК вт_ПериодАктуальныхЦен
		ЛЕВОЕ СОЕДИНЕНИЕ вт_ПредыдущиеЦены КАК вт_ПредыдущиеЦены
		ПО вт_ПериодАктуальныхЦен.Номенклатура = вт_ПредыдущиеЦены.Номенклатура
			И вт_ПериодАктуальныхЦен.ВидЦены = вт_ПредыдущиеЦены.ВидЦены
ГДЕ
	вт_ПредыдущиеЦены.ПредыдущаяЦена <> 0
Показать
+
17. ghostrid3r 08.08.18 16:31 Сейчас в теме
(14) (16) огромное спасибо, буду пробовать.
+
19. SagittariusA 08.08.18 16:34 Сейчас в теме
(14)
Только я тут условия накладывал, так как пробовал на демо-базе, там много было записей с пустой ценой
+
16. SagittariusA 08.08.18 16:29 Сейчас в теме
(10)
Прикрепленные файлы:
+
15. ghostrid3r 08.08.18 16:29 Сейчас в теме
Пример еще один, постараюсь детальней описать
Итак
Есть номенклатура Товар1 и созданные по ней документы:
Установка цен номенклатуры №20 от 12.01.18 - цена для Товар 1 - 45 руб
Установка цен номенклатуры №50 от 05.05.18 - цена для Товар 1 - 40 руб
Установка цен номенклатуры №78 от 05.07.18 - цена для Товар 1 - 41 руб
Установка цен номенклатуры №90 от 01.08.18 - цена для Товар 1 - 20 руб
Установка цен номенклатуры №95 от 05.08.18 - цена для Товар 1 - 22 руб
Установка цен номенклатуры №97 от 06.08.18 - цена для Товар 1 - 25 руб
Установка цен номенклатуры №98 от 07.08.18 - цена для Товар 1 - 30 руб

Пользователь выбирает данные за 01.08.18-08.08.18 и получает следующие документы
Установка цен номенклатуры №90 от 01.08.18 - цена для Товар 1 - 20 руб
Установка цен номенклатуры №95 от 05.08.18 - цена для Товар 1 - 22 руб
Установка цен номенклатуры №97 от 06.08.18 - цена для Товар 1 - 25 руб
Установка цен номенклатуры №98 от 07.08.18 - цена для Товар 1 - 30 руб

Теперь по этим данным необходимо вывести отчет в таком формате:
Товар Цена новая Цена старая Дата переоценки
Товар1 30 25 07.08.18
Товар1 25 22 06.08.18
Товар1 22 20 05.08.18
Товар1 20 41 01.08.18
(для последней строки он взял предыдущую цену которая даже не входит в выбранный период)
+
18. SagittariusA 08.08.18 16:31 Сейчас в теме
(15)
Запрос, который я предоставил выше, немного адаптировать. Что бы он в рамках периода брал ближайшую дату к актуальной.
+
Внимание! Тема сдана в архив

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