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

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

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

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

kereo

Чтобы сформировать таблицу со всеми датами из этого периода в СКД необходимо использовать механизм дополнения периода. В источниках данных необходимо указать объединение двух запросов. Один запрос к физической таблице с условием по периоду, а второй запрос будет получать срез последних на начало периода. Для периода необходимо указать роль "Период", а для курса указать роль "Остаток". Пример схемы во вложении.

michael2k

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

Vint89

запрос будет один с параметром периода. Данные будут браться из периодического регистра с периодом день

temsan

Сделал с помощью одного набора данных-запрос, пакет из 2х запросов

Схему компоновки прикрепляю

kitaets

я не знаю какой механизм надо использовать, но СКД в одном единственном запросе обращаемся к реальной таблице регистра сведений и задаем условие периода       Дата >= Период <= Дата   

techh

В источниках данных СКД будет два набора данных-запрос.

Первый набор данных "Даты" - запрос, который генерирует все даты в нужном периоде.

Второй набор данных "Курсы" - запрос к регистру сведений КурсыВалют:

ВЫБРАТЬ
&Дата,
КурсыВалютСрезПоследних.Валюта,
КурсыВалютСрезПоследних.Курс
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата {(&Дата)}, ) КАК КурсыВалютСрезПоследних


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



Результат (приведен фрагмент регистра сведений и сформированный отчет):



elinatn@yandex.ru

Здесь нужно указывать в СКД для группировок дополнение периодов с заданной периодичностью в указанном интервале. Необходимо добавить группировку ПериодДень. В свойствах группировки установить тип дополнения "День" и ввести значения в "Начальную дату периода" и "Конечную дату периода".
В источниках данных будет один запрос

SVGLVV

Есть красивое, на мой взгляд, решение этой задачи одним запросом.

ВЫБРАТЬ
   0 КАК Цифра
ПОМЕСТИТЬ ТабЦифр

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра + 1000 * ТабЦифр4.Цифра) КАК День
ПОМЕСТИТЬ ТабДней
ИЗ
   ТабЦифр КАК ТабЦифр1,
   ТабЦифр КАК ТабЦифр2,
   ТабЦифр КАК ТабЦифр3,
   ТабЦифр КАК ТабЦифр4
ГДЕ
   ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ТабЦифр1.Цифра + 10 * ТабЦифр2.Цифра + 100 * ТабЦифр3.Цифра + 1000 * ТабЦифр4.Цифра) <= &ДатаКонца

ИНДЕКСИРОВАТЬ ПО
   День
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТабДней.День
ПОМЕСТИТЬ Даты
ИЗ
   ТабДней КАК ТабДней
;

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

УПОРЯДОЧИТЬ ПО
   Дата,
   Валюта,
   Курс

vlad___2011___

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

AAlexandra

Цитата: mixqn от 14 мар 2013, 00:42Задан некий период. Необходимо в СКД сформировать таблицу со всеми датами из этого периода и значением курса на каждую из дат. Какой механизм необходимо для этого использовать? Какое количество запросов будет в источниках данных СКД?
Сначала необходимо создать набор данных (запрос) с перечнем всех дат, на которые нужно получить курс валют.
В большинстве типовых конфигураций есть производственный (или хоть какой-нибудь) календарь, запросом к нему это сделать проще всего. Либо, если никакого календаря совсем нет - вот таким запросом.
Дальше возможны варианты:
  • Можно все сделать одним здоровым запросом.
    Тогда к полученной таблице (назовем ее ТаблицаДат) нужно присоединить слева физическую таблицу курсов валют (назовем ее Курсы), по связи Курсы.Период <= ТаблицаДат.Дата. С группировкой по ТаблицаДат.Дата, максимум (Курсы.Период).
    К полученной таблице (назовем ее ТаблицаДатСПериодомКурса) слева еще раз присоединить физическую таблицу курсов валют по связи ТаблицаДатСПериодомКурса.Дата = Курсы.Период.
    Все, выбираем курс и дату из любой таблицы, запрос готов.
  • А можно создать в СКД другой набор данных (запрос), в нем обратиться к срезу последних регистра КурсыВалют. В качестве параметров виртуальной таблицы регистра указать параметр &ДатаКурса.
    Затем связать два набора данных (источник - ТаблицаДат, приемник - СрезПоследних курсов) по дате (периоду) с указанием параметра ВТ "ДатаКурса".
Итого: либо мы используем 1 набор данных, но тяжелый запрос с дополнительным внутренним.
либо 2 набора данных, по 1 запросу в каждом.

Как сделать все это без первоначального создания ТаблицыДат - я не знаю. :dfbsdfbsdf:
Все даты из диапазона вывести просто, указав для поля ТипДополнения "День" и связав даты периода с параметрами СКД. Но связь наборов данных выполняется раньше дополнения и нужного результата мы не получаем. :(
Если все же можно как-то проще - пожалуйста, расскажите, очень интересно! =)

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

Поиск