Продвинутый курс. Решение ДЗ№8

Представлениям решение задач по запросам

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 10 на “Продвинутый курс. Решение ДЗ№8”

  1. Евгений, в текущем решении теряются дни, если в день начала или окончания периода было списание до нуля

    • Спасибо за внимательный просмотр.
      Вот текст запроса, который учитывает приведенную ситуацию:

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

      ИНДЕКСИРОВАТЬ ПО
      Номенклатура,
      Период
      ;

      ////////////////////////////////////////////////////////////////////////////////
      ВЫБРАТЬ РАЗЛИЧНЫЕ
      ОстаткиТоваров.Номенклатура,
      &Начало КАК Период,
      0 КАК КоличествоКонечныйОстаток
      ПОМЕСТИТЬ ОстаткиСГраницами
      ИЗ
      ОстаткиТоваровБезГраниц КАК ОстаткиТоваров

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

      ВЫБРАТЬ РАЗЛИЧНЫЕ
      ОстаткиТоваров.Номенклатура,
      НАЧАЛОПЕРИОДА(&Окончание, ДЕНЬ),
      0
      ИЗ
      ОстаткиТоваровБезГраниц КАК ОстаткиТоваров

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

      ВЫБРАТЬ
      ОстаткиТоваров.Номенклатура,
      ОстаткиТоваров.Период,
      ОстаткиТоваров.КоличествоКонечныйОстаток
      ИЗ
      ОстаткиТоваровБезГраниц КАК ОстаткиТоваров
      ;

      ////////////////////////////////////////////////////////////////////////////////
      ВЫБРАТЬ
      ОстаткиСГраницами.Номенклатура,
      ОстаткиСГраницами.Период,
      СУММА(ОстаткиСГраницами.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
      ПОМЕСТИТЬ ОстаткиТоваров
      ИЗ
      ОстаткиСГраницами КАК ОстаткиСГраницами

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

      ;
      ////////////////////////////////////////////////////////////////////////////////
      ВЫБРАТЬ
      ОстаткиТоваров.Номенклатура,
      ОстаткиТоваров.Период
      ПОМЕСТИТЬ НулевыеОстатки
      ИЗ
      ОстаткиТоваров КАК ОстаткиТоваров
      ГДЕ
      ОстаткиТоваров.КоличествоКонечныйОстаток = 0
      ;

      ////////////////////////////////////////////////////////////////////////////////
      ВЫБРАТЬ
      НулевыеОстатки.Номенклатура,
      ВЫБОР
      КОГДА НулевыеОстатки.Период = &Начало
      ТОГДА НулевыеОстатки.Период
      ИНАЧЕ ДОБАВИТЬКДАТЕ(НулевыеОстатки.Период, ДЕНЬ, 1)
      КОНЕЦ КАК ПериодНачало,
      МИНИМУМ(ВЫБОР
      КОГДА ОстаткиТоваров.Период = &Окончание
      ТОГДА ОстаткиТоваров.Период
      ИНАЧЕ ДОБАВИТЬКДАТЕ(ОстаткиТоваров.Период, СЕКУНДА, -1)
      КОНЕЦ) КАК ПериодОкончание
      ПОМЕСТИТЬ НулевыеПериоды
      ИЗ
      ОстаткиТоваров КАК ОстаткиТоваров
      ВНУТРЕННЕЕ СОЕДИНЕНИЕ НулевыеОстатки КАК НулевыеОстатки
      ПО ОстаткиТоваров.Номенклатура = НулевыеОстатки.Номенклатура
      И ОстаткиТоваров.Период > НулевыеОстатки.Период

      СГРУППИРОВАТЬ ПО
      НулевыеОстатки.Номенклатура,
      ВЫБОР
      КОГДА НулевыеОстатки.Период = &Начало
      ТОГДА НулевыеОстатки.Период
      ИНАЧЕ ДОБАВИТЬКДАТЕ(НулевыеОстатки.Период, ДЕНЬ, 1)
      КОНЕЦ
      ;

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

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

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

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

  2. Кудрявцев Олег 12.01.2011 в 23:02

    Вообще пакетные запросы это круто.
    Стало легче писать запросы и разбираться в том как они работают. Очень помогает

  3. А где спрятан 2 запрос?!..

    • Нигде :)
      Полагаю, что с ним проблем быть не должно..

  4. Проверил 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)
      КОНЕЦ КАК СкоростьПродажи
      ИЗ
      РабочиеДни КАК РабочиеДни,
      РабочиеДниОтсутствияТоваров КАК РабочиеДниОтсутствияТоваров
      ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&Начало, &Окончание, , ) КАК ПродажиОбороты
      ПО РабочиеДниОтсутствияТоваров.Номенклатура = ПродажиОбороты.Номенклатура
      ;