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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.04.2011, 04:14   #1  
Blog bot is offline
Blog bot
Участник
 
25,626 / 848 (80) +++++++
Регистрация: 28.10.2006
dax-lessons: Sort a container [using X++ , Dynamics AX]
Источник: http://dynamicsaxgyan.wordpress.com/...x-dynamics-ax/
==============

Friends, Recently I was in need of sorting the elements in the container and use them . I am not sure how far this code is helpful to you guys. Below code will help to sort the elements in the … Continue reading →
X++:
static void SR_sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9, 'Ashish singh', NoYes::No];
    str temp1;
    str temp2;
    int i;
    int j;
    container sorCon;
    ;

    sorCon = con;

    // Sort the container
    for (i = 1; i <= conlen(sorCon); i++)
    {
        for (j = i + 1; j <= conlen(sorCon); j++)
        {
            temp1 = conpeek(sorCon, j);
            temp2 = conpeek(sorCon, i);

            if (temp1 < temp2)
            {
                sorCon = condel(sorCon, j, 1);
                sorCon = conins(sorCon, j, temp2);
                sorCon = condel(sorCon, i, 1);
                sorCon = conins(sorCon, i, temp1);
            }
        }
    }

    conview(sorCon);
}
Источник: http://dynamicsaxgyan.wordpress.com/...x-dynamics-ax/
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.

Последний раз редактировалось Poleax; 22.04.2011 в 10:45.
Старый 22.04.2011, 07:25   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
что-то все больше разочаровываюсь в этих уроках, в этом блоге и в этом авторе-консультанте.

для сортировки использует метод пузырька. бог с ним, может с методической точки зрения хочет показать работу с контейнером, и не хочет усложнять демонстрационный пример сложностью алгоритмов.

но почему этот чел, использует связку condel+conins вместо одного conpoke? загадка!

и почему этот чел объявил временные переменные как строки "str temp1;", а не как anytype! у него же "отсортированный" контейнер будет содержать совсем другие значения.

убрать что-ли этот блог из импорта на аксфорум...
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 08:27   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Anytype остается anytype'ом ровно до того момента, пока ему не присвоят определенное значение. Дальше он будет иметь тот тип, которым его инициализировали. И при дальнейших присвоениях будет происходить конвертация в этот первоначальный тип.
Что не всегда возможно, либо не всегда корректно. Внутренняя ошибка номер 25 в сценарии SQL

Да и сравнивать надо значения одно типа (или сравниваемых, типа int и real). Потому как сказать, что больше или меньше 2 или 'Sumit Loya' невозможно. Да и что даст такое сравнение - то же непонятно.

Что касается основного вопроса - на блоге есть возможность оставить отзыв.
Надо строго его предупредить, что если продолжит в том же духе, то будет исключен и забыт на аксфоруме. Пусть одумается, пока не поздно
__________________
Axapta v.3.0 sp5 kr2
Старый 22.04.2011, 08:43   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Да и сравнивать надо значения одно типа (или сравниваемых, типа int и real). Потому как сказать, что больше или меньше 2 или 'Sumit Loya' невозможно. Да и что даст такое сравнение - то же непонятно.
О! точно, т.е. сравнивать и вставлять обратно в контейнер надо разные значения!
вот об этом и надо было написать.
а так получилась полная фигня.

Цитата:
Сообщение от AndyD Посмотреть сообщение
Надо строго его предупредить, что если продолжит в том же духе, то будет исключен и забыт на аксфоруме. Пусть одумается, пока не поздно
да, бог с ним, с автором. пусть как хочет.
вопрос - нужно ли такое на аксфоруме.
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 09:14   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Да и сравнивать надо значения одно типа (или сравниваемых, типа int и real). Потому как сказать, что больше или меньше 2 или 'Sumit Loya' невозможно. Да и что даст такое сравнение - то же непонятно.
вот правильный пример - обратите внимание на типы значений в окошках, которые показывают содержимое контейнера.
X++:
static void sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9, 'Ashish singh', NoYes::No];
    int len = conlen(con); // вычисляем только один раз!
    int i;
    int j;

    // принимаем значения любого типа
    // однако сравниваем как строки!
    int cmp(anytype a, anytype b)
    {
        // Здесь конечно надо бы возвращать три значения 1; 0; -1
        // но раз уж используем метод пузырька,
        // упрощаем не сильно заморачиваясь по поводу производительности
        // главное - методика сравнение двух anytype значений
        return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1;  // дает runtime error если внутри контейнера есть контейнер!
                                                                    // дает разные результаты, если выполняется в среде с разными языками
    }
    
    // меняем местами значения внутри контейнера
    void swapIf(int _i, int _j)
    {
        anytype a = conpeek(con, _i); // значения с типом anytype примут тип при первой инициализации
        anytype b = conpeek(con, _j); // повторные присваивания уже не изменят тип переменной anytype,
                                      // поэтому обмен приходится делать в локальном методе
        if( cmp(a, b) > 0 )
        {
            con = conpoke(con, _j, a);
            con = conpoke(con, _i, b);
        }
    }
;
 
    conview(Con,"con: before");

// Sort the container
    for (i = 1; i < len; ++i)
    {
        for (j = i + 1; j <= len; ++j)
        {
            swapif(i, j);
        }
    }
    conview(Con,"con: after");
}
Миниатюры
Нажмите на изображение для увеличения
Название: 1.PNG
Просмотров: 302
Размер:	60.2 Кб
ID:	6782  
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 22.04.2011 в 10:33. Причина: добавил инфу о runtime error, и о чувствительности к языку
Старый 22.04.2011, 09:22   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение
вот правильный пример
ГЫ! SysQuery::value() ругается, если будут вложенные контейнеры!

X++:
static void sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9, ['inner container', 'with', 4, 'values'],'Ashish singh', NoYes::No];
...
    int cmp(anytype a, anytype b)
    {
        return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // runtime ошибка!!!!!
    }
...
поэтому методка сравнения anytype переменных по-прежнему не определена.
буду признателен, если кто подскажет
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 09:25   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение
что-то все больше разочаровываюсь в этих уроках, в этом блоге и в этом авторе-консультанте.
в общем, даже такой простейший урок может показать гораздо больше. зависит от автора.

но делать condel+conins - это маразм. даже для учебных примеров.
а возвращать обратно в контейнер строки вместо исходных значений - это грубая ошибка. тем более в учебных примерах.
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 09:38   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ГЫ! Даже если нет контейнеров, то порядок установленный при помощи SysQuery::value зависит от используемого языка!
так в русском NoYes::No сортируется как слово "Нет", а при английском языке сортируется как слово "No"

X++:
static void sortContainer(Args _args)
{
    container con = [5,1,2,'Sumit Loya',9,'Ashish singh', NoYes::No];
...
    int cmp(anytype a, anytype b)
    {
        return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // результат зависит от языка, в котором работает пользователь
    }
...
поэтому методка сравнения anytype переменных по-прежнему не определена.
буду ОЧЕНЬ признателен, если кто подскажет.

Не то, чтобы это было нужно. Но интересножеж.
__________________
полезное на axForum, github, vk, coub.
Старый 22.04.2011, 10:14   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mazzy Посмотреть сообщение
методка сравнения anytype переменных по-прежнему не определена.
буду ОЧЕНЬ признателен, если кто подскажет.

Не то, чтобы это было нужно. Но интересножеж.
Предлагаю сравнивать значеня побитово .

А если серьёзно, то в чём смысл сортировки ради сортировки? Можно конечно расматривать упорядоченный контейнер как некую его хеш-функцию, котрую потом можно использовать для определения эквивалентности контейнеров. Но решить данную задачу можно и более простыми, и главное более оптимальными способами.

Итого. Считаю возможным решать задачу сортировки разнородных данных, только в контексте конкретной задачи. Тогда выбор методики сравнения будет зависеть от самой задачи, и вообще говоря не будет универсальным, подходящим для других задач.

Если говорить о создании универсального инструмента сортировки контейнера, то универсальным выходом может быть передача предиката сравнения в качестве входного параметра алгоритму сортировки.
Как это реализовать в аксапте - уже другой вопрос Передача функции в качестве параметра
За это сообщение автора поблагодарили: mazzy (2).
Старый 22.04.2011, 10:17   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А если серьёзно, то в чём смысл сортировки ради сортировки?
Разбор моих грехов
Оставьте до поры
Вы оцените красоту игры
(С)
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dax-lessons: Container to selectMultiple List using X++ [Dynamics AX] Blog bot DAX Blogs 0 07.04.2011 19:11
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
dynamics-ax: Official Details about Dynamics AX '6' released, including comments from Microsofts Kees Hertogh Blog bot DAX Blogs 0 11.01.2011 05:22
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05

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

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

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