17.10.2010, 21:31 | #1 |
Участник
|
'Not between' используя Query клас
Есть альтернатива для 'Not between' в Dynamics AX используя Query клас?
На пример, в SQL eтo тaк: X++: select AccountNum from CustTable where AccountNum NOT BETWEEN '1000' and '2000'; В Dynamics AX, используя where ето будет так X++: CustTable custTable; ; while select custTable where ! (custTable.AccountNum >= "1000" && custTable.AccountNum <= "2000") { ..... } Ho, eсли использовать Query клас: X++: Query query = new Query(); QueryBuildDataSource qbds; QueryBuildRange qbrAccountNum; QueryRun queryRun; ; qbds = query.addDataSource(tablenum(CustTable)); qbrAccountNum = qbds.addRange(fieldNum(CustTable, AccountNum)); // примерно SysQuery::valueNot() метод qbr.value(SysQuery::valueNot(SysQuery::range("1000", "2000"))); queryRun = new QueryRun(query); while(queryRun.next()) { .... HE } |
|
17.10.2010, 22:41 | #2 |
Участник
|
Сделайте так
X++: qbr.value(strfmt("!%1", SysQuery::range("1000", "2000")));
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: vitaly85 (1). |
17.10.2010, 22:44 | #3 |
Участник
|
Тестить такое можно и простым запросом в фильтре на форме, то есть код или запрос работают одинаково.
Поддерживает ли язык запросов Не с диапазоном? !"1000..2000" Не факт. А вот !1000..2000 может. Но вот конкретно этот пример сводится к ИЛИ: ..1000,2000.. Или с <> пробовать То есть можно. На крайняк, в квери есть недокументированая фича писать вообще кусок селекта с && и || со скобками, так что все можно, и даже более сложные вещи. Я тут намедни как раз джойнил проводки в корреспонденции сами на себя по != все отработало. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
17.10.2010, 23:47 | #4 |
Участник
|
Cпасибо за быстрый ответ!
|
|
18.10.2010, 08:10 | #5 |
Участник
|
Не, неправильно.
Здесь границы (значения 1000 и 2000) включены в выборку, а по условию задачи они должны быть исключены
__________________
Axapta v.3.0 sp5 kr2 |
|
18.10.2010, 08:40 | #6 |
Участник
|
Цитата:
X++: public static str NotBetween(anytype _from, anytype _to) { str range; boolean hasFrom = _from || (typeof(_from) != Types::String && typeof(_from) != Types::Date); boolean hasTo = _to || (typeof(_to) != Types::String && typeof(_to) != Types::Date); if (hasFrom || hasTo) { if (hasFrom) { range = strfmt('<%1', queryValue(_from)); } if (hasFrom && hasTo) { range += ','; } if (hasTo) { range += strfmt('>%1', queryValue(_to)); } } else { range = SysQuery::valueNot(SysQuery::valueUnlimited()); } return range; } |
|
|
|