AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.04.2010, 12:40   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Отличия операторов ! и != в фильтрах
Про существование оператора != я знал и раньше. Но честно говоря думал, что это всёго лишь альтернативная форма записи всем известного !. Но сегодня обнаружил одно существенное отличие между этими формами записи. Оказывается при использовании одновременно нескольких критериев (запись через запятую), != присоединяется к условию через ИЛИ, а не через И, как при использовании !. Возможно для кого-то это не новость, но по крайней мере в фундаментальном http://axapta.mazzy.ru/lib/search/ я нашёл только вот это:
Цитата:
(запятая) это символ, позволяющий объединить несколько критериев. Причем, если после запятой идет ! (восклицательный знак - отрицание), то запятая интерепретируется как логическое "И" (по смыслу получается "кроме"), а если нет отрицания - то как логическое "ИЛИ".

P.S.: Прошу прощения, если открыл америку
За это сообщение автора поблагодарили: donMigel (1), Logger (4), lev (4), konopello (1), AraraT® (1), Gustav (5), Atar (1), alex55 (1), hated8 (1), nix0root (1).
Старый 14.04.2010, 12:55   #2  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Забавно... Спасибо возмёмс на вооружение...
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 14.04.2010, 15:08   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Имеется предостережение с вариацией на тему той же цитаты:
Критерии запроса: ловушка перечисления через запятую

P.S. Ну, и имеем ВАЖНОЕ дополнение к моему примеру:
Цитата:
Сообщение от Gustav Посмотреть сообщение
...для таблицы, содержащей числовое поле (ЧП) и 100 строк со значением этого ЧП от 1 до 100, я написал такой критерий:
PHP код:
!15,!19,11..20 
и ожидал получить в выборке 8 чисел от 11 до 20 без 15 и 19. Каково же было мое удивление, когда в выборке явились все 100 строк таблицы!

Желаемого результата удалось достичь после перестановки компонентов критерия:
PHP код:
11..20,!15,!19 
Так вот, в случае использования != вместо просто ! получаем одинаковый результат - все 100 строк таблицы для любого варианта: и в случае отрицаний, расположенных спереди:
PHP код:
!=15,!=19,11..20 
, и в случае отрицаний сзади:
PHP код:
11..20,!=15,!=19 
Таким образом, открытие S.Kuskov'а про поголовное ИЛИ наглядно подтверждается.

Последний раз редактировалось Gustav; 14.04.2010 в 16:58.
За это сообщение автора поблагодарили: Logger (3), konopello (1), Atar (1), S.Kuskov (2), Cathome (1).
Старый 14.04.2010, 17:59   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
До кучи. Все мы знаем, что фильтр не понимает операторы >= и <=. Вместо них нужно использовать опреатор .. (две точки) для задания диапазона (возможно открытого). Но помимо этого, оказывается, эти операторы можно заменить на !< и !>. Запятая перед этими операторами также как и перед != будет интерпретироваться как ИЛИ

Последний раз редактировалось S.Kuskov; 14.04.2010 в 18:34.
Старый 15.04.2010, 04:09   #5  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Все мы знаем, что фильтр не понимает операторы >= и <=.
Как так не понимает? Очень даже замечательно понимает!
X++:
>=15
вернет 15,16,...

а вот с отрицанием:
X++:
!16,>=15  !=16,>=15
вернут ожидаемые числа начиная от 15, без 16 - оба И, что странно

если переставить в конец:
X++:
>=15,!16  >=15,!=16
вернут все числа - в обоих случаях ИЛИ, хотя в первом должно быть И

X++:
!>15,17  17,!>15
вернут все <= 15 и 17 - в обоих случаях ИЛИ

Ax 4.0 sp2
Старый 15.04.2010, 08:41   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от vanokh Посмотреть сообщение
Как так не понимает? Очень даже замечательно понимает!
Ax 4.0 sp2
Вы проверяли, или это ваши догадки? Кто-то ещё может подтвердить?
Старый 15.04.2010, 09:46   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Кто-то ещё может подтвердить?
На всякий случай проверил в 3.0 SP5, 4.0 SP2, 2009 SP1 - не работает фильтр вида ">=".
__________________
С уважением,
Олег.
Старый 15.04.2010, 11:01   #8  
donMigel is offline
donMigel
Участник
Аватар для donMigel
 
133 / 33 (2) +++
Регистрация: 31.08.2004
Адрес: Мытищи
Цитата:
Сообщение от oip Посмотреть сообщение
На всякий случай проверил в 3.0 SP5, 4.0 SP2, 2009 SP1 - не работает фильтр вида ">=".
Подтверждаю про 3.0...
__________________
_____________________________________________--
Axapta 3.0 SP4 KR1 Build #10 for EE
Ищу работу!
Старый 16.04.2010, 02:56   #9  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вы проверяли, или это ваши догадки? Кто-то ещё может подтвердить?
Ничего не понимаю... Вчера создавал специально табличку, в ней столбец числовой - все работало. А теперь еще раз проверяю, не работает
Старый 16.04.2010, 12:19   #10  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Может я не в тему, ну раз уж заговорили о фильтрах, то может кто подскажет как:?

Например делая в РЛС фильтр вида:
X++:
(InventLocationFrom='Склад1')||(InventLocationFrom='Склад2')||(InventLocationTo='Склад1')
Как сделать так, чтобы InventLocationFrom не жестко прописывать, а например задать 'Склад*'
?
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 16.04.2010, 12:46   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от hated8 Посмотреть сообщение
Может я не в тему, ну раз уж заговорили о фильтрах, то может кто подскажет как:?

Например делая в РЛС фильтр вида:
X++:
(InventLocationFrom='Склад1')||(InventLocationFrom='Склад2')||(InventLocationTo='Склад1')
Как сделать так, чтобы InventLocationFrom не жестко прописывать, а например задать 'Склад*'
?
не очень понял вопрос...
просто в запросе на таблицу, для нужного поля напишите критерий "Склад*".
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 16.04.2010, 13:06   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
просто в запросе на таблицу, для нужного поля напишите критерий "Склад*".
К сожелению при использовании расширенного синтаксиса так сделать не получится

http://www.axaptapedia.com/index.php...ultiple_tables
Цитата:
Limitations
There are two major limitations to the Query Expressions syntax. The first is the loss of support for wildcards and comma-separated range values, and the second is the inability to reference array fields such as dimensions...
За это сообщение автора поблагодарили: hated8 (1).
Старый 16.04.2010, 13:13   #13  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Very very very плохо((
Как быть если необходимо перечислить кучу складов, например штук 20...? Ведь длина поля всего 1К символов...
__________________
Что сломалось не знаем, но уже немного подчинили...
Старый 16.04.2010, 13:17   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
К сожелению при использовании расширенного синтаксиса так сделать не получится
хм.. не знал...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 16.04.2010, 13:59   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
К сожелению при использовании расширенного синтаксиса так сделать не получится
А как же like?
X++:
(InventLocationFrom like 'Склад*')||(InventLocationTo=='Склад1')
__________________
Axapta v.3.0 sp5 kr2
Старый 16.04.2010, 14:05   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AndyD Посмотреть сообщение
А как же like?
В while select - пожалуйста, но не в Query Expressions syntax!
Старый 16.04.2010, 14:05   #17  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
362 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от AndyD Посмотреть сообщение
А как же like?
X++:
(InventLocationFrom like 'Склад*')||(InventLocationTo=='Склад1')

Если не ошибаюсь, поддержка like появилась в версии AX2009
__________________
Sergey Nefedov
Старый 16.04.2010, 14:11   #18  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Версия, в которой работаю - в моей подписи.

Что такое расширенный фильтр, вроде, понимаю

PS
Вот что на сервер улетает с таки запросом
X++:
((INVENTLOCATIONID LIKE ? ESCAPE '\' ) OR (TOINVENTLOCATIONID=?))
PPS
Проверил на чистой 3.0 SP3 без KR-ов. В ней, действительно, нельзя указать like - ругается на круглую скобку
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 16.04.2010 в 14:25.
Старый 16.04.2010, 15:08   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
У вас случаем не Oracle. "Загадочное исцеление" уже встречалось на форуме.Запрос по таблице параметров.

Цитата:
Сообщение от SRF Посмотреть сообщение
Если не ошибаюсь, поддержка like появилась в версии AX2009
Похоже, что не ошибаетесь. В том же документе http://www.axaptapedia.com/index.php...ultiple_tables только чуть выше
Цитата:
Using wildcards and comma-separated range values

Again, the previous example here was using standard syntax, not the special syntax using expressions. It's not possible to modify the above examples to work with wildcards.
The above statement applies to AX versions < 5.0
AX 5.0 introduced solution to wildcards - while you still cannot directly use wildcards in ranges, now it supports the 'LIKE' keyword.
(AccountNum LIKE "*AA*" || Name LIKE "*AA*")
Старый 16.04.2010, 15:09   #20  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Нда... забавно...
Ведь в литературе по sql пишут:
Цитата:
Escape-символ не может быть символом "\" (обратная косая черта) и, вообще говоря, должен представлять собой символ, никогда не появляющийся в упоминаемом столбце как информационный символ
перепроверил, действительно нереально!
четвёрка посылает:
((A.INVENTLOCATIONIDFROM=N'Склад%') OR (A.INVENTLOCATIONIDTO=N'Склад%')))
так что впролёте(
__________________
Что сломалось не знаем, но уже немного подчинили...

Последний раз редактировалось hated8; 16.04.2010 в 15:18.
Теги
поиск, условия поиска, фильтр

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
отличия Х++ от С++ afon DAX: Прочие вопросы 35 23.05.2011 08:33
Вопрос по Журналу трассировки операторов SQL propeller DAX: Программирование 7 23.10.2008 19:36
Какие принципиальные отличия, кроме пособий по больничному, в Расчете с персоналом 4.0 по сравнению с 3.0? Игнатьева Ирина DAX: Функционал 2 28.03.2008 10:09
Отличия в строках ReqPO, почему одна строка появляется в форме а другая нет (Master Planning, Planned Orders) rkorchagin DAX: Программирование 8 21.02.2007 16:27
В журнале трассировки операторов sql нету времени выполнения.. MironovI DAX: Программирование 3 31.08.2005 16:13
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:16.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.