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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.06.2009, 13:28   #1  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
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  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Цитата:
Сообщение от EVGL Посмотреть сообщение
Осторожно: русские умельцы решили улучшить метод SysQuery::range().

Если раньше было
SysQuery::range(3, 0) = "3.."

то после "улучшения" стало
SysQuery::range(3, 0) = "3..0"
В AX 4.0 EE результат такой же:
Цитата:
SysQuery::range(3, 0) = "3..0"
__________________
Dynamics AX 4.0 SP2
Старый 23.06.2009, 14:05   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Точно, значит еще раньше изменили. Я свою функцию на "голой" AX2009 запрограммировал, отсюда и неожиданный результат.
Старый 23.06.2009, 14:12   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
А когда так было?
X++:
SysQuery::range(3, 0) = "3.."
И почему этот результат правильный?
У меня на 3.0 SP3CU1 выдает также "3..0".
__________________
Андрей.
Старый 23.06.2009, 14:23   #5  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Какой из вариантов более "правильный" - вопрос вкуса. Факт тот, что в восточноевропейской версии нельзя задать в случае целочисленного или вещественного поля полуоткрытый интервал типа "от X до бесконечности" или "от бесконечности до X" с помощью метода SysQuery::range(). Случай, очевидно, редкий и всплывает только при обновлении стандартных приложений на версии EE.

Так что беру слова назад: ловушка расставлена только для иностранцев, читателям данного форума не особенно интересна.

Последний раз редактировалось EVGL; 23.06.2009 в 14:25.
Старый 23.06.2009, 14:48   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если посмотреть код в AX4.0, то открытый период формируется только для строк и дат. В общем-то, логично. Ведь если, например, указана пустая дата, то, очевидно, что в эту сторону интервал должен быть открыт. То же самое справедливо и для пустой строки.

А для чисел такой вывод сделать нельзя из-за существования отрицательных значений.

Если выражение SysQuery::range(-3, 0) будет интерпретировано как "-3..", то это явная ошибка.

Кроме того, для чисел, в отличие от строк, достаточно просто указать максимальное или минимальное значение заведомо больше (меньше) любого возможного значения.
Старый 23.06.2009, 14:58   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Кроме того, для чисел, в отличие от строк, достаточно просто указать максимальное или минимальное значение заведомо больше (меньше) любого возможного значения.
Например, с помощью функций ядра maxint()/minint().
Старый 23.06.2009, 15:25   #8  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Я бы в таких случаях не компостировал мозг серверу БД максимальным значением, а писал бы просто queryValue(3) + "..". Хотелось просто избежать текстовой константы, но увы...
Старый 23.06.2009, 15:49   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно просто делать SysQuery::Range(3, "")
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: EVGL (1), Logger (4).
Старый 23.06.2009, 16:54   #10  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
Этому методу в 4-ке было придано поведение аналогичное методу из трешки.
Основная проблема в том, что в SYS методе нельзя задать диапазон "0..0" для выборки нулевых значений. Это было критично для множества наших отчетов, запросов. Особенно это стреляет для элементов енумов, с нулевым значением.
Найденные буржуйские отчеты/запросы, которые использовали фильтр "0..0" как признак того, что необходимо выводить все записи, были соотвественно поправлены.

Так что, это был вопрос баланса. Либо необходимо было анализировать и править все наши вызовы к этому методу, либо все буржуйские. Буржуйских оказалось значительно меньше, чем наших.
За это сообщение автора поблагодарили: mazzy (2), EVGL (1), madm (1).
Старый 29.06.2009, 14:02   #11  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
X++:
public static str range(anytype _from, anytype _to)
{
    return queryValue(_from) + '..' + queryValue(_to);
}
метод queryValue возвращает метод SysQuery::value(a), а метод value имеет вид:
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); // если тут подберете что-нить, что вернет пустую строку, то вам памятник поставим
    }
поэтому SysQuery::range(3, ?) никогда не вернет значение "3.."
Старый 29.06.2009, 14:30   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от dech Посмотреть сообщение
X++:
public static str range(anytype _from, anytype _to)
{
    return queryValue(_from) + '..' + queryValue(_to);
}
Начиная с четверки, этот метод доработали, так что может
__________________
Axapta v.3.0 sp5 kr2
Теги
баг

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ComExcelDocument_RU по именнованной ячейки вывести номер ее строки. Poleax DAX: Программирование 37 15.10.2008 14:06
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:09.