Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Запрос: количество дней наличия товара на складе за период.

Есть много заковыристых задачек, которые часто встречаются в работе. Давайте попробуем решить одну из таких задач разными методами и попытаемся найти оптимальный.Автор статьи: TormozIT | Редакторы:
Последняя редакция №22 от 23.03.07 | История
URL: http://kb.mista.ru/article.php?id=359

Задача.
Получить запросом общее количество дней наличия товара на складе в заданном периоде с группировками:
Номенклатура, ХарактеристикаНоменклатуры, Склад. Днем наличия товара считается день, на конец которого остаток положительный.

Проверочный набор данных №1

НачПериода = '01.08.2006  0:00:00';
КонПериода = '01.09.2006 23:59:59';




Вид движения Партия Период Количество
Приход Партия1 01.08.2006 1
Приход Партия2 02.08.2006 1
Расход Партия1 07.08.2006 1
Расход Партия2 07.08.2006 1
Приход Партия3 31.08.2006 1

Решение дожно выдать 8.

Мое решение.

ВЫБРАТЬ
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура               КАК Номенклатура,
    ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад                      КАК Склад,
    СУММА(
        ВЫБОР
            КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.Период = НАЧАЛОПЕРИОДА(&КонПериода, День) ТОГДА
                ВЫБОР
                    КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстатокПредыдущий > 0 ТОГДА
                        ВЫБОР
                            КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0 ТОГДА
                                РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОбороты.ПредыдущийПериод, ПартииТоваровНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
                            ИНАЧЕ
                                РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОбороты.ПредыдущийПериод, &КонПериода, ДЕНЬ) + 1
                        КОНЕЦ
                    ИНАЧЕ                            
                        ВЫБОР 
                            КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0 ТОГДА
                                 РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОбороты.Период, &КонПериода, ДЕНЬ) + 1
                             ИНАЧЕ
                                 0
                         КОНЕЦ
                КОНЕЦ
            ИНАЧЕ
                ВЫБОР
                    КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстатокПредыдущий > 0 ТОГДА
                        РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОбороты.ПредыдущийПериод, ПартииТоваровНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
                    ИНАЧЕ
                        0
                КОНЕЦ
        КОНЕЦ) КАК КоличествоДнейНаСкладе
ИЗ
    (ВЫБРАТЬ 
        ТаблицаПредыдущиеПериоды.Номенклатура                                      КАК Номенклатура,
        ТаблицаПредыдущиеПериоды.ХарактеристикаНоменклатуры                        КАК ХарактеристикаНоменклатуры,
        ТаблицаПредыдущиеПериоды.Склад                                             КАК Склад,
        ТаблицаПредыдущиеПериоды.Период                                            КАК Период,
        ТаблицаПредыдущиеПериоды.КоличествоКонечныйОстаток                         КАК КоличествоКонечныйОстаток,
        ТаблицаПредыдущиеПериоды.ПредыдущийПериод                                  КАК ПредыдущийПериод,
        ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.КоличествоКонечныйОстаток  КАК КоличествоКонечныйОстатокПредыдущий
    ИЗ
    (   ВЫБРАТЬ
            ПартииТоваровНаСкладахОстаткиИОбороты1.Номенклатура               КАК Номенклатура,
            ПартииТоваровНаСкладахОстаткиИОбороты1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            ПартииТоваровНаСкладахОстаткиИОбороты1.Склад                      КАК Склад,
            ПартииТоваровНаСкладахОстаткиИОбороты1.Период                     КАК Период,
            ПартииТоваровНаСкладахОстаткиИОбороты1.КоличествоКонечныйОстаток  КАК КоличествоКонечныйОстаток,
            МАКСИМУМ(ПартииТоваровНаСкладахОстаткиИОбороты2.Период)           КАК ПредыдущийПериод
        ИЗ
            РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Номенклатура В ИЕРАРХИИ  (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты1
            ЛЕВОЕ СОЕДИНЕНИЕ 
            РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Номенклатура В ИЕРАРХИИ  (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты2
            ПО (ИСТИНА)
                И ПартииТоваровНаСкладахОстаткиИОбороты1.Номенклатура               = ПартииТоваровНаСкладахОстаткиИОбороты2.Номенклатура
                И ПартииТоваровНаСкладахОстаткиИОбороты1.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОбороты2.ХарактеристикаНоменклатуры
                И ПартииТоваровНаСкладахОстаткиИОбороты1.Склад                      = ПартииТоваровНаСкладахОстаткиИОбороты2.Склад
                И ПартииТоваровНаСкладахОстаткиИОбороты1.Период > ПартииТоваровНаСкладахОстаткиИОбороты2.Период
    
        СГРУППИРОВАТЬ ПО
            ПартииТоваровНаСкладахОстаткиИОбороты1.Номенклатура,
            ПартииТоваровНаСкладахОстаткиИОбороты1.ХарактеристикаНоменклатуры,
            ПартииТоваровНаСкладахОстаткиИОбороты1.Склад,
            ПартииТоваровНаСкладахОстаткиИОбороты1.Период,
            ПартииТоваровНаСкладахОстаткиИОбороты1.КоличествоКонечныйОстаток
    ) КАК ТаблицаПредыдущиеПериоды
        
    ЛЕВОЕ СОЕДИНЕНИЕ 
    РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачПериода, &КонПериода, День, , Номенклатура В ИЕРАРХИИ  (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие
        
    ПО ИСТИНА
        И ТаблицаПредыдущиеПериоды.Номенклатура               = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.Номенклатура
        И ТаблицаПредыдущиеПериоды.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.ХарактеристикаНоменклатуры
        И ТаблицаПредыдущиеПериоды.Склад                      = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.Склад
        И ТаблицаПредыдущиеПериоды.ПредыдущийПериод           = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.Период
    ) КАК ПартииТоваровНаСкладахОстаткиИОбороты
            
СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура,
    ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад
        
АВТОУПОРЯДОЧИВАНИЕ

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика