Показать сообщение отдельно
Старый 20.01.2009, 22:49   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3267 (116) ++++++++++
Регистрация: 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).