|
Сводный отчет по списаниям/оприходованиям (оптимизация) | ☑ | ||
---|---|---|---|---|
0
Timekiller
27.10.14
✎
07:42
|
Я сразу извиняюсь за г**нокод, но щас 7 утра, а меня попросили успеть до 10.
УТ 10.3, Процедура УстановитьНачальныеНастройки, ТекстЗапроса: ВЫБРАТЬ РАЗРЕШЕННЫЕ ВложенныйЗапрос.Номенклатура КАК Номенклатура, ВложенныйЗапрос.Регистратор КАК Регистратор, ВложенныйЗапрос.КоличествоПриход КАК КоличествоПриход, ВложенныйЗапрос.КоличествоРасход КАК КоличествоРасход, ВложенныйЗапрос.КоличествоУбыль КАК КоличествоУбыль, ВложенныйЗапрос.КоличествоПроцентУбыли КАК КоличествоПроцентУбыли, ВложенныйЗапрос.КоличествоОборот КАК КоличествоОборот, ВложенныйЗапрос.СтоимостьПриход КАК СтоимостьПриход, ВложенныйЗапрос.СтоимостьРасход КАК СтоимостьРасход, ВложенныйЗапрос.СтоимостьУбыль КАК СтоимостьУбыль, ВложенныйЗапрос.СтоимостьПроцентУбыли КАК СтоимостьПроцентУбыли, ВложенныйЗапрос.СтоимостьОборот КАК СтоимостьОборот {ВЫБРАТЬ Номенклатура.*, Регистратор, КоличествоПриход, КоличествоРасход, КоличествоУбыль, КоличествоПроцентУбыли, КоличествоОборот, СтоимостьПриход, СтоимостьРасход, СтоимостьУбыль, СтоимостьПроцентУбыли, СтоимостьОборот} ИЗ (ВЫБРАТЬ ПартииТоваровНаСкладахОбороты.Номенклатура КАК Номенклатура, ПартииТоваровНаСкладахОбороты.Регистратор КАК Регистратор, ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоПриход, 0) КАК КоличествоПриход, ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоРасход, 0) КАК КоличествоРасход, ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоРасход, 0) - ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоПриход, 0) КАК КоличествоУбыль, 0 КАК КоличествоПроцентУбыли, 0 КАК КоличествоОборот, ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход, 0) КАК СтоимостьПриход, ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьРасход, 0) КАК СтоимостьРасход, ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьРасход, 0) - ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход, 0) КАК СтоимостьУбыль, 0 КАК СтоимостьПроцентУбыли, 0 КАК СтоимостьОборот ИЗ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПартииТоваровНаСкладахОбороты ГДЕ (ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладахОбороты.Регистратор) = ТИП(Документ.ОприходованиеТоваров) ИЛИ ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладахОбороты.Регистратор) = ТИП(Документ.СписаниеТоваров)) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.Регистратор, 0, 0, 0, 0, ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0), 0, 0, 0, 0, ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) ИЗ РегистрНакопления.Продажи.Обороты( &ДатаНач, &ДатаКон, Регистратор, Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ПартииТоваровНаСкладахОбороты.Номенклатура КАК Номенклатура ИЗ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПартииТоваровНаСкладахОбороты ГДЕ (ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладахОбороты.Регистратор) = ТИП(Документ.ОприходованиеТоваров) ИЛИ ТИПЗНАЧЕНИЯ(ПартииТоваровНаСкладахОбороты.Регистратор) = ТИП(Документ.СписаниеТоваров)))) КАК ПродажиОбороты) КАК ВложенныйЗапрос {ГДЕ ВложенныйЗапрос.Номенклатура.*, ВложенныйЗапрос.Регистратор, ВложенныйЗапрос.КоличествоПриход, ВложенныйЗапрос.КоличествоРасход, ВложенныйЗапрос.КоличествоУбыль, ВложенныйЗапрос.КоличествоПроцентУбыли, ВложенныйЗапрос.КоличествоОборот, ВложенныйЗапрос.СтоимостьПриход, ВложенныйЗапрос.СтоимостьРасход, ВложенныйЗапрос.СтоимостьУбыль, ВложенныйЗапрос.СтоимостьПроцентУбыли, ВложенныйЗапрос.СтоимостьОборот} ИТОГИ СУММА(КоличествоПриход), СУММА(КоличествоРасход), СУММА(КоличествоУбыль), ВЫБОР КОГДА СУММА(КоличествоОборот) = 0 ТОГДА 100 ИНАЧЕ СУММА(КоличествоУбыль) * 100 / СУММА(КоличествоОборот) КОНЕЦ КАК КоличествоПроцентУбыли, СУММА(КоличествоОборот), СУММА(СтоимостьПриход), СУММА(СтоимостьРасход), СУММА(СтоимостьУбыль), ВЫБОР КОГДА СУММА(СтоимостьОборот) = 0 ТОГДА 100 ИНАЧЕ СУММА(СтоимостьУбыль) * 100 / СУММА(СтоимостьОборот) КОНЕЦ КАК СтоимостьПроцентУбыли, СУММА(СтоимостьОборот) ПО ОБЩИЕ, Номенклатура {ИТОГИ ПО Номенклатура.*, Регистратор, КоличествоПриход, КоличествоРасход, КоличествоУбыль, КоличествоПроцентУбыли, КоличествоОборот, СтоимостьПриход, СтоимостьРасход, СтоимостьУбыль, СтоимостьПроцентУбыли, СтоимостьОборот} Отчет имеет вот такой вид: http://joxi.ru/nAy9eDvHXy71AZ и в целом работает, НО... меня ужасно бесит Номенклатура В(...). Знаю, что производительность сильно пострадала, однако не придумал, как сделать "Оборот продаж" так, чтобы итоги рассчитывались верно при различных группировках. Когда делал соединением, то процент убыли и оборот продаж рассчитывались криво, как в типовом отчете "Стоимостная оценка скалада": http://joxi.ru/E2pbMDEIBORarY путем сложения процентов, а мне такое точно не подходит. Жду вашей помощи по оптимизации |
|||
1
Dmitry1c
27.10.14
✎
08:18
|
Если база на SQL, то помести то, что находится во вложенном запросе "Номенклатура В" во временную таблицу и проиндексируй по полю "Номенклатура"
Но это также при условии, что основные тормоза дает именно это место. |
|||
2
Dmitry1c
27.10.14
✎
08:20
|
У тебя кстати дважды одна и та же информация дергается - из вложенных запросов. Помести данные первого вложенного запроса во временную таблицу, проиндексируй по номенклатуре, а потом используй уже выборку из этой временной таблицы по типу "ВЫБРАТЬ * Из ВТ_ПартииТоваровОбороты КАК Т"
|
|||
3
Dmitry1c
27.10.14
✎
08:22
|
Хотя стоп. Индексировать по полю "Номенклатура" тут нельзя
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |