пятница, 6 декабря 2013 г.

Запрос для расчет количества дней товара на складе (только рабочие дни)

Рассчитать количество дней, когда товар находился на складе можно, используя данный запрос:

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

        СГРУППИРОВАТЬ ПО
           
ТоварыНаСкладахНач.Номенклатура,
           
ТоварыНаСкладахНач.Период) КАК ОстаткиПериоды
        ПО (Календарь.ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон)
           
И (Календарь.ДатаКалендаря МЕЖДУ ОстаткиПериоды.ПериодНач И ОстаткиПериоды.ПериодКон)
           
И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
               
ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))

СГРУППИРОВАТЬ ПО
   
ОстаткиПериоды.Номенклатура

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

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

СГРУППИРОВАТЬ ПО
   
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, НЕДЕЛЯ),
   
КОНЕЦПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, НЕДЕЛЯ)

ИНДЕКСИРОВАТЬ ПО
   
НачалоИнтервала,
   
КонецИнтервала
;

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

        СГРУППИРОВАТЬ ПО
           
ТоварыНаСкладахНач.Номенклатура,
           
ТоварыНаСкладахНач.Период) КАК ОстаткиПериоды
        ПО (Календарь.ДатаКалендаря МЕЖДУ ОстаткиПериоды.ПериодНач И ОстаткиПериоды.ПериодКон)
           
И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
               
ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ПериодИнтервал КАК ПериодИнтервал
        ПО (Календарь.ДатаКалендаря МЕЖДУ ПериодИнтервал.НачалоИнтервала И ПериодИнтервал.КонецИнтервала)

СГРУППИРОВАТЬ ПО
   
ОстаткиПериоды.Номенклатура,
   
ПериодИнтервал.НачалоИнтервала,
   
ПериодИнтервал.КонецИнтервала,
   
ПериодИнтервал.РабочихДнейВИнтервале

Чтобы получить для месяца: заменяем периодичность "НЕДЕЛЯ" на "МЕСЯЦ".
Результат выполнения запроса для получения понедельного количества дней товара на остатках (с учетом выходных и праздников) представлен на скриншоте ниже.


Добавить комментарий

1 комментарий :

  1. Я порекомендую всем, кто ищет кредит для бизнеса, г-ну Бенджамину, который помог мне с кредитом в четыре миллиона долларов, чтобы начать свой бизнес, и это было быстро. Когда я получил от них кредит, было удивительно, насколько легко им было работать. Процесс был быстрым и ненадежно. Это был определенно положительный опыт. Избегайте мошенников и свяжитесь с г-ном Бенджамином. lfdsloans@outlook.com. WhatsApp ... + 19893943740. Если вы ищете бизнес-кредит.

    ОтветитьУдалить