14.01.2014, 08:39 | #1 |
Участник
|
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 |
Участник
|
А вот так
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 |
Участник
|
|
|
14.01.2014, 11:16 | #4 |
Участник
|
Тогда так
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 |
Участник
|
|
|
14.01.2014, 11:44 | #6 |
Участник
|
Так можно
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 |
Дмитрий Ерин
|
В случае отрицания перечисление критериев через запятую как раз дает И. Проверьте прямо в гриде через быстрый фильтр (Ctrl-G): !A*, !B
__________________
|
|
14.01.2014, 11:47 | #8 |
Участник
|
|
|
14.01.2014, 11:48 | #9 |
Участник
|
|
|
14.01.2014, 12:09 | #10 |
Дмитрий Ерин
|
Удивительно Решил тоже проверить. Вот такой джоб дает И:
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 |
Участник
|
Так работает
Цитата:
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 |
Участник
|
Во внутреннем представление кодов полей. В первом случае query считает что поля разные, а условия на разные поля соединяются по 'И'.
Сравните X++: info("%1", fieldnum(table1,field1)); info("%1", fieldId2Ext(fieldnum(table1,field1), 1)); |
|
14.01.2014, 13:54 | #13 |
Участник
|
Цитата:
Сообщение от 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: (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 |
Участник
|
fieldId2Ext не должно быть нужно, должно отрабатывать как И
Возможно вы что-то забыли нам рассказать? Еще какие-то фильтры помимо этих? Версия АХ? |
|
14.01.2014, 16:24 | #15 |
Участник
|
А это уже по другой причине. Это не расширенный синтаксис, а обыкновенный. И через запятую в нём обычные условия добавляются по ИЛИ, но в случае добавления отрицания - по ИЛИ. Так всегда было
P.S.: См. также Отличия операторов ! и != в фильтрах |
|
15.01.2014, 15:50 | #16 |
Участник
|
На случай холивара выложу правило из булевой алгебры:
X++: !(a && b) = !a || !b !(a || b) = !a && !b
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: macklakov (1). |