Имя: Пароль:
1C
1С v8
В запросе не работает условие ГДЕ | ТабН.Артикул = &Null Помогите разобраться
0 evorle145
 
05.07.12
15:15
У меня две таблицы ТабМ и ТабН. Мне нужно выбрать все записи из таблицы ТабМ, если артикул из ТабМ есть в ТабН, то такую записью вообще не брать. Делаю вот так:
помещаю сначала в внутренние таблицы, а потом полное внешнее соединение делаю с условием где артикул из табН равен Null.
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос2.Текст = "
       |ВЫБРАТЬ
       |    ТабН.Артикул
       |  ПОМЕСТИТЬ ТабН
       |ИЗ &ТабН КАК ТабН";
Запрос2.УстановитьПараметр("ТабН", ТабН);
Запрос2.Выполнить();
Запрос2.Текст = "
       |ВЫБРАТЬ
       |     ТабМ.Артикул,
       |    ТабМ.Номенклатура,
       |    ТабМ.Цена,
       |    ТабМ.Количество
       |  ПОМЕСТИТЬ ТабМ
       |ИЗ &ТабМ КАК ТабМ";
Запрос2.УстановитьПараметр("ТабМ", ТабМ);
Запрос2.Выполнить();

// Теперь ТЗ можно использовать в запросе:
   
Запрос2.Текст = "ВЫБРАТЬ
            |    ТАБМ.Артикул КАК Артикул,
            |    ТАБМ.Номенклатура,
            |    ТАБМ.Цена,
            |    ТАБМ.Количество КАК Количество,
            |    ТабН.Артикул КАК Артикул1
            |ИЗ
            |    ТАБМ КАК ТАБМ
            |        ПОЛНОЕ СОЕДИНЕНИЕ ТабН КАК ТабН
            |        ПО ТАБМ.Артикул = ТабН.Артикул
            |ГДЕ
            |    ТабН.Артикул = &Null";
                 
Запрос2.УстановитьПараметр("NULL", NULL);
   ТабТест = Запрос2.Выполнить().Выгрузить();
Однако не работает!!! ТабТест получается пустой! Хотя ТабМ и ТабН 100% не пустые. Помогите пожалуйста
1 Hipernate
 
05.07.12
15:20
на Null равентсво нельзя делать есть специальная конструкция "есть Null"
2 Darvator
 
05.07.12
15:22
ЕСТЬNULL(ТабН.Артикул, 0)

И потом условие

ТабН.Артикул = 0
3 evorle145
 
05.07.12
15:22
Вот блин, все время про это забываю! То есть надо так: Где ТабН.Артикул естьNUll?
4 Ненавижу 1С
 
гуру
05.07.12
15:22
(3) нет
5 Ненавижу 1С
 
гуру
05.07.12
15:22
Запрос2.УстановитьПараметр("NULL", NULL);

шикарно
6 Ненавижу 1С
 
гуру
05.07.12
15:23
используй Неопределено, до NULL ты не дорос
7 del123
 
05.07.12
15:26
жестоко :))
8 Лефмихалыч
 
05.07.12
15:26
(0) читай мануалы. В запросе любые сравнения с NULL возвращают всегда ложь
9 Ненавижу 1С
 
гуру
05.07.12
15:29
(8) это в 1С, а мне больше нравится "любые сравнения с NULL возвращают NULL"
10 evorle145
 
05.07.12
15:30
(8), так ведь знал, да забыл. Без вашей помощи еще б не скоро вспомнил!
11 evorle145
 
05.07.12
15:34
вот так переделал:
Запрос2.Текст = "ВЫБРАТЬ
                   |    ТАБМ.Артикул КАК Артикул,
                   |    ТАБМ.Номенклатура,
                   |    ТАБМ.Цена,
                   |    ТАБМ.Количество КАК Количество
                   |ИЗ
                   |    ТАБМ КАК ТАБМ
                   |        ПОЛНОЕ СОЕДИНЕНИЕ ТабН КАК ТабН
                   |        ПО ТАБМ.Артикул = ТабН.Артикул
                   |ГДЕ
                   |    ЕСТЬNULL(ТабН.Артикул, 0) =&Ноль";
                 
   Запрос2.УстановитьПараметр("Ноль", 0);

Оптимально?
13 Defender aka LINN
 
05.07.12
15:36
(11) Класс. Давай еще лучше сделаем:

ГДЕ
  (ЕСТЬNULL(ТабН.Артикул, 0) =&Ноль) = &Истина
14 evorle145
 
05.07.12
15:38
(13), а в чем я не прав?
15 del123
 
05.07.12
15:39
(14) зачем ноль параметром передавать??
16 vde69
 
05.07.12
15:39
(11)>>>Оптимально?

смеешся?

1. "ТАБМ" и "ТабН" - чего буквы экономишь? называть понятными словами никак?
2. сравнение по текстовому полю совсем не айс
3. можно так "ГДЕ ТабН.Артикул ЕСТЬ NULL"
17 Darvator
 
05.07.12
15:39
Запрос2.Текст = "ВЫБРАТЬ
                   |    ЕСТЬNULL(ТАБМ.Артикул, 0) КАК Артикул,
                   |    ТАБМ.Номенклатура,
                   |    ТАБМ.Цена,
                   |    ТАБМ.Количество КАК Количество
                   |ИЗ
                   |    ТАБМ КАК ТАБМ
                   |        ПОЛНОЕ СОЕДИНЕНИЕ ТабН КАК ТабН
                   |        ПО ТАБМ.Артикул = ТабН.Артикул
                   |ГДЕ
                   |    ТабН.Артикул =0";
                 

Научишься, не переживай.
18 evorle145
 
05.07.12
15:42
(16), критику понял, только вот что касается пункта 3,разве в (3), я не тоже самое написал
(17), наверное имелось ввиду не
"ЕСТЬNULL(ТАБМ.Артикул, 0) КАК Артикул,"
а
"ЕСТЬNULL(ТАБН.Артикул, 0) КАК Артикул,"
19 evorle145
 
05.07.12
15:43
(17), хотя это не важно
20 0_Serg_0
 
05.07.12
15:47
(18) не тоже самое)
21 evorle145
 
05.07.12
15:50
(20),Э, пробел пропустил, согласен)
22 evorle145
 
05.07.12
15:50
Большое спасибо за подсказки!
Сделал как написано в (17) и (16). Оба варианта работают.
23 Лефмихалыч
 
05.07.12
15:54
(9) тогда внешние соединения в запросах будут в вечный цикл впадать, получая NULL в результате проверки условия соединения
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший