Имя: Пароль:
1C
1С v8
Чудеса в запросе
0 User_Agronom
 
29.04.13
16:57
Есть запрос.
в нем поле

ВЫБОР
   КОГДА (СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) > 0)
   ТОГДА 2
   ИНАЧЕ 1
КОНЕЦ КАК КоличествоНеНоль

Значение получается NULL. (Выполняю запрос в консоли запросов)

как так может быть?
1 Wobland
 
29.04.13
16:58
ну показывай запрос
2 Irbis
 
29.04.13
16:58
КоличествоРасход = NULL ?
3 Wobland
 
29.04.13
16:59
а вообще, ты врёшь
4 Flyd-s
 
29.04.13
17:00
Естьnull(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход , 0)
5 Ахиллес
 
29.04.13
17:01
Ну соединение двух таблиц. Тупа нет суммы никакой, поэтому NULL
6 Flyd-s
 
29.04.13
17:02
ВЫБРАТЬ
ВЫБОР
   КОГДА null > 0
   ТОГДА 2
   ИНАЧЕ 1
КОНЕЦ КАК КоличествоНеНоль

Дает 1, а не null
7 Wobland
 
29.04.13
17:03
(2) (5) а ну и чо?
8 User_Agronom
 
29.04.13
17:07
(5) Я вообще-то думал, что либо 1 либо 2 буду получать(( откуда NULL вылазит?
9 Wobland
 
29.04.13
17:08
(8) пруфскрин закежь
10 Ахиллес
 
29.04.13
17:08
(7) Что нуичто? Если в выборке NULL то оно не может быть больше или меньше нуля и нулю не может быть равно. Сответственно возвращать будет не 2 или 1 а NULL
(8) Очевидно, что в запросе есть соединение нескольких таблиц. Оттуда и лезет.
11 Wobland
 
29.04.13
17:09
(10) любая операция с нуллом даёт ложь
12 Wobland
 
29.04.13
17:09
(11) *сравнение
13 Irbis
 
29.04.13
17:10
(8) Ну нет у базы гармошки по такому запросу, он тебе NULL и пихает в ответ
14 Ахиллес
 
29.04.13
17:10
(12) А оно и не сравнивается. Оно само по себе есть NULL.ю
15 User_Agronom
 
29.04.13
17:11
(1) Вот он, в упрощенном виде:
ВЫБРАТЬ РАЗЛИЧНЫЕ
   Справочник1.Номенклатура КАК Номенклатура,
   Справочник1.Склад,
   РасходЯнварь.Расход КАК М1,
   РасходЯнварь.КоличествоНеНоль КАК К1
ИЗ
   (ВЫБРАТЬ
       ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
       ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
       СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК Расход
   ИЗ
       РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатК, &Дат, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
   ГДЕ
       НЕ(ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот = 0
       И ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход = 0
       И ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход = 0)
   СГРУППИРОВАТЬ ПО
       ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
       ТоварыНаСкладахОстаткиИОбороты.Склад) КАК Справочник1        
       ЛЕВОЕ СОЕДИНЕНИЕ (
                   ВЫБРАТЬ
                  ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
                  ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
                  СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК Расход,
                  ВЫБОР
                  КОГДА (СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) > 0)
              ТОГДА 2
              ИНАЧЕ 1
              КОНЕЦ КАК КоличествоНеНоль
                 ИЗ
                РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатК, ДОБАВИТЬКДАТЕ(&ДатК, МЕСЯЦ, 1), Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
                 СГРУППИРОВАТЬ ПО
                   ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                  ТоварыНаСкладахОстаткиИОбороты.Склад) КАК РасходЯнварь
             ПО Справочник1.Номенклатура = РасходЯнварь.Номенклатура
           И Справочник1.Склад = РасходЯнварь.Склад
16 Wobland
 
29.04.13
17:12
(14) у него там функция агрегатная
v8: священный NULL и сложение
17 Wobland
 
29.04.13
17:16
(15) ну и чо? левое соединение даёт нулл. нету подходящих записей
18 Wern
 
29.04.13
17:18
(16) У него агрегатная функция в условии, а не в значении поля смотри (6). Потому не важно NULL она или нет.
19 Ахиллес
 
29.04.13
17:18
(15) Можешь продолжать биться башкой в стену и причитать какая адинэс плохая, а можешь быстренько всё поправить. Естьnull тебе в помощь. Можешь в подзапрос предварительно обернуть для более простого понимания.
20 Wobland
 
29.04.13
17:19
засунь вот это в консоль, посмотри результат и больше не делай сомнительных утверждений

ВЫБРАТЬ
|            ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
|            ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
|            СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК Расход,
|            ВЫБОР
|                КОГДА СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) > 0
|                    ТОГДА 2
|                ИНАЧЕ 1
|            КОНЕЦ КАК КоличествоНеНоль
|        ИЗ
|            РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатК, ДОБАВИТЬКДАТЕ(&ДатК, МЕСЯЦ, 1), Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
|        
|        СГРУППИРОВАТЬ ПО
|            ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
|            ТоварыНаСкладахОстаткиИОбороты.Склад
21 Wobland
 
29.04.13
17:26
до меня только сейчас дошло. чтобы при левом соединении не было нуллов, нужно исключить их из правой таблицы ;)
22 User_Agronom
 
29.04.13
17:27
(17) спасибо.
Что-то я и правда не подумал, что может не найти.
23 Aprobator
 
29.04.13
17:27
(0) левое соединение и к гадалке не ходи.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший