Имя: Пароль:
1C
 
кто и как бы решил данный запрос ? (при этом нельзя использовать запрос в цикле)
🠗 (Волшебник 21.01.2020 17:43)
, , ,
0 olo_lo1
 
21.01.20
17:21
Возможно ли без циклов решить в запросе вот такую задачку, и если да - то киньте идею:

На форме есть ТЗ с 3 колонками «Дата», «Валюта», «Курс»
Поля «Дата» и «Валюта» заполняются пользователем, идея реализовать заполнение поля «Курс» одним запросом.
В табличной части могут быть одинаковые валюты на разные даты. Курсы валют тянутся из типового регистра «Курсы валют» как УТ.

При этом нельзя использовать запрос в цикле, иначе задача легкотня...
1 Ёпрст
 
21.01.20
17:23
да уж
2 Джинн
 
21.01.20
17:23
А в чем проблема то? Зачем здесь цикл вообще? Получите сразу запросом курсы на каждую дату в таблице.
3 Ёпрст
 
21.01.20
17:23
гугли срез на каждую дату в запросе
4 olo_lo1
 
21.01.20
17:26
думаю примерно вот так:
1. Загнать ТЗ в ВТ
2. Соединить с таблице курсов валют по ТЗ_Дата<=РС_ДатаКурса и ТЗ_Валюта=РС_Валюта, сгруппировать по валюта и дате курса из ТЗ, вычислить агрегатную функцию - МАКСИМУМ(РС_ДатаКурса), поместить всё в ВТ.
3. Соединить полученную в 2 ВТ с РС курсы валют по валюте и агрегату.
5 olo_lo1
 
21.01.20
17:28
но есть задачка и по сложнее !!! для профи
6 shuhard
 
21.01.20
17:29
(5) толсто троллишь
7 olo_lo1
 
21.01.20
17:30
« а + ((а-6)*2)-(8*а))». как алгоритмом понять что число колонок верное в выражении. В данном примере специально разное кол-во колонок справа и слева !!
8 Ёпрст
 
21.01.20
17:31
Одно непонятно, чего 1с пока не реализовала подзапрос в селекте, таких тем кажный год, каждый месяц не было бы..
9 Ёпрст
 
21.01.20
17:32
(7) Если смотреть сверху, то сбоку кажется, что снизу ничего не видно
10 ptiz
 
21.01.20
17:35
(7) Ответ: 42
11 fisher
 
21.01.20
17:39
(7) Собеседование проходишь, что ли? Такую чепуху должен и сам решать.
12 runoff_runoff
 
21.01.20
17:42
никаких временных таблиц не надо
13 malem13
 
21.01.20
17:44
похоже нужны вневременные таблицы
14 olo_lo1
 
21.01.20
17:46
(12) если есть красивее решение - напиши
15 runoff_runoff
 
21.01.20
17:49
есть стандартное решение
16 eTmy
 
21.01.20
17:56
Взяли на работу?
17 runoff_runoff
 
21.01.20
18:03
(14)

ВЫБРАТЬ
    РеализацияТоваровУслуг.Дата КАК Дата,
    РеализацияТоваровУслуг.Валюта КАК Валюта,
    ЕСТЬNULL(КурсыВалют.Курс, 0) КАК Курс
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО (РеализацияТоваровУслуг.Валюта = КурсыВалют.Валюта)
            И (КурсыВалют.Период В
                (ВЫБРАТЬ
                    МАКСИМУМ(КВ.Период)
                ИЗ
                    РегистрСведений.КурсыВалют КАК КВ
                ГДЕ
                    КВ.Валюта = РеализацияТоваровУслуг.Валюта
                    И КВ.Период <= РеализацияТоваровУслуг.Дата))
ГДЕ
    РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
18 olo_lo1
 
21.01.20
18:08
(17) дружище, ты бы хоть задачу прочитал бы
19 olo_lo1
 
21.01.20
18:09
(16)  интерес к задачам и любовь к людям !
20 runoff_runoff
 
21.01.20
18:17
(18) замени Реализации на свою таблицу и всё срастётся
21 VS-1976
 
21.01.20
18:17
(0) Таблицу набранную пользователем соедини левым с регистром, дальше на клиенте кодом проинициализируй значения кодом
22 VS-1976
 
21.01.20
18:21
(21) Недостающие значения кодом. Это к примеру если записей нужно много, к примеру миллион, если едать как в (17) всё сдохнет.

Можно выбрать так:

СрезПоследний( &НаПервуюДату, )

ОБЪЕДИНИТЬ

ВЫБРАТЬ

...

ГДЕ
  ПЕРИОД МЕЖДУ &НачПериод И КОНЕЦПЕРИОДА( &КонПериод, День )
23 runoff_runoff
 
21.01.20
18:27
(22) таблица курсов небольшая, если, конечно, количество валют не как номенклатуры
24 VS-1976
 
21.01.20
18:29
(23) Обычно да, но как бы считай, что там лямы строк, это тест как бы на сообразительность