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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.01.2009, 22:49   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Осторожно. RecordSortedList учитывает регистр символов
Обнаружил неприятную особенность RecordSortedList. При сравнении строковых значений при поиске по ключу, сравнение учитывает регистр символов, что может приводить к ошибкам, так как везде в X++ сравнение строк регистронезависимое.

X++:
// pkoz, 20.01.2009
static void testRegistSensitive(Args _args)
{
    RecordSortedList    cacheInventSum;
    InventSum           InventSum;
    boolean             testSameRegistr;
    boolean             testLowerRegistr;

    boolean             testSameRegistrMap;
    boolean             testLowerRegistrMap;

    boolean             testSameRegistrMapCon;
    boolean             testLowerRegistrMapCon;

    map                 map;
    str                 key;

    container           conKey;

    str getKey(str  _param1, str _param2)
    {
        return strFMT("%1;%2;", _param1, _param2);
    }

    container getConKey(str  _param1, str _param2)
    {
        return [_param1, _param2];
    }

    void initInventSum()
    {
        ;
        InventSum = null;
        InventSum.ItemId      = "1234";
        InventSum.InventDimId = "DIM1234";
        InventSum.PostedQty   = 10;

    }
    ;
    initInventSum();
    cacheInventSum = new RecordSortedList(TableNum(InventSum));
    cacheInventSum.sortOrder(FieldNum(InventSum,itemId),FieldNum(InventSum,inventDimId));
    cacheInventSum.ins(InventSum);
    testSameRegistr = cacheInventSum.find(InventSum);

    InventSum.InventDimId = strLwr(InventSum.InventDimId);
    testLowerRegistr = cacheInventSum.find(InventSum);

    info(strFMT("RSL %1; %2", testSameRegistr, testLowerRegistr));
    if (!testLowerRegistr)
        error("CaseSensitive RSL !!!");

    //////////////////

    map = New Map (types::String, types::Record);
    initInventSum();
    key = getKey(InventSum.ItemId, InventSum.InventDimId);
    map.insert(key, InventSum);


    testSameRegistrMap = map.exists(key);

    key = getKey(InventSum.ItemId, strLwr(InventSum.InventDimId));
    testLowerRegistrMap = map.exists(key);

    info(strFMT("Map StrinKey %1; %2", testSameRegistrMap, testLowerRegistrMap));
    if (!testLowerRegistrMap)
        error("CaseSensitive Map StrinKey !!!");

    //////////////////

    map = New Map (types::Container, types::Record);
    initInventSum();
    conKey = getConKey(InventSum.ItemId, InventSum.InventDimId);
    map.insert(conkey, InventSum);


    testSameRegistrMapCon = map.exists(Conkey);

    Conkey = getConKey(InventSum.ItemId, strLwr(InventSum.InventDimId));
    testLowerRegistrMapcon = map.exists(conkey);

    info(strFMT("Map ContainerKey %1; %2", testSameRegistrMapCon, testLowerRegistrMapCon));
    if (!testLowerRegistrMapCon)
        error("CaseSensitive Map ContainerKey !!!");

}
Например, это влияет на работу проверки целостности данных компании, а именно на класс InventSumReCalcItem. Если в InventSum в ключевых полях есть символы в верхнем регистре, то при проверке такие записи считаются ошибочными и пересоздаются со значениями в нижнем регистре.

P.S. Ax 3.0 KR3 SP5 Oracle
За это сообщение автора поблагодарили: dn (2), ZVV (1), lev (1), coolibin (1), aidsua (1), gl00mie (8).
Теги
баг, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
RecordSortedList как проверить??? V777 DAX: Программирование 29 03.12.2008 14:35
Как узнать по объекту RecordSortedList, из какой таблицы в нем записи? gl00mie DAX: Программирование 4 20.02.2008 15:39
axStart: RecordSortedList Blog bot DAX Blogs 0 21.12.2007 04:11

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

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

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