|  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 | 
|  | 
| Теги | 
| баг | 
|  | 
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |