Имя: Пароль:
1C
1С v8
Запрос: распределить количество по месяцам
, ,
0 echo77
 
18.06.14
19:59
В общем есть запрос, который возвращает выборку вида:
Месяц      НадоОтгрузить
Январь          2
Февраль         3
Март            5

и Количество = 3
Нужно распределить количество начиная с первого месяца таким образом, чтобы оно не превышало НадоОтгрузить в этом месяце, т.е. выборка должна получиться следующая
Месяц      НадоОтгрузить   Отгружаем
Январь          2              2
Февраль         3              1
Март            5              0

Как проще и понятнее сделать? Если что это будет в отчете на СКД
1 Fragster
 
гуру
18.06.14
20:01
(0) зачем именно запросом?
2 Fragster
 
гуру
18.06.14
20:01
это же в один проход делается
3 Wobland
 
18.06.14
20:03
я бы делал циклом и не любил мозх. как-то принцип нарастающего итога здесь не применим
4 echo77
 
18.06.14
20:05
(1) Запросом, потому что отчет на СКД
5 Wobland
 
18.06.14
20:06
(4) если ты не в курсе, то СКД - это система компоновки _данных_
6 echo77
 
18.06.14
20:07
(5) в курсе
7 Bober
 
18.06.14
20:08
(4) а есть подать в скд тз?
8 vicof
 
18.06.14
20:09
Можешь в выражение ресурса свою формулу запихать, все посчитается
9 echo77
 
18.06.14
20:10
(7) можно, только какую?
Здесь я привел простой пример.
На самом деле запрос строится объединением кучи запросов
В отчете куча отборов
10 Wobland
 
18.06.14
20:10
(8) а с этого места поподробнее, пожалуйста. у ТС есть упорядочивание
11 vicof
 
18.06.14
20:12
(10) ВычислитьВыражение(), и параметрами можно получать следующее или предыдущее значение группировки. Отнимать, ВЫБОР КОГДА для сравнения с 0, ну и все, наверное
12 Wobland
 
18.06.14
20:13
(11) пасиба, почитаю на досуге
13 echo77
 
18.06.14
20:17
(11) пойму перечитывать свои статьи по СКД...
14 echo77
 
18.06.14
20:17
(13) пойду
15 echo77
 
18.06.14
20:17
(13) *пойду
16 echo77
 
18.06.14
20:28
Что-то не получается через ВычислитьВыражение()
17 vicof
 
18.06.14
21:05
Это только под сильный алкоголь. У меня тоже не с первого раза получилось. Нужно просто внимательно справку к функции читать, там более-менее понятно для ванг написано.
18 echo77
 
18.06.14
21:07
Как пользоваться ВычислитьВыражение() я знаю.
Не понятно как учесть в вычислениях ранее распределенные суммы
19 vicof
 
18.06.14
22:10
20 Bober
 
18.06.14
22:58
(18) пример:
ВЫБОР КОГДА ВычислитьВыражение("Сумма(Количество)", , , "Первая","Предыдущая") Есть null Тогда
    ВЫБОР КОГДА Количество > &КРаспределению Тогда &КРаспределению Иначе Количество Конец
КОГДА ВычислитьВыражение("Сумма(Количество)", , , "Первая","Предыдущая") > &КРаспределению Тогда 0 Иначе

    ВЫБОР КОГДА &КРаспределению - ВычислитьВыражение("Сумма(Количество)", , , "Первая","Предыдущая") > Количество Тогда Количество иначе &КРаспределению - ВычислитьВыражение("Сумма(Количество)", , , "Первая","Предыдущая") КОнец Конец
21 Kalambur
 
18.06.14
23:22
ВычислитьВыражениеСГруппировкойМассив()
22 mikeA
 
19.06.14
00:38
(0) как посчитать нарастающий итог запросом ты надеюсь знаешь. после этого таблица будет

Месяц    НадоОтгрузить    НадоОтгрузитьИтог    ОтгруженоИтог
Январь    2                2                    0
Февр    3                5                    2
Март    5                10                    5

дальше совсем просто

ВЫБОР
    КОГДА ОтгруженоИтог >= Количество ТОГДА 0
    КОГДА ОтгруженоИтог + НадоОтгрузить > Количество ТОГДА Количество - ОтгруженоИтог
    ИНАЧЕ НадоОтгрузить
КОНЕЦ
23 DirecTwiX
 
19.06.14
04:27
(22) Только после того, как запрос написал, понял, о каком итоге ты говоришь - сначала не стал всё сообщение читать)

(0) На здоровье:

ВЫБРАТЬ
    ДАТАВРЕМЯ(2014, 1, 1) КАК Месяц,
    2 КАК Отгрухить
ПОМЕСТИТЬ ВТ

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

ВЫБРАТЬ
    ДАТАВРЕМЯ(2014, 2, 1),
    4

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

ВЫБРАТЬ
    ДАТАВРЕМЯ(2014, 3, 1),
    8

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

ВЫБРАТЬ
    ДАТАВРЕМЯ(2014, 4, 1),
    6
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Месяц КАК Месяц,
    МАКСИМУМ(ВТ.Отгрухить) КАК Отгрузить,
    СУММА(ВТ1.Отгрухить) КАК ОтгруженоНужноПлан,
    СУММА(ВТ1.Отгрухить)-МАКСИМУМ(ВТ.Отгрухить) КАК ОтгруженоУжеПлан,
    ВЫБОР
        КОГДА &Распределить > СУММА(ВТ1.Отгрухить)-МАКСИМУМ(ВТ.Отгрухить) ТОГДА
            ВЫБОР
                КОГДА &Распределить - СУММА(ВТ1.Отгрухить)+МАКСИМУМ(ВТ.Отгрухить) <= СУММА(ВТ1.Отгрухить) ТОГДА
                    &Распределить - СУММА(ВТ1.Отгрухить)+МАКСИМУМ(ВТ.Отгрухить)    
                ИНАЧЕ
                    МАКСИМУМ(ВТ.Отгрухить)        
            КОНЕЦ
        ИНАЧЕ
            0    
    КОНЕЦ КАК ОтгрузитьФакт
ИЗ
    ВТ КАК ВТ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
        ПО ВТ.Месяц >= ВТ1.Месяц

СГРУППИРОВАТЬ ПО
    ВТ.Месяц

УПОРЯДОЧИТЬ ПО
    Месяц

:)
24 Homer
 
19.06.14
06:45
(23)он не работает, взял для примера
Распределить  = 7
25 Лодырь
 
19.06.14
06:46
Обычное же фифо в запросе, не?
26 echo77
 
19.06.14
08:13
(19) Спасибо, это перепечатка из моей статьи http://infostart.ru/public/267055/

Но не могу сообразить как мне это поможет
27 Лодырь
 
19.06.14
08:16
(26) Можно пояснить чем задача отличается от стандартной задачи распределения количества по партиям?
28 echo77
 
19.06.14
08:17
(27) Думаю, ничем. Нужно реализовать в СКД. Попробую (22)
29 Bober
 
19.06.14
08:44
(28) а чем тебе вариант (20) не устроил?
30 agorbunov
 
19.06.14
09:38
С нарастающим итогом, все просто

ВЫБРАТЬ
    Т.Месяц,
    Т.НадоОтгрузить,
    &Количество КАК Количество
ПОМЕСТИТЬ ТаблицаОтгрузок
ИЗ
    &Т КАК Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаОтгрузок.Месяц,
    ТаблицаОтгрузок.НадоОтгрузить,
    ТаблицаОтгрузок.Количество,
    СУММА(ЕСТЬNULL(ОтгруженоУже.НадоОтгрузить, 0)) КАК ОтгруженоУже,
    ВЫБОР
        КОГДА СУММА(ЕСТЬNULL(ОтгруженоУже.НадоОтгрузить, 0)) > ТаблицаОтгрузок.Количество
            ТОГДА 0
        КОГДА СУММА(ЕСТЬNULL(ОтгруженоУже.НадоОтгрузить, 0)) + ТаблицаОтгрузок.НадоОтгрузить > ТаблицаОтгрузок.Количество
            ТОГДА СУММА(ЕСТЬNULL(ОтгруженоУже.НадоОтгрузить, 0)) + ТаблицаОтгрузок.НадоОтгрузить - ТаблицаОтгрузок.Количество
        ИНАЧЕ ТаблицаОтгрузок.НадоОтгрузить
    КОНЕЦ КАК Отгружаем
ИЗ
    ТаблицаОтгрузок КАК ТаблицаОтгрузок
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОтгрузок КАК ОтгруженоУже
        ПО ТаблицаОтгрузок.Месяц > ОтгруженоУже.Месяц

СГРУППИРОВАТЬ ПО
    ТаблицаОтгрузок.Месяц,
    ТаблицаОтгрузок.НадоОтгрузить,
    ТаблицаОтгрузок.Количество
31 echo77
 
19.06.14
09:58
(29) Пока не проверял. Сейчас буду все пробовать.
Спасибо
32 Bober
 
19.06.14
10:19
(31) отпишись по результату.
33 echo77
 
19.06.14
10:58
(20) Не получается так.
Возможно проблема в том, что у меня все это дело в разрезе номенклатуры и заказов
34 Bober
 
19.06.14
11:05
(33) тогда нужно указать группировку или группировать нужным образом. я же показал пример расчета по таблице из (0)
35 echo77
 
19.06.14
12:16
(22) Этот пример вполне жизнеспособен! Спасибо!
(34) Вам тоже спасибо