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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.01.2014, 08:39   #1  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Not Like в Query
Доброго времени суток.
Как написать в query условие Not like?

В простом условии по полю можно и так написать:
qrbd.addRange(fieldnum(table1,field1)).value("!"+"A*");

Но мне нужно еще по этому же полю добавить условие, поэтому нужно понять как написать запрос.

qrbd.addRange(fieldnum(table1,field1)).value(strFmt('((!(%1 LIKE "%2")))',
fieldStr(table1, field1),
'A*'));

И различные варианты с Not или ! данного выражение не дают результатов.
Без отрицания работает правильно.
Старый 14.01.2014, 10:37   #2  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
А вот так
X++:
 qrbd.addRange(fieldnum(table1,field1)).value(strFmt("%1,%2", SysQuery::valueNot("1*"),SysQuery::valueNot("2*")));

Последний раз редактировалось maldini; 14.01.2014 в 11:02.
Старый 14.01.2014, 11:10   #3  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от maldini Посмотреть сообщение
А вот так
X++:
 qrbd.addRange(fieldnum(table1,field1)).value(strFmt("%1,%2", SysQuery::valueNot("1*"),SysQuery::valueNot("2*")));
В данном случае получится ИЛИ, а мне надо И
Старый 14.01.2014, 11:16   #4  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от IvanS Посмотреть сообщение
В данном случае получится ИЛИ, а мне надо И
Тогда так
X++:
 qbds.addRange(fieldnum(table1,field1)).value(strfmt("!1*"));
 qbds.addRange(fieldnum(table1,field1)).value(strfmt("!2*"));
Или вот такими способами
http://www.axaptapedia.com/Expressions_in_query_ranges

Последний раз редактировалось maldini; 14.01.2014 в 11:26.
Старый 14.01.2014, 11:28   #5  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от maldini Посмотреть сообщение
Тогда так
X++:
 qbds.addRange(fieldnum(table1,field1)).value(strfmt("!\"1*\""));
 qbds.addRange(fieldnum(table1,field1)).value(strfmt("!\"2*\""));
Таким способом тоже ИЛИ получается

Цитата:
Сообщение от maldini Посмотреть сообщение
Тогда так
Или вот такими способами
http://www.axaptapedia.com/Expressions_in_query_ranges
Был я там много раз, полезная ссылка, но чтобы получить запрос типа
!(field1 like 'A*') && (field1 != 'B')
не нашел ответа
Старый 14.01.2014, 11:44   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Так можно

X++:
qbds.addRange(fieldnum(table1,field1)).value(strfmt("!A*"));
qbds.addRange(fieldId2Ext(fieldnum(table1,field1), 1)).value(strfmt("!B*"));
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Maxim Gorbunov (1), Stitch_MS (1), IvanS (1), alex55 (1).
Старый 14.01.2014, 11:47   #7  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от IvanS Посмотреть сообщение
В данном случае получится ИЛИ, а мне надо И
В случае отрицания перечисление критериев через запятую как раз дает И. Проверьте прямо в гриде через быстрый фильтр (Ctrl-G): !A*, !B
__________________
Старый 14.01.2014, 11:47   #8  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от AndyD Посмотреть сообщение
Так можно

X++:
qbds.addRange(fieldnum(table1,field1)).value(strfmt("!A*"));
qbds.addRange(fieldId2Ext(fieldnum(table1,field1), 1)).value(strfmt("!B*"));
Спасибо Помогло
Старый 14.01.2014, 11:48   #9  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Ruff Посмотреть сообщение
В случае отрицания перечисление критериев через запятую как раз дает И. Проверьте прямо в гриде через быстрый фильтр (Ctrl-G): !A*, !B
А вот в квери дает или Специально проверил
Старый 14.01.2014, 12:09   #10  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Удивительно Решил тоже проверить. Вот такой джоб дает И:
X++:
 Query                   q;
    QueryRun                qr;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;
    MyTable                 tab;
    ;
    q       = new Query();
    qbds    = q.addDataSource(tableNum(MyTable));
    qbr     = qbds.addRange(fieldNum(MyTable, MyField));
    qbr.value("!a*, !b");
    
    qr = new QueryRun(q);
    while (qr.next())
    {
        tab = qr.getNo(1);
        info(strFmt("%1", tab.MyField));
    }
То ли чего-то вы не договариваете, то ли я всё не правильно понял)
__________________
Старый 14.01.2014, 12:35   #11  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Так работает
Цитата:
Сообщение от AndyD Посмотреть сообщение
Так можно


X++:
qbds.addRange(fieldnum(table1,field1)).value(strfmt("!A*"));
qbds.addRange(fieldId2Ext(fieldnum(table1,field1), 1)).value(strfmt("!B*"));
А так не работает?
X++:
 qbds.addRange(fieldnum(table1,field1)).value(strfmt("!1*"));
qbds.addRange(fieldnum(table1,field1)).value(strfmt("!2*"));
Странно, а в чем отличия этих условий?

Последний раз редактировалось maldini; 14.01.2014 в 12:37.
Старый 14.01.2014, 13:22   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от maldini Посмотреть сообщение
Странно, а в чем отличия этих условий?
Во внутреннем представление кодов полей. В первом случае query считает что поля разные, а условия на разные поля соединяются по 'И'.
Сравните
X++:
info("%1", fieldnum(table1,field1));
info("%1", fieldId2Ext(fieldnum(table1,field1), 1));
Заметьте, такой финт ушами позволит соединить два условия но не больше.
Старый 14.01.2014, 13:54   #13  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Во внутреннем представление кодов полей. В первом случае query считает что поля разные, а условия на разные поля соединяются по 'И'.
Сравните
X++:
info("%1", fieldnum(table1,field1));
info("%1", fieldId2Ext(fieldnum(table1,field1), 1));
Заметьте, такой финт ушами позволит соединить два условия но не больше.
Так вот такое условие тоже дает И
X++:
addRange(fieldnum(table1,field1)).value(strfmt("!1*,!2*"));
Вот пример
X++:
    queryBuildDataSource = query.addDataSource(tablenum(InventTable));
    queryBuildDataSource.addSelectionField(fieldnum(InventTable, ItemId));
    queryBuildDataSource.addRange(fieldnum(InventTable, ItemId)).value(strfmt("!1*,!2*"));
А вот запрос отправляемый на SQL
Код:
Оператор SQL: (InventTable) SELECT A.ITEMID,A.RECID FROM INVENTTABLE A WHERE ((DATAAREAID=?) AND ( NOT ((ITEMID LIKE ? ESCAPE '\' )) AND NOT ((ITEMID LIKE ? ESCAPE '\' )))) ORDER BY A.DATAAREAID,A.ITEMID

Последний раз редактировалось maldini; 14.01.2014 в 13:57.
Старый 14.01.2014, 15:15   #14  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
fieldId2Ext не должно быть нужно, должно отрабатывать как И
Возможно вы что-то забыли нам рассказать? Еще какие-то фильтры помимо этих? Версия АХ?
Старый 14.01.2014, 16:24   #15  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от maldini Посмотреть сообщение
Так вот такое условие тоже дает И
А это уже по другой причине. Это не расширенный синтаксис, а обыкновенный. И через запятую в нём обычные условия добавляются по ИЛИ, но в случае добавления отрицания - по ИЛИ. Так всегда было

P.S.: См. также Отличия операторов ! и != в фильтрах
Старый 15.01.2014, 15:50   #16  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
На случай холивара выложу правило из булевой алгебры:
X++:
!(a && b) = !a || !b
!(a || b) = !a && !b
__________________
// no comments
За это сообщение автора поблагодарили: macklakov (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axperf: Improving SSRS Query-based Report Performance by not Using Display Methods - Part 3 Blog bot DAX Blogs 0 23.07.2013 21:12
ax-erp: ‘Not Like’ in Dynamics AX Blog bot DAX Blogs 0 13.09.2012 21:11
'Not between' используя Query клас vitaly85 DAX: Программирование 5 18.10.2010 08:40
like запрос с использованием query Vadik Shiryakoff DAX: Программирование 7 13.03.2006 12:05

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

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

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