Добрый день. Помогите алгоритмом запроса плиз.
Есть регистр, подчиненный регистратору. В регистре Измерение1 и Измерение2 , и Ресурс1 и Ресурс 2.
В один момент по измерению 1 и 2 происходит изменение Ресурса1.
Нужно запросом получить список Срез последних на текущую дару Ресурс 1 и Ресурс 2 в виде - Измерение1, Измерение2, Ресурс 1, Ресурс 2, Дата изменения Ресурса 1.
Дата изменения Ресурса 1 - это значение "Период" регистра в который Ресурса 1 принял текущее значение.
Кроме как такого варианта в голову не приходит - Взять срез последних, связать его со всеми записями регистра по двум измерениям и Ресурсу 1. Поместить во временную таблицу. Затем эту таблицу сгруппировать по измерениям и выбрать минимальный Период. Затем уже сгруппированную таблицу связать с результатами основного запроса и взять Период оттуда.
Но как-то это сложно...
Есть регистр, подчиненный регистратору. В регистре Измерение1 и Измерение2 , и Ресурс1 и Ресурс 2.
В один момент по измерению 1 и 2 происходит изменение Ресурса1.
Нужно запросом получить список Срез последних на текущую дару Ресурс 1 и Ресурс 2 в виде - Измерение1, Измерение2, Ресурс 1, Ресурс 2, Дата изменения Ресурса 1.
Дата изменения Ресурса 1 - это значение "Период" регистра в который Ресурса 1 принял текущее значение.
Кроме как такого варианта в голову не приходит - Взять срез последних, связать его со всеми записями регистра по двум измерениям и Ресурсу 1. Поместить во временную таблицу. Затем эту таблицу сгруппировать по измерениям и выбрать минимальный Период. Затем уже сгруппированную таблицу связать с результатами основного запроса и взять Период оттуда.
Но как-то это сложно...
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Как оно вообще работает: допустим ресурс1 восьмого мая стал равен 10, а десятого равен 20. Девятого мая СрезПоследних покажет 10, СрезПервых - 20, то есть Последние актуальные и Первые, какие будут. а устанавливают значения в ресурсы регистраторы, соответственно, в дату регистратора установилось значение регистра в какое то значение. Ну и в параметрах виртуальной таблицы установить дату на которую надо. В такой ситуации лучше именно в параметрах виртуальной, а не в условиях (ГДЕ ...)
ВЫБРАТЬ
Сведения.Регистратор.Дата КАК Дата,
Сведения.Измерение1 КАК Измерение1,
Сведения.Измерение2 КАК Измерение2,
Сведения.Ресурс1 КАК Ресурс1,
Сведения.Ресурс2 КАК Ресурс2
ИЗ
РегистрСведений.Сведения.СрезПоследних(&Дата, ) КАК Сведения
ВЫБРАТЬ
Сведения.Регистратор.Дата КАК Дата,
Сведения.Измерение1 КАК Измерение1,
Сведения.Измерение2 КАК Измерение2,
Сведения.Ресурс1 КАК Ресурс1,
Сведения.Ресурс2 КАК Ресурс2
ИЗ
РегистрСведений.Сведения.СрезПоследних(&Дата, ) КАК Сведения
(4) Так суть в том, что в какой-то момент, например на 15 мая делаем срез последнего. Т.е. в выборке ресурс1 будет 20. И в этой же выборке ты должен получить дату 10 мая (т.е. дату когда он стал 20). Причем до 10 мая он мог меняться миллион раз, и в том числе мог принимать значение 20. А с 10 мая по 15 мая мог меняться ресурс 2 несколько раз при этом ресурс 1 не менялся.
(1) Здравствуйте.
А почему вы пишите "и выбрать минимальный Период" - ведь вам надо выбрать последнюю дату изменения Ресурса2, тогда период должен максимальный.
Лично мне непросто абстрактно размышлять о запросе, не видя хотя бы его заготовки. Кроме того, в условии задачи фигурировало про подчинении регистра (кстати, также не указано, что он сведений - можно только из контекста описания сделать такой вывод), но не сказано про его Периодичность. По этой причине много времени при поиске решения уходит на догадки, а не на само решение поставленного вопроса.
В итоге, я предлагаю сделать запрос таким:
А почему вы пишите "и выбрать минимальный Период" - ведь вам надо выбрать последнюю дату изменения Ресурса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
| И ВТ_ДляВыборки.Период = РегистрПодчиненныйРегистратору.Период";
Запрос.УстановитьПараметр("ДатаОтчета", ДатаОтчета);
РезультатЗапроса = Запрос.Выполнить();
Показать
Я предлагаю такое решение задачи:
В моем случае Регистр называется ТоварыНаСкладах. Измерение 1 - Номенклатура, Измерение 2- Склад, Ресурс 1 - Количество, Ресурс 2 -Цена.
В моем случае Регистр называется ТоварыНаСкладах. Измерение 1 - Номенклатура, Измерение 2- Склад, Ресурс 1 - Количество, Ресурс 2 -Цена.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладах.Номенклатура КАК Номенклатура,
| ТоварыНаСкладах.Склад КАК Склад,
| ТоварыНаСкладах.Количество КАК Количество,
| МИНИМУМ(ТоварыНаСкладах.Период) КАК Период
|ПОМЕСТИТЬ ВТ_ИзмененияРесурсаКоличество
|ИЗ
| РегистрСведений.ТоварыНаСкладах КАК ТоварыНаСкладах
|ГДЕ
| ТоварыНаСкладах.Период <= &ДатаОтчета
|
|СГРУППИРОВАТЬ ПО
| ТоварыНаСкладах.Номенклатура,
| ТоварыНаСкладах.Склад,
| ТоварыНаСкладах.Количество
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ИзмененияРесурсаКоличество.Номенклатура КАК Номенклатура,
| ВТ_ИзмененияРесурсаКоличество.Склад КАК Склад,
| МАКСИМУМ(ВТ_ИзмененияРесурсаКоличество.Период) КАК Период
|ПОМЕСТИТЬ ВТ_ПоследниеИзмененияРесурсаКоличество
|ИЗ
| ВТ_ИзмененияРесурсаКоличество КАК ВТ_ИзмененияРесурсаКоличество
|
|СГРУППИРОВАТЬ ПО
| ВТ_ИзмененияРесурсаКоличество.Номенклатура,
| ВТ_ИзмененияРесурсаКоличество.Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыНаСкладахСрезПоследних.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахСрезПоследних.Склад КАК Склад,
| ТоварыНаСкладахСрезПоследних.Количество КАК Количество,
| ТоварыНаСкладахСрезПоследних.Цена КАК Цена,
| ВТ_ПоследниеИзмененияРесурсаКоличество.Период КАК ДатаИзмененияРесурсаКоличество
|ИЗ
| РегистрСведений.ТоварыНаСкладах.СрезПоследних(&ДатаОтчета, ) КАК ТоварыНаСкладахСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследниеИзмененияРесурсаКоличество КАК ВТ_ПоследниеИзмененияРесурсаКоличество
| ПО ТоварыНаСкладахСрезПоследних.Номенклатура = ВТ_ПоследниеИзмененияРесурсаКоличество.Номенклатура
| И ТоварыНаСкладахСрезПоследних.Склад = ВТ_ПоследниеИзмененияРесурсаКоличество.Склад";
Запрос.УстановитьПараметр("ДатаОтчета", ДатаОтчета);
РезультатЗапроса = Запрос.Выполнить();
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот