Имя: Пароль:
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) Обычно да, но как бы считай, что там лямы строк, это тест как бы на сообразительность
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn