Имя: Пароль:
1C
 
Задача по СКД
0 NewTesla
 
25.09.15
19:00
Всем хелло! Не так давно, проходил тестирование на собеседовании попалась такая задачка

Создать отчет "Динамика курсов валют"

на языке запросов (можно с СКД)

и картинка

Валюты        Даты
             01.01.2001  02.01.2001       03.01.2001
USD            180       181.5 (+1.5)     185 (+3.5)
RUB            3.5       3.5   (=)        3.4 (-0.4)


Скд я спринципе знаю, но скоро еще одно собеседование и может попасться такаяже задачка (сейчас изучаю курс гилева по СКД)

подкиньте идею пжл как решить данную задачу

Я представляю так- есть регистр сведений курс валют, зпдпется период (Периодами) выводится в колонке период. НО!!! Как сравнивать данные с предыдущим периодом? (например  данные дня 02.01.2001 с данными дня 01.01.2001)
1 ГдеСобака Зарыта
 
25.09.15
19:07
2 NewTesla
 
25.09.15
19:09
(1) о, спасибо, щас будем посмотреть)
3 NewTesla
 
25.09.15
19:32
чето я там нашел не понятно написано

Суть решения заключается в использовании функции языка выражений СКД ВычислитьВыражение() в добавленном вычисляемом поле, которое я назвал Дельта. У функции следующие параметры:
Параметры:
Выражение. Тип Строка;
Группировка. Тип Строка;
ТипРасчета. Тип Строка;
Начало. Строка, содержащая одно из вариантов;
Конец. Строка, содержащая одно из вариантов;
Сортировка. Строка;
ИерархическаяСортировка;
ОбработкаОдинаковыхЗначенийПорядка
Нас интересует 4 и 5 параметр (Начало и Конец). Выражение будет выглядеть следующим образом:
isNULL((ВЫЧИСЛИТЬВЫРАЖЕНИЕ("Цена", , , "Предыдущая", "Предыдущая") - Цена), 0)
- здесь вычисляем предыдущее значение поля Цена и из него вычитаем текущее значение поля Цена. Естественно, для первой записи предыдущее значение не будет вычислено и результат вычитания со значением текущего поля будет Null, поэтому что бы все было «чисто» используем функцию isNULL(естьNull), чтобы преобразовать Null в число ноль.
4 NewTesla
 
25.09.15
19:34
Т.е мне надо создать набор записей , по таблице СрезПоследних регистра "Курсы валют" Период=День, потом этот период выводить, а сравнивать с предыдущим с помощью выражения?
5 bootini
 
25.09.15
19:41
Хоть так:

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КурсыВалют.Период,
    КурсыВалют.Валюта,
    КурсыВалют.Курс,
    ЕСТЬNULL(КурсыВалют1.Курс, 0) - КурсыВалют.Курс КАК Дельта
ИЗ
    КурсыВалют КАК КурсыВалют
        ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют1
        ПО КурсыВалют.Валюта = КурсыВалют1.Валюта
            И (ДОБАВИТЬКДАТЕ(КурсыВалют.Период, ДЕНЬ, 1) = КурсыВалют1.Период)

СГРУППИРОВАТЬ ПО
    КурсыВалют.Период,
    КурсыВалют.Валюта,
    КурсыВалют.Курс,
    ЕСТЬNULL(КурсыВалют1.Курс, 0) - КурсыВалют.Курс
6 NewTesla
 
25.09.15
19:47
(5) О, круто! Спасибо! Щас попробую

(умное решение, кстати)
7 bootini
 
25.09.15
19:57
А так правильно(т.к курс может не на каждый день быть):


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

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КурсыВалют.Период,
    КурсыВалют.Валюта,
    КурсыВалют.Курс,
    Периоды.ПериодСледующий
ПОМЕСТИТЬ КурсСПериодом
ИЗ
    КурсыВалют КАК КурсыВалют
        ЛЕВОЕ СОЕДИНЕНИЕ Периоды КАК Периоды
        ПО КурсыВалют.Период = Периоды.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КурсСПериодом.Период,
    КурсСПериодом.Валюта,
    КурсСПериодом.Курс,
    ЕСТЬNULL(КурсыВалют.Курс, 0) - КурсСПериодом.Курс КАК Дельта
ИЗ
    КурсСПериодом КАК КурсСПериодом
        ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
        ПО КурсСПериодом.ПериодСледующий = КурсыВалют.Период
            И КурсСПериодом.Валюта = КурсыВалют.Валюта
8 NewTesla
 
26.09.15
06:44
а средствами СКД как это сделать?
9 NewTesla
 
26.09.15
06:44
* т.е мож какие доп. настройки есть)
10 Лодырь
 
26.09.15
07:17
(9) А что непонятного в СКД то? Ты уже в 3 все сделал по сути.
11 NewTesla
 
26.09.15
07:54
(10) Ну текущий курс понятно, берется из текузщего запроса по Срезу Последних, а предыдущий откуда брать? Т.е как сам запрос прописать, чтобы использовать предыдущий курс?
12 echo77
 
26.09.15
08:03
(11) Срез последних не пойдет
13 echo77
 
26.09.15
08:04
В моей статье(http://catalog.mista.ru/public/267055/)

ВЫЧИСЛИТЬВЫРАЖЕНИЕ("Цена", , , "Предыдущая", "Предыдущая") - Цена

- данное выражение рассчитывает разницу текущей и предыдущей цены
14 echo77
 
26.09.15
08:10
catalog.mista.ru -  своя таблица стилей? Почему-то шрифт Times new roman, а не Tahoma(или что там в оригинале на инфостарте?)
15 NewTesla
 
26.09.15
08:18
(12) т.е запрос надо строить по самой таблице регистра "курсы валют"? т.е откуда прать предыдущий курс, для вычисления)
16 echo77
 
26.09.15
08:26
(15) В самом названии отчета "Динамика ..." уже есть подсказка, что нужно брать все записи за период, а не срез/остатки
17 echo77
 
26.09.15
08:41
18 echo77
 
26.09.15
08:43
(17) Вот рабочая ссылка: https://yadi.sk/i/Gwj335oGjKzaV
19 echo77
 
26.09.15
08:44
На выходных включу этот пример в статью: http://catalog.mista.ru/public/267055/
20 NewTesla
 
27.09.15
08:09
(18) да, мне надо такой вид)
щас буду ваять)
21 echo77
 
28.09.15
17:53
(20) Как успехи?