Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 14:20

Четверг. Вопрос 8

Автор mixqn, 14 мар 2013, 00:42

0 Пользователей и 1 гость просматривают эту тему.

DarKySiK

Запрос 1. текст примерно следующий.
ВЫБРАТЬ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ Вт_Вседаты
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &п1 И &п2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.ДатаКалендаря,
   ВложенныйЗапрос.Период,
   ВложенныйЗапрос.Валюта,
   КурсыВалют.Курс,
   КурсыВалют.Кратность
ИЗ
   (ВЫБРАТЬ
      Вт_Вседаты.ДатаКалендаря КАК ДатаКалендаря,
      МАКСИМУМ(КурсыВалют.Период) КАК Период,
      КурсыВалют.Валюта КАК Валюта
   ИЗ
      Вт_Вседаты КАК Вт_Вседаты
         ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
         ПО Вт_Вседаты.ДатаКалендаря >= КурсыВалют.Период
   
   СГРУППИРОВАТЬ ПО
      Вт_Вседаты.ДатаКалендаря,
      КурсыВалют.Валюта) КАК ВложенныйЗапрос
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
      ПО ВложенныйЗапрос.Период = КурсыВалют.Период
         И ВложенныйЗапрос.Валюта = КурсыВалют.Валюта

Spider244

Нужно использовать дополнение периодов. В источниках данных будет один запрос.

Vit1501

В СКД делаем два набора данных типа запрос. Один получает таблицу с датами ( надеюсь  в этом запросе не будет ни у кого проблем) , второй таблицу курсов причем запрос нужно сделать с параметрами :
ВЫБРАТЬ
    &Дата КАК Дата,
    КурсыВалютСрезПоследних.Валюта КАК Валюта,
    КурсыВалютСрезПоследних.Курс КАК Курс,
    КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
    Дата,
    Валюта.*,
    Курс,
    Кратность}
ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(&Дата) КАК КурсыВалютСрезПоследних
{ГДЕ
    КурсыВалютСрезПоследних.Курс,
    КурсыВалютСрезПоследних.Кратность}   

Далее объединяем наборы на закладке объединения по дате и обязательно заполняем поле "Параметр" в условии связи чтобы СКД автоматически дату связи использовала как параметр. Все - результат готов)))

Evgeny

пр. регистр сведений Курсы валют БП

в настройках отчета
в группировке по "периоду", тип дополнения : "День"

Начальные и конечные даты в периоде  :
01.06.2010  10.062010
запрос :
ВЫБРАТЬ
   КурсыВалют.Период,
   КурсыВалют.Валюта,
   КурсыВалют.Курс,
   КурсыВалют.Кратность
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют

результат

Период      
Валюта   Курс   Кратность
01.06.2010      
02.06.2010      
03.06.2010      
04.06.2010      
руб.   38,0117   1
05.06.2010      
руб.   37,8476   1
06.06.2010      
руб.   37,8476   1
07.06.2010      
руб.   37,8476   1
08.06.2010      
09.06.2010      
10.06.2010      

toxicoff

Я бы взял таблицу нужных дат, занес его в набор данных, потом соединил с запросом по курсам валют

nidom

Сделал внешним отчетом

Efa

Необходимо использовать набор-источник (для выбора дат, как параметров для выбора курсов), в источниках будет два запроса.

MrStomak

Конечно, решить можно по-разному. Самый элегантный вариант: выбрать в запросе регистр сведений курсов валют, отфильтрованный по периоду, выбрать срезом последних начальные курсы по границе периода (всё в одном запросе с объединениями), поле курс выбрать 2 раза, в настройках полей компоновки назначить роли для подсчета остатков - валюта измерение, период - период, два поля курс - начальный и конечный остаток, сделать поле курс ресурсом, затем в настройке группировок настроить дополнение по дням для поля период с периодом дополнений равному периоду отчета - в результате на "пустые" дни курсов мы будем получать значения предыдущих курсов (используя внутреннюю систему подсчета остатков СКД), при этом гарантированно попадут все дни периода. Такой вариант имеет ограничения - мы не сможет использовать агрегатные функции СКД для подсчета уникальных значений ресурсов, т.е. сумма всех курсов или средний курс будет рассчитываться из существующих, а не дополненных, полей.
Можно решать задачу железобетонно и грубо, не используя механизм дополнений и подсчета остатков СКД, зато обеспечив корректную работу функций - это, например, через внешний набор передать в СКД таблицу со всеми днями периода и через связь наборов данных соединить со срезом последних курсов валют с передачей параметра период - это менее производительно(запрос в цикле), но достаточно просто и надёжно. Можно сделать по-другому - не использовать второй набор данных, а отбирать все курсы на все дни в запросе через тета-соединения (т.е. сначала передать также внешний набор с днями периода, потом срез последних на начало периода, потом  запрос записей курсов, затем тета-соединением простановка для пустых периодов прошлых значений). Тут не будет запроса в цикле, но сам запрос достаточно сложным получается.

mamanelli

Необходимо использовать "Дополнение периодов в системе компоновки данных". Количество запросов = 1.

serj1C

Так я понимаю нужно вывести список дата по порядку без пропусков и курс, вне зависимости менялся ли курс в этот день или нет. Т.к. иначе проблемы вообще нет.

По формулировке вопроса подразумевается ответ, где будет 2 источника данных:
Первый - список дат. Он может быть получен с помощью "пораждающего" запроса, выборки из спец регистра, например, РегламентированныйПроизводственныйКалендарь (если он есть, где нет пропусков дат) или с помощью объекта (таблицы значений, созданной программно).
Второй - простой запрос Выбрать курс из Среза с параметром &Дата
Два источника соединялись бы по параметру Дата, тогда мы бы получили искомую таблицу со срезами на каждый день.

Но в реальных задачах я бы не стал применять этот подход. Т.к. на выходе мы получаем "запрос в цикле". Посторить срез для SQL не так легко, а мы его заставляем выполнить эту операцию множество раз.

Я бы все сделал в одном источнике данных. Взял даты (одним из выше указанным способом), Выбрал курсы с даты1 по Дату2. Соединил эти таблицы с условием Период.Дата > Курс.Период, сгруппировал по Период.Дата, взял Максимум(Курс.Период). Опять соединился с курсами и все пучком.

Теги:
Рейтинг@Mail.ru

Поиск