Помогите запросом плиз.

1. belas 6 09.05.21 12:43 Сейчас в теме
Добрый день. Помогите алгоритмом запроса плиз.

Есть регистр, подчиненный регистратору. В регистре Измерение1 и Измерение2 , и Ресурс1 и Ресурс 2.

В один момент по измерению 1 и 2 происходит изменение Ресурса1.

Нужно запросом получить список Срез последних на текущую дару Ресурс 1 и Ресурс 2 в виде - Измерение1, Измерение2, Ресурс 1, Ресурс 2, Дата изменения Ресурса 1.

Дата изменения Ресурса 1 - это значение "Период" регистра в который Ресурса 1 принял текущее значение.

Кроме как такого варианта в голову не приходит - Взять срез последних, связать его со всеми записями регистра по двум измерениям и Ресурсу 1. Поместить во временную таблицу. Затем эту таблицу сгруппировать по измерениям и выбрать минимальный Период. Затем уже сгруппированную таблицу связать с результатами основного запроса и взять Период оттуда.

Но как-то это сложно...
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Pyryrym 09.05.21 15:23 Сейчас в теме
Можно обратиться к дате регистратора СрезаПоследних Ресурса1
3. belas 6 09.05.21 18:26 Сейчас в теме
(2) В какой момент и с какой целью ?
4. Pyryrym 09.05.21 19:35 Сейчас в теме
(3) Как оно вообще работает: допустим ресурс1 восьмого мая стал равен 10, а десятого равен 20. Девятого мая СрезПоследних покажет 10, СрезПервых - 20, то есть Последние актуальные и Первые, какие будут. а устанавливают значения в ресурсы регистраторы, соответственно, в дату регистратора установилось значение регистра в какое то значение. Ну и в параметрах виртуальной таблицы установить дату на которую надо. В такой ситуации лучше именно в параметрах виртуальной, а не в условиях (ГДЕ ...)

ВЫБРАТЬ
Сведения.Регистратор.Дата КАК Дата,
Сведения.Измерение1 КАК Измерение1,
Сведения.Измерение2 КАК Измерение2,
Сведения.Ресурс1 КАК Ресурс1,
Сведения.Ресурс2 КАК Ресурс2
ИЗ
РегистрСведений.Сведения.СрезПоследних(&Дата, ) КАК Сведения
5. buganov 200 09.05.21 20:04 Сейчас в теме
(4)
Сведения.Регистратор.Дата КАК Дата,

А палкой за такое?
6. Pyryrym 09.05.21 20:08 Сейчас в теме
(5) А за что? Я не очень разбираюсь
7. Leon75 09.05.21 22:28 Сейчас в теме
(5)Ну а вдруг только один документ-регистратор - не составной тип. Только одно неявное соединение. :)
(1)
Но как-то это сложно...
то есть придумывать неестественный секс по условию задачи не сложно, а реализовать - сложно?
Нет уж, плодитесь и размножайтесь.
8. belas 6 10.05.21 04:58 Сейчас в теме
(7) Сложная не реализация, а сам алгоритм. Другими словами - "не красивый"
Может кто пооптимальнее предложит.
11. Leon75 10.05.21 10:14 Сейчас в теме
(8)Говорите несложная реализация? А где ваша работающая реализация? А ну, выложите сюда.
9. belas 6 10.05.21 05:04 Сейчас в теме
(4) Так суть в том, что в какой-то момент, например на 15 мая делаем срез последнего. Т.е. в выборке ресурс1 будет 20. И в этой же выборке ты должен получить дату 10 мая (т.е. дату когда он стал 20). Причем до 10 мая он мог меняться миллион раз, и в том числе мог принимать значение 20. А с 10 мая по 15 мая мог меняться ресурс 2 несколько раз при этом ресурс 1 не менялся.
10. delta 659 10.05.21 06:57 Сейчас в теме
(1) Здравствуйте.
А почему вы пишите "и выбрать минимальный Период" - ведь вам надо выбрать последнюю дату изменения Ресурса2, тогда период должен максимальный.

Лично мне непросто абстрактно размышлять о запросе, не видя хотя бы его заготовки. Кроме того, в условии задачи фигурировало про подчинении регистра (кстати, также не указано, что он сведений - можно только из контекста описания сделать такой вывод), но не сказано про его Периодичность. По этой причине много времени при поиске решения уходит на догадки, а не на само решение поставленного вопроса.

В итоге, я предлагаю сделать запрос таким:

Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение1 КАК Измерение1,
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение2 КАК Измерение2,
		|	СУММА(РегистрПодчиненныйРегистраторуСрезПоследних.Ресурс1) КАК Ресурс1,
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Период КАК Период
		|ПОМЕСТИТЬ ВТ_ИзменениеРесурса1
		|ИЗ
		|	РегистрСведений.РегистрПодчиненныйРегистратору.СрезПоследних(&ДатаОтчета, ) КАК РегистрПодчиненныйРегистраторуСрезПоследних
		|
		|СГРУППИРОВАТЬ ПО
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение1,
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение2,
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Период
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение1 КАК Измерение1,
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение2 КАК Измерение2,
		|	МАКСИМУМ(РегистрПодчиненныйРегистраторуСрезПоследних.Период) КАК Период
		|ПОМЕСТИТЬ ВТ_ПериодИзмененияРесурсов
		|ИЗ
		|	РегистрСведений.РегистрПодчиненныйРегистратору.СрезПоследних(&ДатаОтчета, ) КАК РегистрПодчиненныйРегистраторуСрезПоследних
		|
		|СГРУППИРОВАТЬ ПО
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение1,
		|	РегистрПодчиненныйРегистраторуСрезПоследних.Измерение2
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	ВТ_ИзменениеРесурса1.Измерение1 КАК Измерение1,
		|	ВТ_ИзменениеРесурса1.Измерение2 КАК Измерение2,
		|	ВТ_ИзменениеРесурса1.Период КАК Период
		|ПОМЕСТИТЬ ВТ_ДляВыборки
		|ИЗ
		|	ВТ_ИзменениеРесурса1 КАК ВТ_ИзменениеРесурса1
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПериодИзмененияРесурсов КАК ВТ_ПериодИзмененияРесурсов
		|		ПО ВТ_ИзменениеРесурса1.Измерение1 = ВТ_ПериодИзмененияРесурсов.Измерение1
		|			И ВТ_ИзменениеРесурса1.Измерение2 = ВТ_ПериодИзмененияРесурсов.Измерение2
		|			И ВТ_ИзменениеРесурса1.Период = ВТ_ПериодИзмененияРесурсов.Период
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	РегистрПодчиненныйРегистратору.Измерение1 КАК Измерение1,
		|	РегистрПодчиненныйРегистратору.Измерение2 КАК Измерение2,
		|	РегистрПодчиненныйРегистратору.Ресурс1 КАК Ресурс1,
		|	РегистрПодчиненныйРегистратору.Ресурс2 КАК Ресурс2,
		|	РегистрПодчиненныйРегистратору.Период КАК ДатаИзмененияРесурса1
		|ИЗ
		|	ВТ_ДляВыборки КАК ВТ_ДляВыборки
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РегистрПодчиненныйРегистратору КАК РегистрПодчиненныйРегистратору
		|		ПО ВТ_ДляВыборки.Измерение1 = РегистрПодчиненныйРегистратору.Измерение2
		|			И ВТ_ДляВыборки.Измерение2 = РегистрПодчиненныйРегистратору.Измерение2
		|			И ВТ_ДляВыборки.Период = РегистрПодчиненныйРегистратору.Период";
	
	Запрос.УстановитьПараметр("ДатаОтчета", ДатаОтчета);
	
	РезультатЗапроса = Запрос.Выполнить();
Показать
12. azmon 1 10.05.21 15:00 Сейчас в теме
(10) В данном запросе будет учитываться и изменения Ресурса 2. Что не нужно по условию задачи.
То есть в Дата изменения Ресурса 1 попадет дата изменения ресурса 2, если ресурс 2 изменится, а ресурс 1 останется таким же.
14. belas 6 10.05.21 17:50 Сейчас в теме
(10)
А почему вы пишите "и выбрать минимальный Период"

Ну так нужно первую дату установки этого значения, а не последнюю.

Спасибо что формализовали запрос. Но по сути тут алгоритм почти такой же, что я словами описал.
13. azmon 1 10.05.21 15:06 Сейчас в теме
Я предлагаю такое решение задачи:

В моем случае Регистр называется ТоварыНаСкладах. Измерение 1 - Номенклатура, Измерение 2- Склад, Ресурс 1 - Количество, Ресурс 2 -Цена.

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

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