Получить последнюю цену из двух типов цен

1. Shaldryn 10.09.19 11:23 Сейчас в теме
Добрый день, подскажите, чет туплю, не могу составить запрос. Такая задача, у товара есть два типа цен "Анонс" и "Опт", выводить последнюю цену на момент формирования отчета. То есть товар еще не пришел, у него стоит "Анонс", выводим "Анонс", после этого товар пришел, поставили "Опт", и когда формируем отчет должна выводится цена "Опт". Бывает что у товара была цена "Опт", после его перевыпускают с ценой "Анонс". Сделал такой запрос:
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	ЦеныНоменклатурыСрезПоследних.Период,
	ЦеныНоменклатурыСрезПоследних.Регистратор
ПОМЕСТИТЬ ВТ_Цены
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
			,
			ТипЦен = &ТипЦенОпт
				И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЦеныНоменклатурыСрезПоследних

ОБЪЕДИНИТЬ ВСЕ

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Цены.Номенклатура,
	ВТ_Цены.Цена
ИЗ
	ВТ_Цены КАК ВТ_Цены
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_МаксДок КАК ВТ_МаксДок
		ПО ВТ_Цены.Номенклатура = ВТ_МаксДок.Номенклатура
			И ВТ_Цены.Регистратор = ВТ_МаксДок.Регистратор
Показать


Вроде выводит норм, но мне кажется как то коряво. То есть в первом получаю последние цены по двум типам, во втором получаю последние документы, ну и в третьем вывожу цены, правильная ли логика или я чет запутался...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. theifx 10.09.19 11:28 Сейчас в теме
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Период,
    ЦеныНоменклатурыСрезПоследних.Регистратор
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних() КАК ЦеныНоменклатурыСрезПоследних
ГДЕ ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование = "Анонс" или ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование = "Опт"
4. VmvLer 10.09.19 11:33 Сейчас в теме
(2) так не пойдет, я написал почему
3. VmvLer 10.09.19 11:32 Сейчас в теме
чисто по логике запроса (не задачи)

первый пакет нормальный, можно вместо объединения создать условие
ТипЦен В (&мТипыЦен)
но в этом случае индексы перестанут работать и учитывая, что регистры цен огромны,
то объединение выглядит вполне логично.

второй пакет странный, что значит МАКСИМУМ(ЦеныНоменклатурыСрезПоследних.Регистратор)
вы так получаете последний учетный документ? если да, то решение хромает

третий пакет прост и придраться не к чему
Fox-trot; +1 Ответить
5. Shaldryn 10.09.19 11:42 Сейчас в теме
(3) а как мне тогда получить последний документ, чтобы после вытянуть последнюю цену из двух типов?
6. VmvLer 10.09.19 11:50 Сейчас в теме
(5) получите точный ответ на вопрос
"по какому критерию мы определяем, что документ последний" и тогда согласно этому критерию получайте.

часто(почти всегда) успешное решение задачи зависит от того, какие вопросы мы задаем сами себе.
7. Shaldryn 10.09.19 12:10 Сейчас в теме
(6) ну вообще изначально я определял по критерию период, потом просто где то в просторах инета увидел по регистратору, но там для того чтобы исключить ситуаций, когда дата одинаковая. Переделал второй пакет, максимум по периоду, теперь решение не храмает?
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	МАКСИМУМ(ВТ_Цены.Период) КАК Период
ПОМЕСТИТЬ ВТ_МаксДок
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цены КАК ВТ_Цены
		ПО ЦеныНоменклатурыСрезПоследних.Период = ВТ_Цены.Период
			И ЦеныНоменклатурыСрезПоследних.Номенклатура = ВТ_Цены.Номенклатура

СГРУППИРОВАТЬ ПО
	ЦеныНоменклатурыСрезПоследних.Номенклатура
;
Показать
8. VmvLer 10.09.19 13:09 Сейчас в теме
(7) на обе ноги, причем может упасть
9. IChe 17.09.20 18:40 Сейчас в теме
ВЫБРАТЬ
	ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК НоменклатураПоставщика,
	МАКСИМУМ(ЦеныНоменклатурыПоставщиковСрезПоследних.Период) КАК Период
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(&ТекущаяДата, ) КАК ЦеныНоменклатурыПоставщиковСрезПоследних

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

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

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