Имя: Пароль:
1C
1С v8
Условие И в запросе
0 Интрудер
 
02.08.12
13:59
Не получается объединить несколько условий И в запросе в один. То есть
   (ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1)
   И &ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
   И ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления)
   И ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
предполагает два условия, первое объединение трех истин, второе одиночное. В конструкторе запроса вижу 4 независимых условия, запрос понятно не работает. Операторные скобки в первом тоже не помогают. Может кто нибудь помочь?
1 Ц_У
 
02.08.12
14:00
Конструктор срезает скобки, причем глупо срезает чаще всего, попробуй ручками проставить скобки
2 Pro-tone
 
модератор
02.08.12
14:00
(0) а что такое "одиночное" условие ?
3 DrShad
 
02.08.12
14:01
И &ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1) что это!?
4 SherifSP
 
02.08.12
14:01
(2)Это когда 2 и более условий, суют в 1)
5 Ц_У
 
02.08.12
14:01
((условие1 и условие2 и условие3 ) и (условие4))
6 Pro-tone
 
02.08.12
14:01
(1) ничего там не срезает
7 Ц_У
 
02.08.12
14:02
(6) ога.. нисризаит..
8 ssh2006
 
02.08.12
14:03
(0) расстановка скобок на  результат не повлияет
9 Интрудер
 
02.08.12
14:05
(5) после закрытия конструктора получаем
   ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1)
   И &ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
   И ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления
   И ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
10 ssh2006
 
02.08.12
14:05
(9) потому что (8)
11 Интрудер
 
02.08.12
14:06
Что бы не дела, операторные скобки конструктору фиолетовы, срезает :(
12 Интрудер
 
02.08.12
14:07
нет способа?
13 Ц_У
 
02.08.12
14:07
(11) в твоем случае что должно быть то, может ты не правильно условия ставишь?
14 ssh2006
 
02.08.12
14:07
(12) расстановка скобок на  результат не влияет
15 Lex_Liven
 
02.08.12
14:08
(ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1)
И &ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
И ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления)
И (ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон)

всю жизнь заключаю МЕЖДУ в скобки - проблем не было.
16 Ц_У
 
02.08.12
14:08
(12) руками поправить текст после конструктора не?
17 Pro-tone
 
02.08.12
14:08
>запрос понятно не работает

(0) что за формулировка? запрос не работает только в том, случае, когда система выдает ошибку при исполнении запроса!
А у тебя некорректно заданы условия в запросе! Мы тут не можем понять что-то хочешь получить выборку чего в итоге.
18 Molinor
 
02.08.12
14:08
Оператору И фиолетово на скобки. Все условия должны выполняться.
19 sash-ml
 
02.08.12
14:10
лучше так &ДатаПоступления > ДАТАВРЕМЯ(1973, 1, 1)
20 Интрудер
 
02.08.12
14:11
(17) почему не корректно? если есть и дата отгрузки и дата поступления то дата поступления должна быть раньше даты отгрузки
21 Pro-tone
 
02.08.12
14:12
(20)запрос отрабатывает те условия, которые ты в него задал, значит смотри сам почему записи в выборке им не удовлетворяют
22 Lex_Liven
 
02.08.12
14:13
"если есть и дата отгрузки и дата поступления то дата поступления должна быть раньше даты отгрузки" - а у вас в запросе - дата поступления БОЛЬШЕ отгрузки
23 Интрудер
 
02.08.12
14:13
(15) если посмотреть ваше предложение в конструкторе, увидим 4 условия. После его закрытия увидим (9)
24 palpetrovich
 
02.08.12
14:13
(19) а почему не ограничить выбор пользователем "ДатаПоступления" до запроса? короче (3)+1
25 Интрудер
 
02.08.12
14:16
(24) Если дата отгрузки или дата поступления отсутствуют то без разницы проверять дальше. Это объединенное условие. Похоже можно только переделать логику с И на ИЛИ. Не дружит конструктор с И.
26 Интрудер
 
02.08.12
14:17
(24) это не ограничения. Это отбор документов с этим условием.
27 Pro-tone
 
02.08.12
14:18
(25) это ты сам не понимаешь разницу между И и ИЛИ
28 Интрудер
 
02.08.12
14:19
(3) Это проверка на пустую дату. Есть проще способ? Хотя трабла не в этом. Логику с ИЛИ конструктоп объединяет, с И нет. Ни в одном языке не всречал такого.
29 Molinor
 
02.08.12
14:19
(25) Это ты не дружишь с И. :)
По твоему условия обе даты должны быть заполнены.
30 ssh2006
 
02.08.12
14:20
(25) > Не дружит конструктор с И.

В цепочке из И скобки не могут повлиять на результат. Смысла в них там нет. Конструктор их и убирает.
31 Интрудер
 
02.08.12
14:20
(27) правильно показана нужная логика. она не соблюдается, и что же я не понимаю?
32 Sammo
 
02.08.12
14:21
Была фишка, в некоторых филигилиизгибистых условия конструктор некорректно ставит скобки. Решение - руками править.
Но это не данный случай, имхо
33 sash-ml
 
02.08.12
14:22
(31) все соблюдается, все условия накладываются на каждую строку выборки, тебе нужно ИЛИ на одиночное условие
34 Pro-tone
 
02.08.12
14:22
(31) для начала полностью сформулируй свое ТЗ
35 Lex_Liven
 
02.08.12
14:23
В каком плане "Запрос не работает"? Выдает ошибку? ничего не отбирает? отбирает не то?
пару примеров дай
36 Molinor
 
02.08.12
14:23
wiki:Алгебра_логики
Почитай, много нового узнаешь.
37 Интрудер
 
02.08.12
14:24
(30)Как я проверю условие
ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления)

если одна из дат пустая? В коде


   Если ЗначениеЗаполнено(ЗаказПокупателя.ДатаОтгрузки) И ЗначениеЗаполнено(ДатаПоступления)
      И (ЗаказПокупателя.ДатаОтгрузки < ДатаПоступления) Тогда
#Если Клиент Тогда
       Предупреждение("Отгрузку по заказу покупателя необходимо осуществить раньше даты поступления по данному документу!");
#Иначе
       ОбщегоНазначения.СообщитьОбОшибке("Отгрузку по заказу покупателя необходимо осуществить раньше даты поступления по данному документу!");
#КонецЕсли
       Возврат;
   КонецЕсли;


прекрасно работает.

(35) ничего не отбирает
38 palpetrovich
 
02.08.12
14:25
(28) "Это проверка на пустую дату" - проверка ПАРАМЕТРА передаваемого в запрос! Зачем?
39 Defender aka LINN
 
02.08.12
14:25
(5) А теперь убираем скобки... И нихрена не меняется.
40 Molinor
 
02.08.12
14:25
Дату начала с датой конца периода не перепутал?
41 Pro-tone
 
модератор
02.08.12
14:26
(0) если не сформулируешь ТЗ - закрою ветку
42 Lex_Liven
 
02.08.12
14:26
Как я проверю условие
ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления)

если одна из дат пустая?

Прекрасно проверишь, если пустой будет ДатаПоступления - это условие вернет тебе ложь и все.
С датой отгрузки - уже другой вопрос. Но необходимость проверки "ДатаПоступления.Пустая()" ставится под сомнение.
43 Интрудер
 
02.08.12
14:28
(41) Заполнить ЗаказПоставщика номенклатурой из множества ЗаказовПокупателя.
44 Lex_Liven
 
02.08.12
14:28
(37) ничего не отбирает - смотри (22)
45 Pro-tone
 
02.08.12
14:30
(43) конфа какая? - от этого зависит название регистра откуда хватать заказы
46 Pro-tone
 
02.08.12
14:32
по ходу ТС перебирает все документы :(
47 Интрудер
 
02.08.12
14:32
(45) УТ
48 Lex_Liven
 
02.08.12
14:32
(45) он из табличных частей документов набирает явно: "ЗаказПокупателяТовары..."
(44) Больше всего похоже, что ты знаки "Больше" и "меньше" перепутал.
49 Интрудер
 
02.08.12
14:35
(46) последнее условие МЕЖДУ. оно абсолютно. первое условие состоит из трех. Много хочу? В любом языке это будет работать. < или > не важно. Как условие И объединить.
50 Pro-tone
 
модератор
02.08.12
14:36
(48) ага  

(43)
вот тебе текст запроса для УТ

"ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЗаказыКлиентовОбороты.Номенклатура
ИЗ
   РегистрНакопления.ЗаказыКлиентов.Обороты(&ДатаНач, &ДатаКон, , ) КАК ЗаказыКлиентовОбороты

СГРУППИРОВАТЬ ПО
   ЗаказыКлиентовОбороты.Номенклатура";
51 Pro-tone
 
модератор
02.08.12
14:37
даже сгруппировать не надо

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЗаказыКлиентовОбороты.Номенклатура
ИЗ
   РегистрНакопления.ЗаказыКлиентов.Обороты(&ДатаНач, &ДатаКон, , ) КАК ЗаказыКлиентовОбороты
52 Classic
 
02.08.12
14:37
(49)
Напиши плиз словами, что ты хочешь от условий. Подозреваю, что тебе надо
И ВЫБОР КОГДА &ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
  ТОГДА ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления)
КОНЕЦ
53 ssh2006
 
02.08.12
14:38
(49) ЗаказПокупателяТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон и
Выбор когда ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1)
   И &ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)Тогда
   И ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления иначе истина конец
54 Lex_Liven
 
02.08.12
14:38
(49) Тебе же объясняют - Если между четырьмя условиями стоит И - скобки не нужны. не важно, как их объединять - если в ЛЮБОМ из них ответ ложь - то вся конструкция равна Ложь.
Проверь свое условие

И ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления

оно вернет истину, если отгрузка стоит РАНЬШЕ поступления. Поменяй там знак на Больше

И ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки > &ДатаПоступления

и проверь свой запрос.
55 Интрудер
 
02.08.12
14:42
(33) Признаться не понял
(51) Не пойдет, нужно учесть только заказы с установленной ДатаОтгрузки. Отгружают не всем.
(54) Кажется въехал, большое спасибо. Всем спасибо.
56 Интрудер
 
02.08.12
14:47
(54) Только не верно одно.
ЗаказПокупателяТовары.Ссылка.ДатаОтгрузки < &ДатаПоступления

нужно учесть только заказы которые запланировали отгрузить раньше предполагаемого поступления по заказу поставщику.
те что мы обязались отгрузить в будущем, не интересуют, для них и заказ в будущем создадут.
57 Bober
 
02.08.12
14:48
(55) в (54) говорит про
58 Bober
 
02.08.12
14:48
59 Интрудер
 
02.08.12
14:50
(58) Это я понял
60 Lex_Liven
 
02.08.12
14:52
(56) значит в (20) ты неверно озвучил задачу.
Попробуй для начала повыключать по одному условия, найти, какое именно всегда возвращает ложь и уже с ним работать. И еще бывает - проверь, что в твоем периоде ДатаНач-ДатаКон действительно выполняются все три условия выше. Может ты сам опять запутался, какие даты должны быть больше.
61 Pro-tone
 
модератор
02.08.12
14:52
(55) лови =)

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЗаказыКлиентовОбороты.Номенклатура
ИЗ
   РегистрНакопления.ЗаказыКлиентов.Обороты(НАЧАЛОПЕРИОДА(&ДатаНач, ДЕНЬ), КОНЕЦПЕРИОДА(&ДатаКон, ДЕНЬ), , ) КАК ЗаказыКлиентовОбороты
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
       ПО ЗаказыКлиентовОбороты.Номенклатура = ЗаказКлиентаТовары.Номенклатура
           И ЗаказыКлиентовОбороты.ЗаказКлиента = ЗаказКлиентаТовары.Ссылка.Ссылка
ГДЕ
   ЗаказКлиентаТовары.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1)

СГРУППИРОВАТЬ ПО
   ЗаказыКлиентовОбороты.Номенклатура
62 Интрудер
 
02.08.12
14:54
(61) Спасибо. =) только группировать кажется не надо.
63 Лефмихалыч
 
02.08.12
14:55
(0) А+В+С+Д - как скобки ни расставляй, будет одно и то же. У тебя то же самое в запросе.

Если любое из первых трех условие = ложь, то все условие ложно. Истинно оно будет только, если все 4 условия сразу истинны. Это справедливо вне зависимости от того, есть у тебя скобки или нет
64 Pro-tone
 
модератор
02.08.12
14:57
(62) да что ты говоришь? ты соединяешь 2 таблицы - свернутую уже - обороты с табличной частью дока. Одна позиция номенклатуры даст 2 строки как минимум, а если в табл части товары более 2х строк с одной номенклатурой, то больше будет
65 Lex_Liven
 
02.08.12
14:58
(63) Для "И" больше подходит пример с умножением
A*B*C*D. Оно так и называется "логическое умножение".
1*1*1*1 = 1
1*1*1*0 = 0

Сложение - это "ИЛИ"
1+1+1+1 >1 ~1
1+1+1+0 >1 ~1
0+0+0+0 = 0
66 Ненавижу 1С
 
гуру
02.08.12
14:59
(65) И(а,б) = а*б
ИЛИ(а,б) = а+б-а*б
67 ssh2006
 
02.08.12
15:00
(64) он заметил что в запросе уже есть РАЗЛИЧНЫЕ :)
68 Ненавижу 1С
 
гуру
02.08.12
15:01
(0) какое может быть тут ООП? боже, люди...
69 Pro-tone
 
02.08.12
15:07
(68) ну это же не он про ООП тему создавал ;)
70 Лефмихалыч
 
02.08.12
15:26
(65) как раз умножение вещественных чисел здесь неправильный пример, по скольку для этой операции скобки меняют результат
71 Лефмихалыч
 
02.08.12
15:27
(68) а прямые update/insert/delete?
вот я о том и говорил. А ты - "это тоже естественный отбо-о-о-ор", да "ни чо стра-а-а-ашного" :)
72 Lex_Liven
 
02.08.12
15:27
(70)
1*2*3*4 = 24
(1*2)*(3*4) = 24
(1*2*3)*4 = 24
Нет, не меняют.
73 Лефмихалыч
 
02.08.12
15:30
хотя да, разницы тоже не будет - сложение и умножение ассоциативны оба. Ну, это мои слова исходные только доказывает
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан