23.06.2009, 13:28 | #1 |
Banned
|
SysQuery::range(): ловушка в AX2009 EE
Осторожно: русские умельцы решили улучшить метод SysQuery::range().
Если раньше было SysQuery::range(3, 0) = "3.." то после "улучшения" стало SysQuery::range(3, 0) = "3..0" |
|
|
За это сообщение автора поблагодарили: konopello (3), madm (1), in.dc (1). |
23.06.2009, 14:01 | #2 |
Участник
|
Цитата:
Цитата:
SysQuery::range(3, 0) = "3..0"
__________________
Dynamics AX 4.0 SP2 |
|
23.06.2009, 14:05 | #3 |
Banned
|
Точно, значит еще раньше изменили. Я свою функцию на "голой" AX2009 запрограммировал, отсюда и неожиданный результат.
|
|
23.06.2009, 14:12 | #4 |
Moderator
|
А когда так было?
X++: SysQuery::range(3, 0) = "3.." У меня на 3.0 SP3CU1 выдает также "3..0".
__________________
Андрей. |
|
23.06.2009, 14:23 | #5 |
Banned
|
Какой из вариантов более "правильный" - вопрос вкуса. Факт тот, что в восточноевропейской версии нельзя задать в случае целочисленного или вещественного поля полуоткрытый интервал типа "от X до бесконечности" или "от бесконечности до X" с помощью метода SysQuery::range(). Случай, очевидно, редкий и всплывает только при обновлении стандартных приложений на версии EE.
Так что беру слова назад: ловушка расставлена только для иностранцев, читателям данного форума не особенно интересна. Последний раз редактировалось EVGL; 23.06.2009 в 14:25. |
|
23.06.2009, 14:48 | #6 |
Участник
|
Если посмотреть код в AX4.0, то открытый период формируется только для строк и дат. В общем-то, логично. Ведь если, например, указана пустая дата, то, очевидно, что в эту сторону интервал должен быть открыт. То же самое справедливо и для пустой строки.
А для чисел такой вывод сделать нельзя из-за существования отрицательных значений. Если выражение SysQuery::range(-3, 0) будет интерпретировано как "-3..", то это явная ошибка. Кроме того, для чисел, в отличие от строк, достаточно просто указать максимальное или минимальное значение заведомо больше (меньше) любого возможного значения. |
|
23.06.2009, 14:58 | #7 |
Участник
|
|
|
23.06.2009, 15:25 | #8 |
Banned
|
Я бы в таких случаях не компостировал мозг серверу БД максимальным значением, а писал бы просто queryValue(3) + "..". Хотелось просто избежать текстовой константы, но увы...
|
|
23.06.2009, 15:49 | #9 |
Участник
|
Можно просто делать SysQuery::Range(3, "")
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: EVGL (1), Logger (4). |
23.06.2009, 16:54 | #10 |
Microsoft Dynamics
|
Этому методу в 4-ке было придано поведение аналогичное методу из трешки.
Основная проблема в том, что в SYS методе нельзя задать диапазон "0..0" для выборки нулевых значений. Это было критично для множества наших отчетов, запросов. Особенно это стреляет для элементов енумов, с нулевым значением. Найденные буржуйские отчеты/запросы, которые использовали фильтр "0..0" как признак того, что необходимо выводить все записи, были соотвественно поправлены. Так что, это был вопрос баланса. Либо необходимо было анализировать и править все наши вызовы к этому методу, либо все буржуйские. Буржуйских оказалось значительно меньше, чем наших. |
|
|
За это сообщение автора поблагодарили: mazzy (2), EVGL (1), madm (1). |
29.06.2009, 14:02 | #11 |
Участник
|
X++: public static str range(anytype _from, anytype _to) { return queryValue(_from) + '..' + queryValue(_to); } X++: t = typeof(a); switch (t) { case Types::ENUM: return enum2Value(a); // енум не вернет пустую строку case Types::REAL: return num2str(a,0,16,1,0); // тоже самое для вещественных чисел case Types::DATE: return strFmt('\"%1\"',a); // дата в кавычках case Types::STRING, Types::RSTRING, Types::VARSTRING: { s = a; if (!s) return SysQuery::valueEmptyString(); // пустая строка также заключается в кавычки return strFmt('%1',doEscape(s)); // только если строка непустая } default: return strFmt('%1',a); // если тут подберете что-нить, что вернет пустую строку, то вам памятник поставим } |
|
29.06.2009, 14:30 | #12 |
Участник
|
Начиная с четверки, этот метод доработали, так что может
__________________
Axapta v.3.0 sp5 kr2 |
|