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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.03.2020, 10:35   #1  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Ax2009, Struct, Remove
Сегодня решил проверить как работают функции класса Struct.
И мягко говоря расстроился от результата работы функции Remove.

Я почему-то ожидал, что эта функция работает аналогично классам Set, Map. То есть удаляет элемент.
И вроде бы следующий программный код должен выводить на экране "1".
X++:
    Struct s = new Struct();
;
    s.add("01","-");
    s.add("02","-");
    s.add("03","-");
    s.remove("02");
    s.remove("03");
    info(strfmt("%1", s.fields()));
Но на самом деле выводится "3".

После remove удаляется лишь название элемента. Сам элемент вместе со своим значением остаётся в классе. К нему можно обратиться по индексу.
Функция fields() становится бесполезной в таком случае.
__________________
Дмитрий
За это сообщение автора поблагодарили: Raven Melancholic (3), Pandasama (1).
Старый 20.03.2020, 14:24   #2  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
X++:
    Struct s = new Struct();
    ;
    s.add("01","1-");
    s.add("02","2-");
    s.add("03","3-");
    info(strfmt("%1", s.toString()));
    s.remove("02");
    s.remove("03");
    info(strfmt("%1", s.fields()));
    info(strfmt("%1", s.toString()));
    info(strfmt("%1", s.valueIndex(2)));
    s.add("04","4-");
    s.add("05","5-");
    info(strfmt("%1", s.fields()));
    info(strfmt("%1", s.valueIndex(2)));
    s.add("06","6-");
    info(strfmt("%1", s.fields()));
    s.remove("02");
    s.remove("03");
    s.remove("04");
    s.remove("05");
    info(strfmt("%1", s.fields()));
    info(strfmt("%1", s.toString()));
Похоже возвращает максимально количество полей, которое было в структуре. Т.к. перетирание индекса происходит корректно и toString тоже выводит правильную информацию.
__________________
Любую техническую проблему можно решить, если есть достаточно времени и денег.
Старый 20.03.2020, 15:28   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Если заменить s.toString() на s.definitionString(), то видно что и с самими полями тоже все вроде бы неплохо.
Но, действительно, ориентироваться на fields() уже нельзя если нужен перебор - получим выход за пределы индекса.
Хотя удаление из структуры полей немного экзотичная задача.
Старый 20.03.2020, 18:43   #4  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
получим выход за пределы индекса.
Нет, в этом случае не будет exception.
Система по индексу покажет все удаленные элементы.
Просто у них fieldName будет равен "".
__________________
Дмитрий
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Unable to update or remove Dynamics AX Components as you can’t choose any of them Blog bot DAX Blogs 0 13.03.2015 16:11
Malaysia: Struct Blog bot DAX Blogs 0 29.10.2012 19:11
axinthefield: Choosing a Single Deployment or Multiple Deployments of AX2009 Blog bot DAX Blogs 0 15.06.2011 03:25
Функция global::valueFromXMLNode() в Ax2009 работает не корректно someOne DAX: Программирование 3 09.12.2010 15:58
Struct DmitryS DAX: Программирование 4 02.04.2008 11:22
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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