Буду примного благодарен услышать критику по отчету который я написал.
Функция ПолучитьЗапросомСКЛ(НачДата,КонДата)
ВремяНачалаЗамера=_GetPerformanceCounter(); ТекстЗапроса = " | // Составим результирующую таблицу | Select | | $СпрНоменклатур.Группы as [Группа $Справочник.Группы], | Результат.Товар as [Товар $Справочник.ДляМагазинов], | Sum(КолВоТочек) as КолВоТочек, | Sum(Продажи) as Продажи, | Sum(ПродажиВРуб) as ПродажиВРуб, | Sum(Доход) as Доход | | From | ( | // Составим промежуточную таблицу, для подсчета точек продаж | Select | | Клиент as Клиент, | Товар as Товар, | 1 as КолВоТочек, | Sum(АВотИНашиПродажи) as Продажи, | Sum(АВотИНашиПродажи * ЦенаПродаж) as ПродажиВРуб, | (Sum(АВотИНашиПродажи * ЦенаПродаж) - Sum(АВотИНашиПродажи * ЦенаПриходов)) as Доход | | From | ( | // Составим таблицу с данными о движениях регистов | Select | | tmp.Клиент as Клиент, | tmp.Товар as Товар, | tmp.ГодИздания as ГодИздания, | tmp.НомерИздания as НомерИздания, | tmp.ЦенаПродаж as ЦенаПродаж, // Считаем продажи по формулам в зависимости от условий | Sum( | Case | When | ВозПост.ТоварВ is Null | Then | tmp.КолВоИнвРасход - tmp.КолВоИнвПриход | Else | tmp.КолВоНачОст + tmp.КолВоПриход - tmp.КолВоРасход | End) as АВотИНашиПродажи, // Выбираем значения цен приходов, из регистра "Цены Приходов", либо из справочника если нет в регистре | Max( | Case | When | ПриходЦены.ТоварП is Null or ПриходЦены.ЦенаПриходов = 0 | Then | $СпрНоменклатур.ВхЦена | Else | ПриходЦены.ЦенаПриходов | End) as ЦенаПриходов | | From | ( | // Выбираем начальные остатки из таблицы промежуточных итогов остаточного регистра на начало месяца от выбранной даты начала | Select | $reg.Клиент as Клиент, | $reg.Товар as Товар, | $reg.ГодИздания as ГодИздания, | $reg.НомерИздания as НомерИздания, | $reg.Цена as ЦенаПродаж, | $reg.КолВо as КолВоНачОст, | 0 as КолВоПриход, | 0 as КолВоРасход, | 0 as КолВоИнвРасход, | 0 as КолВоИнвПриход | From | $РегистрИтоги.ОстаткиНаМагазинах as reg (NOLOCK) | Where | (PERIOD = {d :ДатаОстатков}) | | Union All | // Выберем обороты за период от даты итогов до даты начала периода, тем самым получим начальные остатки по регистру на дату начала | Select | $reg.Клиент as Клиент, | $reg.Товар as Товар, | $reg.ГодИздания as ГодИздания, | $reg.НомерИздания as НомерИздания, | $reg.Цена as ЦенаПродаж, | (1 - reg.DEBKRED * 2)*$reg.КолВо as КолВоНачОст, | 0 as КолВоПриход, | 0 as КолВоРасход, | 0 as КолВоИнвРасход, | 0 as КолВоИнвПриход | From | $Регистр.ОстаткиНаМагазинах as reg (NOLOCK) | Where | (DATE_TIME_IDDOC>=:ДатаНачОстатков and DATE_TIME_IDDOC<:датН) | | Union All | // Выбираем обороты из таблицы за период от выбранных даты начала до даты конца | Select | $reg.Клиент as Клиент, | $reg.Товар as Товар, | $reg.ГодИздания as ГодИздания, | $reg.НомерИздания as НомерИздания, | $reg.Цена as ЦенаПродаж, | 0 as КолВоНачОст, // Считаем приходы по виду документа | Case | When | (reg.DEBKRED = 0) and (jrn.idDocDef = $ВидДокумента.ВедомостьМагазинов) | Then | $reg.КолВо | Else | 0 | End as КолВоПриход, // Считаем расходы по виду документа | Case | When | (reg.DEBKRED = 1) and (jrn.idDocDef = $ВидДокумента.ВозвратОтМагазинов) | Then | $reg.КолВо | Else | 0 | End as КолВоРасход, // Считаем приходы по инвентаризации | Case | When | (reg.DEBKRED = 1) and (jrn.idDocDef = $ВидДокумента.ИнвентаризацияМагазина) | Then | $reg.КолВо | Else | 0 | End as КолВоИнвРасход, // Считаем расходы по инвентаризации | Case | When | (reg.DEBKRED = 0) and (jrn.idDocDef = $ВидДокумента.ИнвентаризацияМагазина) | Then | $reg.КолВо | Else | 0 | End as КолВоИнвПриход | | From | $Регистр.ОстаткиНаМагазинах as reg (NOLOCK) | // Присоединим таблицу "журнал", нужна для определения вида документов | left outer join | _1SJourn jrn (nolock) ON jrn.iddoc = reg.iddoc | | Where | (reg.DATE_TIME_IDDOC>=:датН and reg.DATE_TIME_IDDOC<:датК~) | | ) as tmp | // Присоединим колонку для определения было это издание в возврате поставщику или нет | Left outer Join | ( | Select distinct | $РегВозПост.Товар as ТоварВ, | $РегВозПост.ГодИздания as ГодИзданияВ, | $РегВозПост.НомерИздания as НомерИзданияВ | From | $Регистр.ВозвратПост as РегВозПост (NOLOCK) // Присоединим документ возврат списание, для опредения вида списания указанного в реквизите документа | Inner join | $Документ.ВозвратСписание ДокВозврСпис (nolock) ON ДокВозврСпис.iddoc = РегВозПост.iddoc | Where | (РегВозПост.DATE_TIME_IDDOC>=:датН and РегВозПост.DATE_TIME_IDDOC<:датК~) | And | ($ДокВозврСпис.ВидСписания = :ВидСписания) | ) ВозПост | On
|