Обнаружил неприятную особенность 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