Продвинутый курс. Занятие №9

Четвертое занятие 1-го блока продвинутого курса.

Необходимо изучить следующие главы текущего блока.
Глава 8. Оптимизация производительности прикладных решений.
Глава 9. Оптимизация производительности при работе с БД.

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

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

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

комментариев 13 на “Продвинутый курс. Занятие №9”

  1. Задание выполнила.
    1)Условие накладывается на таблицу, в которой нет значений Null. Надо описывать условие в разделе «ГДЕ».
    2) Новое поле «Сортировка», использующее оператор «Выбор»
    3) Таблицы поставщиков, остатков, цен – временные таблицы

  2. Задание выполнено.
    Задача 1.
    Вариант 1 – использовать внутренне соединение без условия на NULL.
    Вариант 2 – вынести условие на NULL в секцию ГДЕ.
    Задача 2.
    Необходимо добавить вычисляемое поле с помощью оператора ВЫБОР и по нему выполнять сортировку.
    Задача 3.
    Схема построения запроса:
    1) втОстаткиНоменклатуры – актуальные остатки;
    2) втЦеныНоменклатуры – цены номенклатуры, которая содержится таблице втОстаткиНоменклатуры;
    3) втСписокПоставщиков – контрагенты проведенных документов реализации по номенклатуре из таблицы втОстаткиНоменклатуры;
    4) левое соединение всех таблиц по основной втОстаткиНоменклатуры.

  3. Задача 1.
    Нужно изменить условия связи таблиц с Левого на Внутреннее и, кроме того, можно убрать второе условие. А почему не срабатывает условие “КоличествоОборот ЕСТЬ НЕ Null” не очень понятно…
    ВЫБРАТЬ
    ОстаткиТоваровОстатки.Номенклатура,
    ОстаткиТоваровОстатки.КоличествоОстаток,
    ПродажиОбороты.КоличествоОборот
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ПО (ПродажиОбороты.Номенклатура = ОстаткиТоваровОстатки.Номенклатура)

    Задача 2.
    Соединяем две таблицы Остатки и Продажи полным соединением. Кроме выходных полей указанных в задании добавляем поле сортировка, значение которого вычисляется согласно условию. Для того чтобы, поле сортировка не присутствовало в выходных полях, сохраняем запрос во ВТ с индексацией по полю сортировки. А во втором запросе пакета выводим необходимые поля, настроив порядок по полю Сортировка в порядке убывания значения.

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

    ИНДЕКСИРОВАТЬ ПО
    Сортировка
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    втПродажиИОстатки.Номенклатура,
    втПродажиИОстатки.Количество,
    втПродажиИОстатки.Остаток
    ИЗ
    втПродажиИОстатки КАК втПродажиИОстатки

    УПОРЯДОЧИТЬ ПО
    втПродажиИОстатки.Сортировка УБЫВ

    Задача 3.
    Сначала нужно создать временную таблицу соединив внутренним соединением ТЧ документов поступлений с регистром остатков. Проиндексировать по Номенклатуре, а затем, полученную ВТ связать левым соединением с таблицей среза последних ЦеныНоменклатуры. Причем в параметрах виртуальной таблицы среза последних нужно применить условие вхождения номенклатуры в, полученную на предыдущем шаге, временную таблицу.

    ВЫБРАТЬ
    ПоступлениеТоваровТовары.Ссылка.Контрагент,
    ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура
    ПОМЕСТИТЬ НоменклатураКонтрагентов
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
    ПО ОстаткиТоваровОстатки.Номенклатура = ПоступлениеТоваровТовары.Номенклатура

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

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    НоменклатураКонтрагентов.Номенклатура КАК Номенклатура,
    НоменклатураКонтрагентов.Контрагент КАК Контрагент,
    ЦеныНоменклатурыСрезПоследних.Цена
    ИЗ
    НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    ,
    Номенклатура В
    (ВЫБРАТЬ
    НоменклатураКонтрагентов.Номенклатура
    ИЗ
    НоменклатураКонтрагентов КАК НоменклатураКонтрагентов)) КАК ЦеныНоменклатурыСрезПоследних
    ПО НоменклатураКонтрагентов.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура

    СГРУППИРОВАТЬ ПО
    НоменклатураКонтрагентов.Номенклатура,
    НоменклатураКонтрагентов.Контрагент,
    ЦеныНоменклатурыСрезПоследних.Цена
    ИТОГИ ПО
    Номенклатура

  4. Кононов Сергей 06.06.2011 в 16:19

    задание выполнено.
    Задача 1.
    Для решения задачи программисту требуется сделать не левое соединение, а внутреннее соединение и убрать при этом в соединении условие на проверку null, тогда мы получим желаемый результат.
    Задача 2.
    приведу запрос:
    ВЫБРАТЬ
    ОстаткиТоваровОстаткиИОбороты.Номенклатура,
    ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток,
    ОстаткиТоваровОстаткиИОбороты.КоличествоРасход КАК Количество,
    ВЫБОР
    КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоРасход > 100
    ТОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоРасход
    ИНАЧЕ 0
    КОНЕЦ КАК ПолеСортировки
    ПОМЕСТИТЬ ПродажиОстатки
    ИЗ
    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , , ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОстатки.Номенклатура,
    ПродажиОстатки.Количество,
    ПродажиОстатки.Остаток КАК Остаток
    ИЗ
    ПродажиОстатки КАК ПродажиОстатки
    УПОРЯДОЧИТЬ ПО
    ПродажиОстатки.ПолеСортировки УБЫВ,
    Остаток УБЫВ
    Задача 3.
    ВЫБРАТЬ
    ОстаткиТоваровОстатки.Номенклатура,
    isnull(Цены.Цена,0) Как Цена
    ПОМЕСТИТЬ Товары
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    Левое СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних Как Цены
    ПО Цены.Номенклатура = ОстаткиТоваровОстатки.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ОстаткиТоваровОбороты.Номенклатура,
    ВЫРАЗИТЬ(ОстаткиТоваровОбороты.Регистратор КАК Документ.ПоступлениеТоваровИУслуг).Контрагент КАК Контрагент,
    СУММА(ОстаткиТоваровОбороты.КоличествоПриход) КАК КоличествоПриход
    ПОМЕСТИТЬ Закупки
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Обороты(, , Регистратор, ) КАК ОстаткиТоваровОбороты
    СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(ОстаткиТоваровОбороты.Регистратор КАК Документ.ПоступлениеТоваровИУслуг).Контрагент,
    ОстаткиТоваровОбороты.Номенклатура
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    Товары.Номенклатура КАК Номенклатура,
    Закупки.Контрагент КАК Контрагент,
    Товары.Цена
    ИЗ
    Товары КАК Товары
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Закупки КАК Закупки
    ПО Товары.Номенклатура = Закупки.Номенклатура
    УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Контрагент

    Задание выполнено.
    Задача 1.
    Для решения задачи программисту требуется сделать не левое соединение, а внутреннее соединение и убрать при этом в соединении условие на проверку null, тогда мы получим желаемый результат.
    Задача 2.
    приведу запрос:
     
    ВЫБРАТЬ
    ОстаткиТоваровОстаткиИОбороты.Номенклатура,
    ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток,
    ОстаткиТоваровОстаткиИОбороты.КоличествоРасход КАК Количество,
    ВЫБОР
    КОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоРасход > 100
    ТОГДА ОстаткиТоваровОстаткиИОбороты.КоличествоРасход
    ИНАЧЕ 0
    КОНЕЦ КАК ПолеСортировки
    ПОМЕСТИТЬ ПродажиОстатки
    ИЗ
    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , , ДвиженияИГраницыПериода, ) КАК ОстаткиТоваровОстаткиИОбороты
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ПродажиОстатки.Номенклатура,
    ПродажиОстатки.Количество,
    ПродажиОстатки.Остаток КАК Остаток
    ИЗ
    ПродажиОстатки КАК ПродажиОстатки
     
    УПОРЯДОЧИТЬ ПО
    ПродажиОстатки.ПолеСортировки УБЫВ,
    Остаток УБЫВ
     
    Задача 3.
     
    ВЫБРАТЬ
    ОстаткиТоваровОстатки.Номенклатура,
    isnull(Цены.Цена,0) Как Цена
    ПОМЕСТИТЬ Товары
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    Левое СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних Как Цены
    ПО Цены.Номенклатура = ОстаткиТоваровОстатки.Номенклатура
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ОстаткиТоваровОбороты.Номенклатура,
    ВЫРАЗИТЬ(ОстаткиТоваровОбороты.Регистратор КАК Документ.ПоступлениеТоваровИУслуг).Контрагент КАК Контрагент,
    СУММА(ОстаткиТоваровОбороты.КоличествоПриход) КАК КоличествоПриход
    ПОМЕСТИТЬ Закупки
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Обороты(, , Регистратор, ) КАК ОстаткиТоваровОбороты
     
    СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(ОстаткиТоваровОбороты.Регистратор КАК Документ.ПоступлениеТоваровИУслуг).Контрагент,
    ОстаткиТоваровОбороты.Номенклатура
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    Товары.Номенклатура КАК Номенклатура,
    Закупки.Контрагент КАК Контрагент,
    Товары.Цена
    ИЗ
    Товары КАК Товары
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Закупки КАК Закупки
    ПО Товары.Номенклатура = Закупки.Номенклатура
     
    УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Контрагент

     

    • Кононов Сергей 06.06.2011 в 16:20

      Почему то дублируется ответ, хотя я один раз написал ))

      • Это побочный эффект вставки из буфера обмена.

  5. Задача 1. Проблема в левом соединении, по которому берется вся инф. из таблицы остатков. Тип соединения изменить на внутреннее и убрать проверку на “ЕСТЬ НЕ NULL”.
    Задача 2. У меня получился такой запрос:
    ВЫБРАТЬ
    ВЫБОР
    КОГДА ОстаткиТоваровОстатки.КоличествоОстаток ЕСТЬ NULL
    ТОГДА ПродажиОбороты.Номенклатура
    ИНАЧЕ ОстаткиТоваровОстатки.Номенклатура
    КОНЕЦ КАК Номенклатура,
    ОстаткиТоваровОстатки.КоличествоОстаток,
    ПродажиОбороты.КоличествоОборот,
    ВЫБОР
    КОГДА ПродажиОбороты.КоличествоОборот > 100
    ТОГДА ПродажиОбороты.КоличествоОборот
    ИНАЧЕ ОстаткиТоваровОстатки.КоличествоОстаток
    КОНЕЦ КАК Сортировка
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ПО ОстаткиТоваровОстатки.Номенклатура = ПродажиОбороты.Номенклатура
    УПОРЯДОЧИТЬ ПО
    Сортировка УБЫВ
    Задача 3. Я переделала запрос таким образом:
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
    ПоступлениеТоваров.Контрагент
    ПОМЕСТИТЬ Закупки
    ИЗ
    Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    ПО ПоступлениеТоваровТовары.Ссылка = ПоступлениеТоваров.Ссылка
    ГДЕ
    ПоступлениеТоваров.Проведен
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    Остатки.Номенклатура,
    Цены.Цена,
    Закупки.Контрагент
    ИЗ
    РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК Остатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦены) КАК Цены
    ПО Остатки.Номенклатура = Цены.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ Закупки КАК Закупки   ПО (Закупки.Номенклатура = Остатки.Номенклатура)

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

    Задача 2.
    Решаем задачу в два этапа:
    1) Получаем данные о продажах и остатках, дополняя таблицу полем сортировки.
    2) Упорядочиваем таблицу по полю сортировки.

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

    УПОРЯДОЧИТЬ ПО
    Товары.Сортировка УБЫВ

    Задача 3.
    Используем временные таблицы:
    “Остатки” – используем как основную таблицу в соответствии с условием задачи.
    Соединяем таблицу “Остатки” левым соединением с таблицами “Закупки” и “Цены”.

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

  7. Задание выполнено.
    1.  ЛЕВОЕ соединение меняем на ВНУТРЕННЕ, убираем условие оборот не null, добавляем условие на неотрицательные остатки.
    2.  <code>
    ВЫБРАТЬ
    ЕСТЬNULL(ОстаткиТоваровОстатки.Номенклатура, ПродажиОбороты.Номенклатура) КАК Номенклатура,
    ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК Остаток,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК Продажи
    ПОМЕСТИТЬ ОстаткиИПродажи
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ПО ОстаткиТоваровОстатки.Номенклатура = ПродажиОбороты.Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ОстаткиИПродажи.Номенклатура,
    ОстаткиИПродажи.Остаток,
    ОстаткиИПродажи.Продажи,
    ВЫБОР
    КОГДА ОстаткиИПродажи.Продажи > 100
    ТОГДА ОстаткиИПродажи.Продажи
    ИНАЧЕ ОстаткиИПродажи.Остаток
    КОНЕЦ КАК Сортировка
    ИЗ
    ОстаткиИПродажи КАК ОстаткиИПродажи

    УПОРЯДОЧИТЬ ПО
    Сортировка УБЫВ
    </code>
    3. <code>
    ВЫБРАТЬ
    ОстаткиТоваровОстатки.Номенклатура
    ПОМЕСТИТЬ Товары
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ГДЕ
    ОстаткиТоваровОстатки.КоличествоОстаток > 0
    ;

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

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    Товары.Номенклатура,
    ПоставщикиТоваров.Контрагент,
    ЕСТЬNULL(ЦеныТоваров.Цена, 0) КАК Цена
    ИЗ
    Товары КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ ПоставщикиТоваров КАК ПоставщикиТоваров
    ПО Товары.Номенклатура = ПоставщикиТоваров.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ ЦеныТоваров КАК ЦеныТоваров
    ПО Товары.Номенклатура = ЦеныТоваров.Номенклатура

    </code>

  8. respublica 05.06.2011 в 21:33

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТДанные.Номенклатура КАК Номенклатура,
    ВТДанные.ОбъемПродаж КАК ОбъемПродаж,
    ВТДанные.Остаток КАК Остаток,
    0 КАК Приоритет,
    ВТДанные.ОбъемПродаж КАК ПолеСортировки
    ПОМЕСТИТЬ ВТДанныеДляВывода
    ИЗ
    ВТДанныеИБ КАК ВТДанные
    ГДЕ
    ВТДанные.ОбъемПродаж > 100

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

    ВЫБРАТЬ
    ВТДанные.Номенклатура,
    ВТДанные.ОбъемПродаж,
    ВТДанные.Остаток,
    1,
    ВТДанные.Остаток
    ИЗ
    ВТДанныеИБ КАК ВТДанные
    ГДЕ
    ВТДанные.ОбъемПродаж <= 100
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТДанныеДляВывода.Номенклатура,
    ВТДанныеДляВывода.ОбъемПродаж,
    ВТДанныеДляВывода.Остаток
    ИЗ
    ВТДанныеДляВывода КАК ВТДанныеДляВывода

    УПОРЯДОЧИТЬ ПО
    ВТДанныеДляВывода.Приоритет,
    ВТДанныеДляВывода.ПолеСортировки УБЫВ
    3. ВЫБРАТЬ
    Остатки.Номенклатура КАК Номенклатура,
    Остатки.КоличествоОстаток
    ПОМЕСТИТЬ ВТНомеклатураНаСкладах
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК Остатки

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТоварыДок.Номенклатура КАК Номенклатура,
    ТоварыДок.Ссылка.Контрагент КАК Контрагент
    ПОМЕСТИТЬ ВТПоставщикиНоменклатуры
    ИЗ
    Документ.ПоступлениеТоваров.Товары КАК ТоварыДок
    ГДЕ
    ТоварыДок.Ссылка.Проведен

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

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

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

    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВТНомеклатураНаСкладах.Номенклатура КАК Номенклатура,
    ВТПоставщикиНоменклатуры.Контрагент КАК Контрагент,
    ВТЦеныНоменклатуры.Цена КАК Цена
    ИЗ
    ВТНомеклатураНаСкладах КАК ВТНомеклатураНаСкладах
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПоставщикиНоменклатуры КАК ВТПоставщикиНоменклатуры
    ПО ВТНомеклатураНаСкладах.Номенклатура = ВТПоставщикиНоменклатуры.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ ВТЦеныНоменклатуры КАК ВТЦеныНоменклатуры
    ПО ВТНомеклатураНаСкладах.Номенклатура = ВТЦеныНоменклатуры.Номенклатура
     

  9. 1. Проблема заключается в использовании левого соединения и в условии связи “ПродажиОбороты.КоличествоОборот ЕСТЬ НЕ NULL”, которое не имеет особого смысла. Самое простое решение – убрать это условие связи и вместо левого соединения использовать внутреннее. Более оптимальным было бы получить продажи, поместить их во временную таблицу. Затем взять остатки по номенклатуре, хранящейся во временной таблице, и также поместить их во временную таблицу. Поле “Номенклатура” в обеих временных таблицах проиндексировать. После этого на 3-м шаге соединить две временные таблицы и получить нужный результат.
    2. Возьмем остатки из регистра “ОстаткиТоваров” и продажи из регистра “Продажи”, поместим данные в 2 временные таблицы, проиндексируем поле “Номенклатура”. Сделаем полное соединение 2-х временных таблиц по полю “Номенклатура”, добавим 2 служебных поля – первое поле содержит единицу, если объем продаж превышает 100 единиц, иначе 0; второе поле содержит объем продаж либо количество товара на остатке в зависимости от условия “продажи > 100”. Результат помещаем во временную таблицу, индексируем оба служебных поля для более быстрой сортировки. На последнем шаге выбираем нужные поля из временной таблицы и выполняем сортировку по убыванию по 2-м служебным полям.
    3. Оптимизируем запрос с помощью временных таблиц. Сначала получим номенклатуру и контрагентов из табличных частей документов поступления, поместим результат во врем. таблицу. Затем получим остатки и цены для номенклатуры, содержащейся во врем. таблице. На последнем этапе соединим 3 врем. таблицы и получим результат.

  10. Задание выполнено.
    Задача 1.  В запросе следует использовать внутреннее соединение (вторая связь не нужна), а также учесть что остаток может быть отрицательным. Текст запроса:
    <code>
    ВЫБРАТЬ
    ОстаткиТоваровОстатки.Номенклатура,
    ОстаткиТоваровОстатки.КоличествоОстаток,
    ПродажиОбороты.КоличествоОборот
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ПО (ПродажиОбороты.Номенклатура = ОстаткиТоваровОстатки.Номенклатура)
    ГДЕ
    ОстаткиТоваровОстатки.КоличествоОстаток > 0
    </code>
     
    Задача 2. Настраиваем сортировку так, что первое поле имеет значение оборота для товаров с оборотом более 100, для остальных товаров =0. Второе поле сортировки – остаток. Текст запроса:
    <code>
    ВЫБРАТЬ
    ЕСТЬNULL(ОстаткиТоваровОстатки.Номенклатура, ПродажиОбороты.Номенклатура) КАК Товар,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК Оборот,
    ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК Остаток
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ПО ОстаткиТоваровОстатки.Номенклатура = ПродажиОбороты.Номенклатура

    УПОРЯДОЧИТЬ ПО
    ВЫБОР
    КОГДА ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) > 100
    ТОГДА ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0)
    ИНАЧЕ 0
    КОНЕЦ УБЫВ,
    Остаток УБЫВ
    </code>
     
    Задача 3.  В запросе есть не обязательные вложенные запросы, к тому же запрос работает не совсем правильно – не учитывается возможное наличие отрицательных остатков. Решил задачу следующим образом:
    <code>
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПоступлениеТоваровИУслугТовары.Номенклатура КАК Номенклатура,
    ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент КАК Контрагент,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
    ИЗ
    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТовары
    ПО ОстаткиТоваровОстатки.Номенклатура = ПоступлениеТоваровИУслугТовары.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
    ГДЕ
    ПоступлениеТоваровИУслугТовары.Ссылка.Проведен
    И ОстаткиТоваровОстатки.КоличествоОстаток > 0

    УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Контрагент
    </code>

  11. По сравнению с предыдущим заданием…..  :)
    1. Меняем левое соединение на внутреннее, а также убираем связь по NULL, т.к. она не нужна.
    2. Текст запроса
    ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК Продажи,
    СУММА(ОстаткиТоваровОстатки.КоличествоОстаток) КАК Остаток,
    ВЫБОР
    КОГДА ПродажиОбороты.КоличествоОборот > 100
    ТОГДА ПродажиОбороты.КоличествоОборот
    ИНАЧЕ ОстаткиТоваровОстатки.КоличествоОстаток
    КОНЕЦ КАК Сортировка
    ПОМЕСТИТЬ втТаблицаПродажОстатков
    ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
    ПО ПродажиОбороты.Номенклатура = ОстаткиТоваровОстатки.Номенклатура

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    втТаблицаПродажОстатков.Номенклатура,
    втТаблицаПродажОстатков.Продажи,
    втТаблицаПродажОстатков.Остаток
    ИЗ
    втТаблицаПродажОстатков КАК втТаблицаПродажОстатков

    УПОРЯДОЧИТЬ ПО
    втТаблицаПродажОстатков.Сортировка УБЫВ
    3. Ну вот что получилось
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТоварыДок.Ссылка.Контрагент КАК Контрагент,
    ТоварыДок.Номенклатура КАК Номенклатура
    ПОМЕСТИТЬ ПоставщикиНоменклатуры
    ИЗ
    Документ.ПоступлениеТоваровИУслуг.Товары КАК ТоварыДок
    ГДЕ
    ТоварыДок.Ссылка.Проведен

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

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

    СГРУППИРОВАТЬ ПО
    ОстаткиТоваровОстатки.Номенклатура,
    ОстаткиТоваровОстатки.КоличествоОстаток,
    ПоставщикиНоменклатуры.Контрагент