![]() |
![]() |
![]() |
|
8.2 логическое условие в запросе | ☑ | ||
---|---|---|---|---|
0
Stado_adama
16.02.11
✎
12:52
|
есть строчка из запроса:
И (ВидПлатежа = &ВидПлатежа или &ВидЗаполнения = Истина)) КАК ПлатежиОстатки вопрос: почему когда я передаю в ВидЗаполнения значение Истина, запрос все еще обращает внимание на условие ВидПлатежа = &ВидПлатежа? |
|||
1
Живой Ископаемый
16.02.11
✎
12:53
|
потому что оно первое
|
|||
2
Живой Ископаемый
16.02.11
✎
12:53
|
попробуй переставить местами. По крайней мере в коде этого было бы достаточно, не знаю как в языке запросов.
|
|||
3
Ненавижу 1С
гуру
16.02.11
✎
12:53
|
(16) что значит обращает внимание?
|
|||
4
ДенисЧ
16.02.11
✎
12:54
|
Условие считается слева направо
|
|||
5
Ненавижу 1С
гуру
16.02.11
✎
12:54
|
(1) это как в языке запросов? он как бэ декларативный
|
|||
6
Ненавижу 1С
гуру
16.02.11
✎
12:54
|
(4) и ЧО?
|
|||
7
Живой Ископаемый
16.02.11
✎
12:56
|
2(5) э... и что?
Я имею в виду что при исполнении кода в8 не будет проверять все условие до конца, если на каком-то этапе уже гарантировано будет истина или ложь. а в языке запросов - может и будет - мне например неизвестно... Это все равно как в коде можно сравнить с NULL, а в языке запросв - нельзя |
|||
8
ДенисЧ
16.02.11
✎
12:57
|
(6) И всйо!
|
|||
9
Живой Ископаемый
16.02.11
✎
12:58
|
2(6) например в семерке вот такая конструкция приводила к ошибке:
Если Истина Или Объект.НесуществующийМетод() а в в8 - прокатит... |
|||
10
Axel2009
16.02.11
✎
12:58
|
(0) а что значит "все еще обращает внимание"?
|
|||
11
Ненавижу 1С
гуру
16.02.11
✎
12:59
|
(8)(9) хватит бухать на работе!
это пример из текста запроса! |
|||
12
Ненавижу 1С
гуру
16.02.11
✎
12:59
|
(10) вот и я в (3) спросил
|
|||
13
ДенисЧ
16.02.11
✎
12:59
|
(11) И? чО спросить-то хотел?
|
|||
14
Живой Ископаемый
16.02.11
✎
13:00
|
2(11) так и скажи - что в запросе булево выражение будет вычисленно до конца.
|
|||
15
Ненавижу 1С
гуру
16.02.11
✎
13:00
|
(13) да я собственно призвал, а не спросил
короче твое "Условие считается слева направо" вряд ли автору поможет |
|||
16
Живой Ископаемый
16.02.11
✎
13:00
|
и объяснил бы почему.
|
|||
17
Stado_adama
16.02.11
✎
13:00
|
(12) значит, что даже если ВидЗаполнения = Истина, запрос проверяет совпадение ВидПлатежа... а надо что бы не проверял...
|
|||
18
hugo
16.02.11
✎
13:01
|
(7) Это все равно как в коде можно сравнить с NULL, а в языке запросв - нельзя
ВЫБРАТЬ ВТ.ДоговорКонтрагента ИЗ ВТ КАК ВТ ГДЕ ВТ.Проект ЕСТЬ NULL работающий запрос, или ты не про это? |
|||
19
Ненавижу 1С
гуру
16.02.11
✎
13:01
|
(14) а ты интересно как это сможешь определить до конца или нет? в запросе (1С) методов нет, чтобы проверить это
|
|||
20
Живой Ископаемый
16.02.11
✎
13:02
|
2(19) я в 9 написал метод. Легко можно проверить
|
|||
21
Axel2009
16.02.11
✎
13:02
|
(17) пишите другой текст запроса.
|
|||
22
Ненавижу 1С
гуру
16.02.11
✎
13:02
|
(20) в языке запроса, ога
|
|||
23
Живой Ископаемый
16.02.11
✎
13:04
|
2(22) капец, чувак... ты фонтазию свою скурил что ли?
Если Истина ИЛИ ССылка.НесуществующийРекизит |
|||
24
Ненавижу 1С
гуру
16.02.11
✎
13:04
|
Напиши строку полностью что ли, ну и может стоит скобки поставить:
( .... И ((ВидПлатежа = &ВидПлатежа) или &ВидЗаполнения)) КАК ПлатежиОстатки |
|||
25
Ненавижу 1С
гуру
16.02.11
✎
13:05
|
(23) ну и как ты, чувачок, проверишь проверяет он второе условие или нет?
кстати в (0) вообще кусок не рабочий, имхо |
|||
26
Ненавижу 1С
гуру
16.02.11
✎
13:06
|
(23) хотя для составных типов, этож буде NULL (гыгыгыгы)
тогда обязан проверить |
|||
27
Живой Ископаемый
16.02.11
✎
13:07
|
я проверил.
вот такой запрос: ВЫБРАТЬ Банки.Ссылка ИЗ Справочник.Банки КАК Банки ГДЕ ИСТИНА Или &Параметр выдаст результат при значении Параметр равное лжи, значит в запросе тоже логическое выражение вычисляется не до конца |
|||
28
Stado_adama
16.02.11
✎
13:07
|
(25) Код не рабочий, но и критических ощибок он не выдает...
кстати я вот тут недельку назад писал условие вот так вот: И (ЦветомодельКоллекционныеАтрибуты.Поставщик.ПоставщикКоммерческий = &Поставщик ИЛИ &ПоставщикЗаполнен = 0) и оно нормально отрабатывало... |
|||
29
Живой Ископаемый
16.02.11
✎
13:07
|
еще вопросы? :)
|
|||
30
Axel2009
16.02.11
✎
13:08
|
(28) что значит нормально?
|
|||
31
Живой Ископаемый
16.02.11
✎
13:08
|
нет, фигня
|
|||
32
Живой Ископаемый
16.02.11
✎
13:08
|
ничего не доказывает
|
|||
33
Axel2009
16.02.11
✎
13:08
|
(27) с чего бы вдруг не до конца? =)
|
|||
34
Ненавижу 1С
гуру
16.02.11
✎
13:08
|
(27) вывод не верный потому что "Истина или Ложь" дает "Истина"
|
|||
35
Ненавижу 1С
гуру
16.02.11
✎
13:09
|
(32) передай туда NULL
|
|||
36
Живой Ископаемый
16.02.11
✎
13:09
|
Да, в запросе вычисляет скорее всего до конца.. Потому что вот такой запрос:
ВЫБРАТЬ Банки.Ссылка ИЗ Справочник.Банки КАК Банки ГДЕ ИСТИНА Или &Параметр Где Параметр я устанавливаю Дате - выдает ошибку Текст запроса: Строка 6: {(6,8)}: Неверные параметры "ИЛИ" ИЛИ <<?>>&Параметр) |
|||
37
Живой Ископаемый
16.02.11
✎
13:11
|
Тоже самое:
ВЫБРАТЬ Банки.Ссылка ИЗ Справочник.Банки КАК Банки ГДЕ ИСТИНА Или Банки.НесуществующееПоле Текст запроса: Строка 6: {(6,19)}: Поле не найдено "Банки.НесуществующееПоле" ИСТИНА Или Банки.<<?>>НесуществующееПоле ==== (0)Чувак, переписывай запрос |
|||
38
fisher
16.02.11
✎
13:11
|
(36) Не факт. Параметры могут заранее проверяться.
Короче, фиг проверишь. Вообще, подозреваю что метод вычисления логических выражений может быть вообще опциональным на серваке SQL |
|||
39
acsent
16.02.11
✎
13:12
|
И эти люди ратуют за советское образование
|
|||
40
fisher
16.02.11
✎
13:12
|
(37) Это тоже ничего не доказывает.
|
|||
41
hhhh
16.02.11
✎
13:13
|
если телепатировать, наверняка у него ВидПлатежа NULL.
|
|||
42
Axel2009
16.02.11
✎
13:13
|
(38) скулю пойдет весь запрос, 1ска вырезать ничего не будет..
|
|||
43
Живой Ископаемый
16.02.11
✎
13:14
|
||||
44
fisher
16.02.11
✎
13:14
|
(42) Кэп? Речь о том, как скуль будет считать.
|
|||
45
Живой Ископаемый
16.02.11
✎
13:14
|
2(42) если пропустит его предварительно
|
|||
46
Axel2009
16.02.11
✎
13:14
|
(43) сравнил теплое и мягкое =)
|
|||
47
Живой Ископаемый
16.02.11
✎
13:15
|
2(40) в свете (43) имеем явное различие между тем что делается в коде и в запросе.
|
|||
48
Живой Ископаемый
16.02.11
✎
13:16
|
2(46) Ну, в этом и был пойнт.
|
|||
49
Ненавижу 1С
гуру
16.02.11
✎
13:16
|
(43) хаха, если 1С ЭТО вычисляет, то она шляпа
|
|||
50
Живой Ископаемый
16.02.11
✎
13:17
|
2(49) Это рекламировалось как огромный шаг в перед по сравнению с 77 еще как только 8.0 вышла.
|
|||
51
fisher
16.02.11
✎
13:18
|
(47) Разве что. Не слишком ценная информация, поскольку и так ясно что запрос выполняет сиквел, а код 1С - сама 1С.
|
|||
52
Живой Ископаемый
16.02.11
✎
13:18
|
и по сути в (0) об этом и вопрос. Теперь мы знаем что для запросов это не работает.
|
|||
53
fisher
16.02.11
✎
13:19
|
(50) А это разве не так? Избавляет от вложенных условий не в ущерб быстродействию.
|
|||
54
Живой Ископаемый
16.02.11
✎
13:20
|
2(51) Все верно, но прежде чем СКЛ получит свой текст запроса, 1С должна будет транслировать Банки.НесуществующееПоле в СКЛ-представление. Сделать этого не может. И поэтому понятно, почему она в случае языка запросов вычисляет логчиские выражения до конца, а не как в коде - чтобы СКЛ не сошел с ума.
|
|||
55
Axel2009
16.02.11
✎
13:21
|
(44) судя по планам - если первое условие истина - то второе игнорирует.
|
|||
56
Ненавижу 1С
гуру
16.02.11
✎
13:21
|
(50) это имеет право на жизнь, только по причине нетипизированности 1С
вообще весь плюс тут когда используются именно методы или обращения по ссылкам к базе: Если МетодА() или МетодБ() Тогда |
|||
57
Живой Ископаемый
16.02.11
✎
13:21
|
2(53) этот вопрос я переадресую (49), потому что мне по правде все равно. :) Главное чтобы я это знал и мог использовать.
|
|||
58
fisher
16.02.11
✎
13:21
|
(52) Но мне до сих пор непонятно, будет ли в сиквеле использовано полное вычисление логических выражений или сокращенное.
|
|||
59
Ненавижу 1С
гуру
16.02.11
✎
13:22
|
(55) судя по планам также можно сделать вывод, что оптимизатор увидев заранее истинное условие: "Истина или А" просто выплюнул это условие вообще
|
|||
60
Живой Ископаемый
16.02.11
✎
13:23
|
(58) думаю это можно почитать в доке к окнкретной СУБД. :)
|
|||
61
Axel2009
16.02.11
✎
13:23
|
(53)+ если задана константа в первом условии. если зависит от поля таблицы - то вычисляться будут оба каждый раз..
|
|||
62
fisher
16.02.11
✎
13:25
|
(54) Да ничего она (1С) не вычисляет. Не путай синтаксическую проверку запроса с его выполнением. Вычисляет она в файловой версии.
|
|||
63
fisher
16.02.11
✎
13:28
|
(60) Скорее всего. И скорее всего это опционально. Помню, в настройках компиляторов тоже можно было выбирать, какой метод вычисления логических выражений использовать.
|
|||
64
fisher
16.02.11
✎
13:30
|
Хотя мне навскидку сложно предположить, какая польза может быть от полного вычисления логических выражений. Разве что на этапе отладки можно больше глюков выгрести.
|
|||
65
Живой Ископаемый
16.02.11
✎
13:31
|
Зависит от оператора сравнения:
http://screencast.com/t/eLMAcbAW3 |
|||
66
Ненавижу 1С
гуру
16.02.11
✎
13:31
|
(64) ну если оба условия не только вычисляют что-то, но и изменяют состояние
хотя имхо плохой код это |
|||
67
Axel2009
16.02.11
✎
13:33
|
(65) потому что сначала выполняется ИЛИ, а потом И
|
|||
68
Ненавижу 1С
гуру
16.02.11
✎
13:34
|
(64) еще 1С такой скрин и еще больше буду ненавидеть 1С, за
А = Истина или Перечисления.СтавкиНДС.НДС18; Сообщить(А); //выдает Истина )) |
|||
69
Живой Ископаемый
16.02.11
✎
13:35
|
||||
70
Axel2009
16.02.11
✎
13:37
|
(69) ответ в (67)
|
|||
71
Живой Ископаемый
16.02.11
✎
13:38
|
2(70)я ничего не спрашиваю. :) попробуй просветить кого-то другого. :)
|
|||
72
Живой Ископаемый
16.02.11
✎
13:45
|
2(62) да, наверное ты прав... Тут до вычислений вообще не доходит.
|
|||
73
fisher
16.02.11
✎
14:37
|
(68) Считает абсолютно правильно. Просто в идеале при синтаксической проверке модуля должно ругаться.
|
|||
74
5 Элемент
16.02.11
✎
15:41
|
(49) а что собственно не так?
|
|||
75
Ненавижу 1С
гуру
16.02.11
✎
15:43
|
(74) NULL<>НЕОПРЕДЕЛЕНО
|
|||
76
5 Элемент
16.02.11
✎
15:48
|
(75) а она говорит что NULL=НЕОПРЕДЕЛЕНО ?
|
|||
77
Ненавижу 1С
гуру
16.02.11
✎
16:01
|
(76) я говорю, а 1С меня не понимает, НЕНАВИЖУ!
|
|||
78
Живой Ископаемый
16.02.11
✎
16:03
|
2(77) :)
http://screencast.com/t/FfuJ835q3MV4 |
|||
79
Ненавижу 1С
гуру
16.02.11
✎
16:07
|
(78) сукин сын!!!
|
|||
80
Axel2009
16.02.11
✎
16:09
|
(78) вообще NULL <> NULL если что =) так что шляпа!
|
|||
81
fisher
16.02.11
✎
16:12
|
Это стёб, или кому-то до сих пор что-то с NULL непонятно?
|
|||
82
Axel2009
16.02.11
✎
16:14
|
(81) NULL = NULL - Ложь по определению =) а в 1с - Истина =)
|
|||
83
Живой Ископаемый
16.02.11
✎
16:16
|
2(82) В запросах - Ложь, в коде - истина...
|
|||
84
Axel2009
16.02.11
✎
16:18
|
(83) и как можно сравнить ничто с ничтом? =)
|
|||
85
Живой Ископаемый
16.02.11
✎
16:18
|
||||
86
fisher
16.02.11
✎
16:18
|
(82) А... Есть такой ньюанс :)
Но он логичен и объясним. В языке запросов - всё канонично. Для логических операций с NULL есть специальный оператор. Но во внутреннем языке выборку тоже нужно как-то анализировать? Решили не заморачиваться с новыми операторами и заставить работать стандартные :) Ибо в этот момент финты ушами с NULL в SQL уже теряют смысл. Вполне логичный ход. |
|||
87
Живой Ископаемый
16.02.11
✎
16:18
|
2(84) без понятия, меня это не касается...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |