Имя: Пароль:
1C
1С v8
Как получить последние два курса по валютам?
,
0 мистер игрек
 
03.08.11
15:26
Типа:

Доллар
10.01.11  1000-00
09.01.11  999-00
Евро
10.01.11  2000-00
09.01.11  1999-00

и т.д.
1 PR
 
03.08.11
15:27
Запросом.
2 мистер игрек
 
03.08.11
15:28
(1) О какое просветление! Прям бальзам в душу!
3 Maxus43
 
03.08.11
15:28
самое простое - выбрать первые 2 и объединить по валютам
4 мистер игрек
 
03.08.11
15:28
(3) Пример можно?
5 NcSteel
 
03.08.11
15:29
(4) Выбрать первые 2 ....
6 Buster007
 
03.08.11
15:30
(0) загрузи курсы на каждый день и проблема решится )
Кто предлагает первые 2, то попробуйте сделать так, как указал автор.
7 Maxus43
 
03.08.11
15:31
ВЫБРАТЬ ПЕРВЫЕ 2
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс,
   КурсыВалютСрезПоследних.Кратность
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Доллар) КАК КурсыВалютСрезПоследних

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 2
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс,
   КурсыВалютСрезПоследних.Кратность
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Евро) КАК КурсыВалютСрезПоследних
8 мистер игрек
 
03.08.11
15:32
(7) Ты предлагаешь указать каждую валюту отдельно?
Без этого никак?
9 luckyluke
 
03.08.11
15:32
(7) я думаю всё же надо использовать физическую таблицу с упорядочиванием по дате, а не виртуальную среза
10 Maxus43
 
03.08.11
15:32
(7) + Итоги по валюте, но если не на каждый день курсы - то есно вернёт 2 последние записи по валюте
11 Maxus43
 
03.08.11
15:33
(8) это самое простое, можно подумать конечно чтоб покрасивей было
12 luckyluke
 
03.08.11
15:34
(8) можно выбрать срез последних и соединить с физической с условием период < период, ну и группировкой.
13 мистер игрек
 
03.08.11
15:34
(11) Извини, но это вариант не катит.
14 мистер игрек
 
03.08.11
15:35
(12) Задача надо решать в консоли отчетов
15 мистер игрек
 
03.08.11
15:35
т.е в консоле запросов
16 Maxus43
 
03.08.11
15:36
(15) параметры же там есть, в консоли
17 мистер игрек
 
03.08.11
15:37
(16) Я про валюту для примера. А так задача помасштабнее. Там элементов могут быть сотни
18 GROOVY
 
03.08.11
15:37
(7) Этим запросом мы выберем не 2 последних курса, а 2 записи, если учесть что срез последних с отбором по валюте вернет нам 1 запись, то выберем одну.
19 NcSteel
 
03.08.11
15:39
"ВЫБРАТЬ        //Предпоследние
|    ВложенныйЗапрос.РежимПотребления,
|    ПериодыСтабильностиАбонентов.Действует
|ИЗ
|    (ВЫБРАТЬ
|        ПериодыСтабильностиАбонентов.РежимПотребления КАК РежимПотребления,
|        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПериодыСтабильностиАбонентовСрезПоследних.Период) КАК Период
|    ИЗ
|        РегистрСведений.ПериодыСтабильностиАбонентов КАК ПериодыСтабильностиАбонентов
|            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодыСтабильностиАбонентов.СрезПоследних КАК ПериодыСтабильностиАбонентовСрезПоследних
|            ПО ПериодыСтабильностиАбонентов.Период < ПериодыСтабильностиАбонентовСрезПоследних.Период
|                И ПериодыСтабильностиАбонентов.РежимПотребления < ПериодыСтабильностиАбонентовСрезПоследних.РежимПотребления
|    
|    СГРУППИРОВАТЬ ПО
|        ПериодыСтабильностиАбонентов.РежимПотребления) КАК ВложенныйЗапрос
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодыСтабильностиАбонентов КАК ПериодыСтабильностиАбонентов
|        ПО ВложенныйЗапрос.РежимПотребления = ПериодыСтабильностиАбонентов.РежимПотребления
|            И ВложенныйЗапрос.Период = ПериодыСтабильностиАбонентов.Период
|
|ОБЪЕДИНИТЬ ВСЕ
|              //Последние
|ВЫБРАТЬ
|    ПериодыСтабильностиАбонентовСрезПоследних.РежимПотребления,
|    ПериодыСтабильностиАбонентовСрезПоследних.Действует
|ИЗ
|    РегистрСведений.ПериодыСтабильностиАбонентов.СрезПоследних КАК ПериодыСтабильностиАбонентовСрезПоследних"
20 Buster007
 
03.08.11
15:39
(18) +1
21 NcSteel
 
03.08.11
15:39
+ ТОлько не Количество(Различные) а Максимум. Писа быстро и без проверок. Но идея должна быть понятна.
22 Maxus43
 
03.08.11
15:42
(18) > (10), говорил уж что последние записи вернёт. Да и курсы валют меняются каждый день по факту, одинаковых небывает вроде)
23 NcSteel
 
03.08.11
15:43
(18) Две записи равны двум курсам , так каку валюты курс на каждый день свой назначается
24 lubja
 
03.08.11
15:52
можно так:
25 NcSteel
 
03.08.11
15:52
(24) Не так нельзя
26 lubja
 
03.08.11
15:52
ВЫБРАТЬ
   КурсыВалютСрезПоследних.Период,
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ПОМЕСТИТЬ ВТ_ПоследнийКурс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(, ) КАК КурсыВалютСрезПоследних
;

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

СГРУППИРОВАТЬ ПО
   КурсыВалют.Валюта
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ_ПоследнийКурс.Период КАК Период,
   ВТ_ПоследнийКурс.Валюта КАК Валюта,
   ВТ_ПоследнийКурс.Курс
ИЗ
   ВТ_ПоследнийКурс КАК ВТ_ПоследнийКурс

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ВТ_ПредпоследнийКурс.Период,
   ВТ_ПредпоследнийКурс.Валюта,
   ВТ_ПредпоследнийКурс.Курс
ИЗ
   ВТ_ПредпоследнийКурс КАК ВТ_ПредпоследнийКурс

УПОРЯДОЧИТЬ ПО
   Валюта,
   Период




возможно, слишком навороченый...
27 lubja
 
03.08.11
15:53
(25) да... пальцы шаловливые))0
28 Healer
 
03.08.11
15:53
Я бы как-то так написал:
ВЫБРАТЬ ПЕРВЫЕ 4    NULL КАК Евро,
   КурсыВалютСрезПоследних.Валюта КАК Доллар,
   КурсыВалютСрезПоследних.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалютСрезПоследних
ГДЕ
   КурсыВалютСрезПоследних.Валюта = &Доллар

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 2
   КурсыВалютСрезПоследних.Валюта,
   NULL,
   КурсыВалютСрезПоследних.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалютСрезПоследних
ГДЕ
   КурсыВалютСрезПоследних.Валюта = &Евро
29 NcSteel
 
03.08.11
15:54
(26) Тоже что и (19) ТОлько слишком много временных таблиц..
30 lubja
 
03.08.11
15:55
(29) "мы без трудностей не можем, мы их сами создаем" (с)
31 Healer
 
03.08.11
15:56
Если хочется для всех имеющихся валют, то просто выполнять вот такой запрос:

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


для каждого непомеченного на удаление элемента справочника Валюты.
32 Healer
 
03.08.11
15:57
Вернее такой вот:
ВЫБРАТЬ ПЕРВЫЕ 2
   КурсыВалютСрезПоследних.Валюта КАК ЗНАЧЕНИЕ(КурсыВалютСрезПоследних.Валюта.НаименованиеПолное),
...
33 Buster007
 
03.08.11
15:58
(28)(31) о )появляются таланты )
34 Healer
 
03.08.11
15:59
Ну... я запрос не проверял... это так, идея только :-)
35 мистер игрек
 
03.08.11
16:00
(26) Вроде получилось, сенкс
36 Healer
 
03.08.11
16:00
Не уверен, что синоним можно выражением формировать... ну-ка, проверю...
37 Maxus43
 
03.08.11
16:01
(36) нельзя конечно
38 NcSteel
 
03.08.11
16:01
(35) Эх а мое творчество оказалось не заметным ? )))
39 Buster007
 
03.08.11
16:01
(26) медленно работать будет.
40 NcSteel
 
03.08.11
16:02
(39) Оптимизировать можно.
41 Buster007
 
03.08.11
16:02
(40) я знаю )
42 Buster007
 
03.08.11
16:03
(41) далеко можно не смотреть и увидеть, что
ВЫБРАТЬ
   МАКСИМУМ(КурсыВалют.Период) КАК Период,
   КурсыВалют.Валюта
ПОМЕСТИТЬ ВТ_Предпоследние
ИЗ
   ВТ_ПоследнийКурс КАК ВТ_ПоследнийКурс
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
       ПО (КурсыВалют.Валюта = ВТ_ПоследнийКурс.Валюта)
           И (КурсыВалют.Период < ВТ_ПоследнийКурс.Период)

СГРУППИРОВАТЬ ПО
   КурсыВалют.Валюта
;
этот кусок можно оптимизировать ого-го
43 lubja
 
03.08.11
16:03
(38) твое творчество я ща проверила... возвращает в обоих случаях последний курс... так что... ))
44 lubja
 
03.08.11
16:04
(42) ну, началось... я ж на скорую руку... )))
45 NcSteel
 
03.08.11
16:05
(43) Я давал идею.
46 lubja
 
03.08.11
16:06
(45) твоя идея возвращает последнюю запись
47 NcSteel
 
03.08.11
16:06
(42) Интересно что хочешь оптимизировать именно в этом куске?
48 Buster007
 
03.08.11
16:07
(47) подумал, я был неправ.
49 мистер игрек
 
03.08.11
16:08
(26) Ты сама придумала или где то уже есть?
50 lubja
 
03.08.11
16:09
(49) эээ... сама... ))
51 мистер игрек
 
03.08.11
16:10
(50) Все получилось, спасибо
52 Buster007
 
03.08.11
16:10
(49) не верится?)))
53 мистер игрек
 
03.08.11
16:12
(52) Стыдно признаться, но я только что узнал, чтоб временные таблицы можно использовать внутри запроса
54 lubja
 
03.08.11
16:12
(45) пересмотрела твой запрос. строчку
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПериодыСтабильностиАбонентовСрезПоследних.Период) КАК Период
заменить на
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПериодыСтабильностиАбонентов.Период) КАК Период

и все получилось
55 lubja
 
03.08.11
16:13
(51) так что, если запрос NcSteel реально работает быстрее моего, то  лучше его переписать и юзать
56 мистер игрек
 
03.08.11
16:16
(38) Блин, у меня с абстракцией плохо
57 lubja
 
03.08.11
16:20
(56) держи переделанный запрос NcSteel


ВЫБРАТЬ        //Предпоследние

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

ОБЪЕДИНИТЬ ВСЕ
             //Последние

ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Курс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
58 NcSteel
 
03.08.11
16:38
(57) А меня лень обуяла )))
59 lubja
 
03.08.11
16:40
(58) а мне работать не кайф ))
60 ssh2006
 
03.08.11
17:11
Вариант с коррелированным запросом в соединении
ВЫБРАТЬ
   КурсыВалютСрезПоследних.Валюта,
   КурсыВалютСрезПоследних.Период КАК ПоследняяДата,
   КурсыВалют.Период КАК ПредпоследняяДата,
   КурсыВалютСрезПоследних.Курс КАК ПоследнийКурс,
   КурсыВалют.Курс КАК ПредпоследнийКурс
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
       ПО ((КурсыВалют.Валюта, КурсыВалют.Период) В
               (ВЫБРАТЬ
                   КурсыВалют.Валюта,
                   МАКСИМУМ(КурсыВалют.Период) КАК Период
               ИЗ
                   РегистрСведений.КурсыВалют КАК КурсыВалют
               ГДЕ
                   КурсыВалют.Период < КурсыВалютСрезПоследних.Период
                   И КурсыВалют.Валюта = КурсыВалютСрезПоследних.Валюта
               СГРУППИРОВАТЬ ПО
                           КурсыВалют.Валюта))
61 fisher
 
03.08.11
17:17
Самый элегантный вариант - коррелированным подзапросом с ВЫБРАТЬ ПЕРВЫЕ 2
62 ssh2006
 
03.08.11
17:36
Вот он:
ВЫБРАТЬ
   ТаблицаРегистра.Период,
   ТаблицаРегистра.Валюта,
   ТаблицаРегистра.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК ТаблицаРегистра
ГДЕ
   (ТаблицаРегистра.Валюта, ТаблицаРегистра.Период) В
           (ВЫБРАТЬ ПЕРВЫЕ 2
               КурсыВалют.Валюта,
               КурсыВалют.Период КАК Период
           ИЗ
               РегистрСведений.КурсыВалют КАК КурсыВалют
           ГДЕ
               КурсыВалют.Валюта = ТаблицаРегистра.Валюта
           УПОРЯДОЧИТЬ ПО
               Период УБЫВ)
63 ssh2006
 
03.08.11
17:41
Это самый короткий вариант видимо
64 fisher
 
03.08.11
17:47
Достаточно просто

ВЫБРАТЬ
   ТаблицаРегистра.Период,
   ТаблицаРегистра.Валюта,
   ТаблицаРегистра.Курс
ИЗ
   РегистрСведений.КурсыВалют КАК ТаблицаРегистра
ГДЕ
   ТаблицаРегистра.Период В
           (ВЫБРАТЬ ПЕРВЫЕ 2
               КурсыВалют.Период КАК Период
           ИЗ
               РегистрСведений.КурсыВалют КАК КурсыВалют
           ГДЕ
               КурсыВалют.Валюта = ТаблицаРегистра.Валюта
           УПОРЯДОЧИТЬ ПО
               Период УБЫВ)
65 lubja
 
03.08.11
17:49
(64) а если валют все-таки не 2, а 3? :)
66 ssh2006
 
03.08.11
17:50
Не имеет значения
67 fisher
 
03.08.11
17:54
(65) Цифра 2 относится к глубине выбираемой истории курсов по каждой валюте, а не к количеству валют :)
68 ssh2006
 
03.08.11
17:54
(64) Да
69 lubja
 
03.08.11
18:02
(66) сори, невнимательно смотрела)
70 NcSteel
 
03.08.11
20:03
(67) А если курс не менялся ?
71 ssh2006
 
03.08.11
20:36
Если требуется получить предыдущий отличный от последнего курс в варианте (60) можно можно добавить условие.
72 Киборг
 
03.08.11
21:55
м.б. так:

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

ВЫБРАТЬ
   *
ИЗ
   РегистрСведений.КурсыВалют.СрезПоследних(
           &Дата,
           (НЕ (Период, Валюта) В
                   (ВЫБРАТЬ
                       Посл.Период,
                       Посл.Валюта
                   ИЗ
                       Посл КАК Посл))) КАК КурсыВалютСрезПоследних
73 fisher
 
04.08.11
11:51
(70) Тогда придется коррелированный подзапрос делать не по основной таблице регистра, а по подзапросу, возвращающему различные курсы.