gifts2017

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

Опубликовал 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
61
.erf 5,80Kb 61 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Инна Михайлова (triton_tver) (0.05 $m)
Подписаться Добавить вознаграждение

Комментарии

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

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

Изменения в строке 7 и 10.
5. Virikus 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) 28.11.14 10:34
Спасибо огромное!!! Очень помогло, хороший прием!!!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа