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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.09.2011, 13:50   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Не корректная сортировка в Map-e и Set-е. AX2009 RU5
X++:
static void JobSortMap(Args _args)
{
    Map map = new Map(TYPES::String, TYPES::Real);
    MapIterator mit;
    ;
    
    map.insert('10', 0);
    map.insert('30', 0);
    map.insert('-10', 0);
    map.insert('-5', 0);
    map.insert('20', 0);
    map.insert('71', 0);
    map.insert('7-1', 0);
    map.insert('20-30', 0);
    
    mit = new MapIterator(map);
    while (mit.more())
    {
        info(mit.key());
        mit.next();
    }
}
Не давно заметили такую особенность, что при добавлении ключа типа String, который содержит в себе "тире" в Map, он не правильно его сортирует(размещает). Создается такое впечатление, что во время сортировки(размещения) в Map-e при добавлении таких вот записей он вообще "тире" не учитывает. Как будто выбрасывает, хотя ключ строит.
Результаты Job-a:
AX2009:
10
-10
20
20-30
30
-5
71
7-1
Axapta 3.0:
-10
-5
10
20
20-30
30
7-1
71
С Set-ами такая же хрень. Мне кажется в Axapta 3.0 сортировка более правильная.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
За это сообщение автора поблагодарили: alex55 (1), S.Kuskov (3).
Старый 13.09.2011, 14:20   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
А как себя ведет MapEnumerator в таком случае ? MapIterator как-то был объявлен атавизмом ...
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 13.09.2011, 14:26   #3  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
А как себя ведет MapEnumerator в таком случае ? MapIterator как-то был объявлен атавизмом ...
Проверил : точно так же.
Жаль, что испортили, неудобно.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 13.09.2011, 14:56   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вот ещё про символ тире: Сортировка и сравнение строк
За это сообщение автора поблагодарили: Pustik (2).
Старый 13.09.2011, 15:36   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Нет. Здесь другая проблема. Символ дефиса, в данном случае, выступает как некий управляющий символ. И режим сортировки тут вообще не при чем

X++:
static void Job_Test(Args _args)
{
    void comp(str _str1, str _str2)
    {
        if (_str1 > _str2)
        {
            info(_str1 + ' больше ' + _str2);
        }
        if (_str1 < _str2)
        {
            info(_str1 + ' меньше ' + _str2);
        }
        if (_str1 == _str2)
        {
            info(_str1 + ' равно ' + _str2);
        }
    }
    ;

    comp('1','-1');
    comp('2','-1');
    comp('10','-1');
    comp('10','-2');
    comp('20','-1');
    comp('20','-2');
    comp('20','-3');

}

Получаем "1 меньше -1", но "2 больше -1" и "10 больше -1". Значит, сортировка - не при чем. Что-то другое.

Последний раз редактировалось Владимир Максимов; 13.09.2011 в 15:42.
За это сообщение автора поблагодарили: Pustik (1).
Старый 13.09.2011, 16:16   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
И всё-таки, видимо, всему виной collation
http://www.sql.ru/forum/actualthread...d=1&tid=414232
http://www.sql.ru/forum/actualthread.aspx?tid=290618

Последний раз редактировалось S.Kuskov; 13.09.2011 в 16:33.
Старый 13.09.2011, 17:43   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если исходить из предположения, что это связано с collate, то порядок, приведенный в начале темы соответствует collate с названием Cyrillic_General_CI_AS.

У нас на сервере настроена collate SQL_Latin1_General_CP1251_CI_AS, что дает "правильный" порядок сортировки на самом сервере

Значит, Axapta использует сортировку Windows (опять же, если предположение соответствует действительности). Может, кто в курсе как это проверить? И есть ли соответствующие настройки Axapta?
Старый 13.09.2011, 19:31   #8  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
При чем тут collate и вообще сервер базы данных если речь идет о map ?

Наверное, намерено никто ничего "не портил", просто как то повлиял переход платформы на поддержку unicode.

Кстати что то подобное касается и временных таблиц : сортировка в них (для Ax2009) отличается от той, что была в Ax 3.0. Видимо, причина та же что и с map.
Старый 13.09.2011, 20:00   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от someOne Посмотреть сообщение
Наверное, намерено никто ничего "не портил", просто как то повлиял переход платформы на поддержку unicode.
Мы тоже об этом сначала подумали.
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
X++:
static void Job_Test(Args _args)
{
    void comp(str _str1, str _str2)
    {
        if (_str1 > _str2)
        {
            info(_str1 + ' больше ' + _str2);
        }
        if (_str1 < _str2)
        {
            info(_str1 + ' меньше ' + _str2);
        }
        if (_str1 == _str2)
        {
            info(_str1 + ' равно ' + _str2);
        }
    }
    ;

    comp('1','-1');
    comp('2','-1');
    comp('10','-1');
    comp('10','-2');
    comp('20','-1');
    comp('20','-2');
    comp('20','-3');

}
Получаем "1 меньше -1", но "2 больше -1" и "10 больше -1". Значит, сортировка - не при чем. Что-то другое.
Если логически порассуждать, то тире он все-таки учитывает, иначе не было бы "1 меньше -1", но "2 больше -1" логику рассуждений заводит в тупик!!!!!!
Может быть есть смысл в логику его сортировки добавить количество символов в строке?
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 13.09.2011 в 20:03.
Старый 13.09.2011, 20:21   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от someOne Посмотреть сообщение
При чем тут collate и вообще сервер базы данных если речь идет о map ?
В данном случае Map - это частный случай сравнения (упорядочивания) символьных строк. Проблема касается ЛЮБЫХ вариантов сравнения символьных данных в Ax2009. Любым способом и в любом месте.

Посмотрите мой пример. Там нет никаких объектов. Банальное "в лоб" сравнение символьных строк вида (str1 > str2). Тем не менее, наблюдается та же проблема.

При этом тот порядок сортировки (правила сравнения на больше/меньше), который в результате получается, идеально совпадает с тем порядком сортировки, который получается при collate с именем Cyrillic_General_CI_AS
Старый 13.09.2011, 20:39   #11  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
В данном случае Map - это частный случай сравнения (упорядочивания) символьных строк. Проблема касается ЛЮБЫХ вариантов сравнения символьных данных в Ax2009. Любым способом и в любом месте.
Понял это после Вашего примера.
(спасибо за пример)
Как победить?А если многие алгоритмы зависят от правильной сортировки?Менять тире на какой-нибудь хитрый символ(типа ###)?
Эх, считаю , что это баг!
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 13.09.2011 в 20:44.
Старый 14.09.2011, 09:04   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
В трешке при сравнении строк используется String sort, а в 2009-й (и в четверке, по-видимому) Word sort

В сортировке символов все нецифро-буквенные символы имеют меньшее значение, чем любая цифра или буква и оказываются всегда впереди

В сортировке слов апостроф и дефис сортируются так, что-бы одинаковые слова, разделенные ими, стояли рядом. Т.е. при сравнении рассмотривается не только сам этот символ, но и следующие за ним
По-этому, '12' > '1-1', а '10' < '1-1'.
Что касается сравнения '11' и '1-1', то тут уже, по-моему, имеет значение так же длина строки. Т.е. '11' < '1-1'. Эксперименты с различными кодировками (включая китайские, арабские и японские) не влияли на результаты сравнения
А вот сравнение '11-' и '1-1' выявило разные результаты (причем и для трешки и для 2009-й) на WinXP ('11-' > '1-1') и на Win7/2008R2 ('11-' < '1-1') для одной и той же кодировки. Тут либо разная реализация функций сравнения в разных версиях винды, либо разные настройки локалей
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: sukhanchik (4), Logger (5), gl00mie (5).
Старый 03.05.2016, 21:28   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
В трешке при сравнении строк используется String sort, а в 2009-й (и в четверке, по-видимому) Word sort

В сортировке символов все нецифро-буквенные символы имеют меньшее значение, чем любая цифра или буква и оказываются всегда впереди

В сортировке слов апостроф и дефис сортируются так, что-бы одинаковые слова, разделенные ими, стояли рядом. Т.е. при сравнении рассмотривается не только сам этот символ, но и следующие за ним
По-этому, '12' > '1-1', а '10' < '1-1'.
Вот еще интересная ссылка про сравнение:
http://stackoverflow.com/questions/3...or-string-sort
Теги
ax2009, map, set, сортировка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Классы коллекций (инициализация, сериализация): List, Set, Map. petergunn DAX: База знаний и проекты 12 06.11.2024 18:38
Некорректное отражение map при пакетной обработке в Ax2009, и налоги в строках накладных/фактур Maximin DAX: Программирование 22 21.12.2011 16:03
Как лучше отлаживать код с временными таблицами, recordset'ами, set'ами, map'ами и прочими сложными структурами? mazzy DAX: Прочие вопросы 5 29.07.2011 19:08
Ax2009 RU5: Не заполняется CreatedDateTime в SysDatabaseLog Damn DAX: Администрирование 2 07.09.2010 15:29
AX2009 RU5: ADORecordSet, вопрос на 16 баллов DSPIC DAX: Программирование 6 01.09.2010 18:19

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

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

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