Продвинутый курс. Решение ДЗ№8
Представлениям решение задач по запросам
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Евгений, в текущем решении теряются дни, если в день начала или окончания периода было списание до нуля
Спасибо за внимательный просмотр.
Вот текст запроса, который учитывает приведенную ситуацию:
ВЫБРАТЬ
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
ОстаткиТоваровОстаткиИОбороты.Период КАК Период,
ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток
ПОМЕСТИТЬ ОстаткиТоваровБезГраниц
ИЗ
РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&Начало, &Окончание, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ОстаткиТоваров.Номенклатура,
&Начало КАК Период,
0 КАК КоличествоКонечныйОстаток
ПОМЕСТИТЬ ОстаткиСГраницами
ИЗ
ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
ОстаткиТоваров.Номенклатура,
НАЧАЛОПЕРИОДА(&Окончание, ДЕНЬ),
0
ИЗ
ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура,
ОстаткиТоваров.Период,
ОстаткиТоваров.КоличествоКонечныйОстаток
ИЗ
ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиСГраницами.Номенклатура,
ОстаткиСГраницами.Период,
СУММА(ОстаткиСГраницами.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
ПОМЕСТИТЬ ОстаткиТоваров
ИЗ
ОстаткиСГраницами КАК ОстаткиСГраницами
СГРУППИРОВАТЬ ПО
ОстаткиСГраницами.Номенклатура,
ОстаткиСГраницами.Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура,
ОстаткиТоваров.Период
ПОМЕСТИТЬ НулевыеОстатки
ИЗ
ОстаткиТоваров КАК ОстаткиТоваров
ГДЕ
ОстаткиТоваров.КоличествоКонечныйОстаток = 0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НулевыеОстатки.Номенклатура,
ВЫБОР
КОГДА НулевыеОстатки.Период = &Начало
ТОГДА НулевыеОстатки.Период
ИНАЧЕ ДОБАВИТЬКДАТЕ(НулевыеОстатки.Период, ДЕНЬ, 1)
КОНЕЦ КАК ПериодНачало,
МИНИМУМ(ВЫБОР
КОГДА ОстаткиТоваров.Период = &Окончание
ТОГДА ОстаткиТоваров.Период
ИНАЧЕ ДОБАВИТЬКДАТЕ(ОстаткиТоваров.Период, СЕКУНДА, -1)
КОНЕЦ) КАК ПериодОкончание
ПОМЕСТИТЬ НулевыеПериоды
ИЗ
ОстаткиТоваров КАК ОстаткиТоваров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ НулевыеОстатки КАК НулевыеОстатки
ПО ОстаткиТоваров.Номенклатура = НулевыеОстатки.Номенклатура
И ОстаткиТоваров.Период > НулевыеОстатки.Период
СГРУППИРОВАТЬ ПО
НулевыеОстатки.Номенклатура,
ВЫБОР
КОГДА НулевыеОстатки.Период = &Начало
ТОГДА НулевыеОстатки.Период
ИНАЧЕ ДОБАВИТЬКДАТЕ(НулевыеОстатки.Период, ДЕНЬ, 1)
КОНЕЦ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НулевыеПериоды.Номенклатура,
СУММА(ГрафикиРаботы.Значение) КАК Значение
ПОМЕСТИТЬ РабочиеДниОтсутствияТоваров
ИЗ
НулевыеПериоды КАК НулевыеПериоды
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ПО (ГрафикиРаботы.Дата МЕЖДУ НулевыеПериоды.ПериодНачало И НулевыеПериоды.ПериодОкончание)
ГДЕ
ГрафикиРаботы.ТипГрафика = ЗНАЧЕНИЕ(Справочник.ТипыГрафиков.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
НулевыеПериоды.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СУММА(ГрафикиРаботы.Значение) КАК Значение
ПОМЕСТИТЬ РабочиеДни
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ГДЕ
ГрафикиРаботы.ТипГрафика = ЗНАЧЕНИЕ(Справочник.ТипыГрафиков.ПустаяСсылка)
И ГрафикиРаботы.Дата МЕЖДУ &Начало И &Окончание
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РабочиеДниОтсутствияТоваров.Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(РабочиеДни.Значение – РабочиеДниОтсутствияТоваров.Значение, 0) = 0
ТОГДА 0
ИНАЧЕ ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) / ЕСТЬNULL(РабочиеДни.Значение – РабочиеДниОтсутствияТоваров.Значение, 0)
КОНЕЦ КАК СкоростьПродажи
ИЗ
РабочиеДни КАК РабочиеДни,
РабочиеДниОтсутствияТоваров КАК РабочиеДниОтсутствияТоваров
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&Начало, &Окончание, , ) КАК ПродажиОбороты
ПО РабочиеДниОтсутствияТоваров.Номенклатура = ПродажиОбороты.Номенклатура
Вообще пакетные запросы это круто.
Стало легче писать запросы и разбираться в том как они работают. Очень помогает
А где спрятан 2 запрос?!..
Нигде :)
Полагаю, что с ним проблем быть не должно..
Проверил 1 решение на своих данных – один товар сошелся другой – нет !..
Не сошелся:
Приход 10.12.10 – 1 шт.
Расход 10.12.10 – 1 шт.
Приход 20.12.10 – 1 шт.
Скорость: 1 шт/11 раб. дн = 0.09
А не 0.0(5) – как показала проверка..
То есть в календаре из 13 дней (10 декабря и с 20 по 31 декабря) 2 выходных?
Исходя из того, что выходные обычно суббота и воскресенье должно быть 3 или 4 выходных.
Но пример сейчас у себя вобью, покручу.
Как НИстранно, но с 20 по 31 декабря – всего 2 выходных !..
P.S.: Видимо это как-то связано с – Фазой луны !.. ;))
Да, точно :)
Я не учел, что дни идут не подряд, поэтому 2 выходных это возможная ситуация :)
Действительно закралась ошибка.
Вот запрос исправленный.
ВЫБРАТЬ
ОстаткиТоваровОстаткиИОбороты.Номенклатура КАК Номенклатура,
ОстаткиТоваровОстаткиИОбороты.Период КАК Период,
ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток
ПОМЕСТИТЬ ОстаткиТоваровБезГраниц
ИЗ
РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(&Начало, &Окончание, День, ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ОстаткиТоваров.Номенклатура,
&Начало КАК Период,
0 КАК КоличествоКонечныйОстаток
ПОМЕСТИТЬ ОстаткиСГраницами
ИЗ
ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
ОстаткиТоваров.Номенклатура,
НАЧАЛОПЕРИОДА(&Окончание, ДЕНЬ),
0
ИЗ
ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура,
ОстаткиТоваров.Период,
ОстаткиТоваров.КоличествоКонечныйОстаток
ИЗ
ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиСГраницами.Номенклатура,
ОстаткиСГраницами.Период,
СУММА(ОстаткиСГраницами.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
ПОМЕСТИТЬ ОстаткиТоваров
ИЗ
ОстаткиСГраницами КАК ОстаткиСГраницами
СГРУППИРОВАТЬ ПО
ОстаткиСГраницами.Номенклатура,
ОстаткиСГраницами.Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстаткиТоваров.Номенклатура,
ОстаткиТоваров.Период
ПОМЕСТИТЬ НулевыеОстатки
ИЗ
ОстаткиТоваров КАК ОстаткиТоваров
ГДЕ
ОстаткиТоваров.КоличествоКонечныйОстаток = 0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НулевыеОстатки.Номенклатура,
ВЫБОР
КОГДА НулевыеОстатки.Период = &Начало
ТОГДА НулевыеОстатки.Период
ИНАЧЕ ДОБАВИТЬКДАТЕ(НулевыеОстатки.Период, ДЕНЬ, 1)
КОНЕЦ КАК ПериодНачало,
МИНИМУМ(ВЫБОР
КОГДА ОстаткиТоваров.Период = &Окончание
ТОГДА ОстаткиТоваров.Период
ИНАЧЕ ДОБАВИТЬКДАТЕ(ОстаткиТоваров.Период, СЕКУНДА, -1)
КОНЕЦ) КАК ПериодОкончание
ПОМЕСТИТЬ НулевыеПериоды
ИЗ
ОстаткиТоваров КАК ОстаткиТоваров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ НулевыеОстатки КАК НулевыеОстатки
ПО ОстаткиТоваров.Номенклатура = НулевыеОстатки.Номенклатура
И ОстаткиТоваров.Период > НулевыеОстатки.Период
СГРУППИРОВАТЬ ПО
НулевыеОстатки.Номенклатура,
ВЫБОР
КОГДА НулевыеОстатки.Период = &Начало
ТОГДА НулевыеОстатки.Период
ИНАЧЕ ДОБАВИТЬКДАТЕ(НулевыеОстатки.Период, ДЕНЬ, 1)
КОНЕЦ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НулевыеПериоды.Номенклатура,
СУММА(ГрафикиРаботы.Значение) КАК Значение
ПОМЕСТИТЬ РабочиеДниОтсутствияТоваров
ИЗ
НулевыеПериоды КАК НулевыеПериоды
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ПО (ГрафикиРаботы.Дата МЕЖДУ НулевыеПериоды.ПериодНачало И НулевыеПериоды.ПериодОкончание)
ГДЕ
ГрафикиРаботы.ТипГрафика = ЗНАЧЕНИЕ(Справочник.ТипыГрафиков.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
НулевыеПериоды.Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СУММА(ГрафикиРаботы.Значение) КАК Значение
ПОМЕСТИТЬ РабочиеДни
ИЗ
РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ГДЕ
ГрафикиРаботы.ТипГрафика = ЗНАЧЕНИЕ(Справочник.ТипыГрафиков.ПустаяСсылка)
И ГрафикиРаботы.Дата МЕЖДУ &Начало И &Окончание
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РабочиеДниОтсутствияТоваров.Номенклатура,
ВЫБОР
КОГДА ЕСТЬNULL(РабочиеДни.Значение – РабочиеДниОтсутствияТоваров.Значение, 0) = 0
ТОГДА 0
ИНАЧЕ ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) / ЕСТЬNULL(РабочиеДни.Значение – РабочиеДниОтсутствияТоваров.Значение, 0)
КОНЕЦ КАК СкоростьПродажи
ИЗ
РабочиеДни КАК РабочиеДни,
РабочиеДниОтсутствияТоваров КАК РабочиеДниОтсутствияТоваров
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&Начало, &Окончание, , ) КАК ПродажиОбороты
ПО РабочиеДниОтсутствияТоваров.Номенклатура = ПродажиОбороты.Номенклатура
;