Имя: Пароль:
1C
1С v8
Как подставить 0 в пустые значения левого соединения?
, ,
0 Alexion124
 
22.01.14
14:39
Подскажите как в запросе из РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(ДОБАВИТЬКДАТЕ(&КПериода, МЕСЯЦ, -3), &КПериода, Неделя, ) подставить 0 в недели которые без продаж, а то получается из 13 недель берутся только 3, в которых есть продажи, а мне нужно чтобы там 0 был. ЕСТЬNULL не помогает...

Сам запрос:

<code>

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

</code>

Как в
1 Avganec
 
22.01.14
14:52
(0) первоначально сформировать список из этих недель, а потом к нему делать соединение
2 Alexion124
 
22.01.14
14:54
(1) если вы имеете ввиду вложенный запрос в левом соединении то тогда невозможно будет данные полученные за неделю разделить на общие продажи, или как?
3 Alexion124
 
22.01.14
15:16
может так почитабельней будет

<CODE>
ВЫБРАТЬ
    ВсяВыручкаЗаПериод.КоличествоОборот / КоличествоНедель КАК СреднНедПотребл,
    ВсяВыручкаЗаПериод.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СУММА((ЕСТЬNULL(ВыручкаПоНеделям.КоличествоОборот, 0) - ВсяВыручкаЗаПериод.КоличествоОборот / КоличествоНедель) * (ЕСТЬNULL(ВыручкаПоНеделям.КоличествоОборот, 0) - ВсяВыручкаЗаПериод.КоличествоОборот / КоличествоНедель) / КоличествоНедель) КАК КоличествоОборот1
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НПериода, &КПериода, , ) КАК ВсяВыручкаЗаПериод
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НПериода, &КПериода, Неделя, ) КАК ВыручкаПоНеделям
            ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры = ВыручкаИСебестоимостьПродажОбороты1.АналитикаУчетаНоменклатуры
          
СГРУППИРОВАТЬ ПО
    ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура,
    ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот / КоличествоНедель
4 France
 
22.01.14
15:19
Когда null  тогда 0
5 Alexion124
 
22.01.14
15:21
(4) это не тоже самое (ЕСТЬNULL(ВыручкаПоНеделям.КоличествоОборот, 0)
6 Alexion124
 
22.01.14
15:21
?
7 WildSery
 
22.01.14
15:23
(0) Календарь ЛЕВОЕ СОЕДИНЕНИЕ ()
8 Alexion124
 
22.01.14
15:31
(7) Оо...  зачем?
9 Alexion124
 
22.01.14
15:35
(4) попробовал, не помогло.
10 Avganec
 
22.01.14
15:39
(9) в любом случае, у тебя есть 13 недель, а регистр выдает данные за 3, он не знает об оставшихся 10, так как в данной таблице нет данных. поэтому надо либо отдельно сформировать этот список из 13 недель, либо надо в данной таблице отразить движения по этим недостающим неделям. можно попробовать использовать периодичность до регистратора, но в этом случае надо будет менять виртуальную таблицу на остатки и обороты.
11 WildSery
 
22.01.14
15:40
(8) Чтобы получить недели, которых нет в регистре.
12 McMurphy
 
22.01.14
15:44
Я так понимаю у вас проблема в следующем:
1 неделя - 100
2 неделя - нет продаж
3 неделя - 50
Вторая неделя не выводиться. Так? Если это отчет на СКД но можно воспользоваться дополнением периода. Можно почитать на ИТС http://its.1c.ru/db/metod81#content:1587:1 Если нет, то и правда сначала придется сформировать таблицу с неделями и в запросе левым соединением присоединять к ней данные по продажам.
13 Alexion124
 
22.01.14
15:54
(11) (10)  теперь понял в чем причина, спасибо.
(12) к сожалению не на скд.
Можете набросать пример как календарь сюда прикрутить?
или ссылку с примером. яндекс бред какой то выдает.
14 пыхтачокк
 
22.01.14
16:04
ВЫБРАТЬ
МЕСЯЦ(НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)) КАК МесяцыСтрока,
НАЧАЛОПЕРИОДА РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК Месяцы
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
(тут условия периода)
СГРУППИРОВАТЬ ПО
МЕСЯЦ(НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)),
НАЧАЛОПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ)

можно без группировки, через РАЗЛИЧНЫЕ, короче и красивше. это разбивка (заданного) периода помесячно. консоль в помощь, производственный календарь на получаемый период ессно, должен быть заполнен. адаптируй под свои нужды.
15 McMurphy
 
22.01.14
16:19
(14) Хм. Если честно не понял. Ну да ладно.
(12) Кода не дождетесь.:) Но примерный алгоритм на словах такой. Есть ваш период. Формируете массив с датами начал недели например (06.01.2014, 13.01.2014, 20.01.2014, 27.01.2014). Выполняете ваш запрос. Теперь перебираете не выборку из запроса как сейчас, а массив недель. Ищите есть ли выборке данные за эту неделю (метод НайтиСледующий). Если есть отлично выводим, если нет то добавляем пустую строку. Как то так.
16 Alexion124
 
22.01.14
16:28
(15) приведенный мной запрос это часть запроса из 250 строк))) следующий() не пойдет и данных слишком много обрабатывается... около 10k позиций. Мы умрем пока все посчитается..
(14) дело в том что с МЕСЯЦЕМ понятно, а вот как мне НЕДЕЛИ получить?
17 Alexion124
 
22.01.14
16:30
(14) да и регистра у меня такого нет
18 WildSery
 
22.01.14
16:33
(17) Плохо. Календарь часто нужен бывает.
19 WildSery
 
22.01.14
16:35
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Календарь.Год,
    НЕДЕЛЯ(Календарь.ДатаКалендаря) КАК Неделя
ПОМЕСТИТЬ ВТ_Календарь
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
    Календарь.ДатаКалендаря МЕЖДУ &НПериода И &КПериода
;

ВЫБРАТЬ *
ИЗ
    ВТ_Календарь КАК Календарь
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НПериода, &КПериода, Неделя, ) КАК ВыручкаПоНеделям
        ПО Календарь.Год = ГОД(ВыручкаПоНеделям.Период) И Календарь.Неделя = НЕДЕЛЯ(ВыручкаПоНеделям.Период)
20 WildSery
 
22.01.14
16:42
Не, некрасиво.
Так лучше:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    НАЧАЛОПЕРИОДА(Календарь.ДатаКалендаря, НЕДЕЛЯ) КАК Неделя
ПОМЕСТИТЬ ВТ_Календарь
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
    Календарь.ДатаКалендаря МЕЖДУ &НПериода И &КПериода

ВЫБРАТЬ
    Календарь.Неделя КАК Период,
    ЕСТЬNULL(ВыручкаПоНеделям.КоличествоОборот, 0) КоличествоОборот
ИЗ
    ВТ_Календарь КАК Календарь
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НПериода, &КПериода, Неделя, ) КАК ВыручкаПоНеделям
        ПО Календарь.Неделя = ВыручкаПоНеделям.Период
21 Alexion124
 
23.01.14
00:46
(20) cделал но все равно выдает только за эти 3 недели...
22 sapphire
 
23.01.14
00:52
(21) да.. ну ты и тормоз, однако...
23 Alexion124
 
23.01.14
01:18
(22) поясни
24 WildSery
 
23.01.14
12:37
(21) Проверьте, что соединение левое.
А скорее всего, в условие ГДЕ напихали условий по левым таблицам, из-за чего соединение стало внутренним.
Условия нужно либо в ПО запихивать, либо вообще делать всё во вложенном запросе, а снаружи уже его соединять.
AdBlock убивает бесплатный контент. 1Сергей