bdd2

Как получить предыдущую цену номенклатуры

Опубликовал Virikus в раздел Программирование - Практика программирования

У новичков часто возникает вопрос как получить предыдущую цену или как получить предпоследнее значение из регистра сведений.

В данной публикации я на примере опишу как это можно сделать

Для примера создадим 3 документа установка цен номенклатуры.

1. На 1 мая.

 Рис. 1

2. На 2 мая. 

Рис. 2

3. На 3 мая.

 Рис. 3

 

Делаем выборку всех цен для наглядности.

 Рис. 4

 

Подготовка данных закончена, начинаем получение цен в нужном виде.

 

Получаем последние цены.

 

ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних

 

Рис. 5

 

Далее нам надо получить дату предыдущего изменения цены.

 

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

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


 Рис. 6

  

Помещаем результат во временную таблицу втЦеныНоменклатуры.

Ну и соответственно получаем уже цены.

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

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

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

 

Рис. 7

И еще раз таблица цен, чтобы удобнее было анализировать

Рис. 4

P.S.  Статья написана как пример и все запросы упрощены.
По умолчанию взял, что у нас нет характеристик, одна валюта и один тип упаковки.
Соответственно нет пересчета коэффициента и валюты.

 P.P.S Также приложил отчет для 8.2, протестировано на 8.2 УФ, в обычном режиме нужно будет выбрать вид цен через кнопку настройки.

 

Скачать файлы

Наименование Файл Версия Размер
Отчет Получить предыдущие цены номенклатуры
.erf 5,80Kb
07.05.13
64
.erf 5,80Kb 64 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Инна Михайлова (triton_tver) (0.05 $m)
Добавить вознаграждение
Комментарии
1. Александр Лыткин (TrinitronOTV) 08.05.13 10:53 Сейчас в теме
спасибо большое за данный материал, будет очень полезным для освоения и дальнейшей работы
2. rimma_n (rimma_n) 165 13.05.13 11:18 Сейчас в теме
Присоединяюсь к предыдущему оратору. спасибо!
3. Virikus 40 14.05.13 09:35 Сейчас в теме
4. Андрей Старченко (dr.death) 41 16.01.14 08:35 Сейчас в теме
Можно маленечко доработать виртуальную таблицу внЦеныНоменклатуры, чтобы запрос работал на указанную дату
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Цена,
	МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ПредыдущаяДата
ПОМЕСТИТЬ втЦеныНоменклатуры
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаАктуальнойЦены, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И ЦеныНоменклатурыСрезПоследних.Период > ЦеныНоменклатуры.Период
			И (ЦеныНоменклатуры.ВидЦены = &ВидЦены)

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

Изменения в строке 7 и 10.
5. Virikus 40 16.01.14 10:38 Сейчас в теме
(4) dr.death, да, конечно. Но я сознательно упрощал пример, чтобы новичкам было проще разобраться.
6. Роман Белорус (barat) 12.03.14 10:28 Сейчас в теме
Спасибо, очень доступно, а печатной формы нет, с динамическим выводом колонок по типу цен???
7. Пабло (CaptainMorgan) 12.03.14 10:46 Сейчас в теме
P.S. Статья написана как пример и все запросы упрощены.

Для чего упрощать? В тексте статьи можно описание сделать упрощённо а в обработке надо делать правильно.
Дело в том, что основная ошибка начинающих программистов это непонимание значимости ХарактеристикаНоменклатуры СерияНоменклатуры
Вон уже отчеты с настраиваемыми колонками хотят.
И не понимают, что результаты этого отчета изначально ошибочны.
8. Слава Лизогуб (padfodnik) 04.09.14 14:22 Сейчас в теме
Спасибо, познавательно!
9. Инна Михайлова (triton_tver) 49 28.11.14 10:34 Сейчас в теме
Спасибо огромное!!! Очень помогло, хороший прием!!!