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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.02.2017, 12:30   #1  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Беда с set'ом
Добрый день! Данный код не отрабатывает...

X++:
    set         mySet = new Set(Types::Record);
    ;
    
    mySet.add(CustTable::find('Клиент1'));
    mySet.add(CustTable::find('Клиент2'));
    if (mySet.in(CustTable::find('Клиент1')))
        info(strfmt('%1', mySet.remove(CustTable::find('Клиент1'))));
самое весело, что не отрабатывает именно remove. IF выполняется. Что за мистика такая?
Старый 20.02.2017, 12:38   #2  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
В ядре 6.3.4000.2855 отрабатывает.
Старый 20.02.2017, 12:47   #3  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
да, забыл уточнить, ms dax2009
Старый 20.02.2017, 12:49   #4  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Добрый день! Данный код не отрабатывает...

X++:
    set         mySet = new Set(Types::Record);
    ;
    
    mySet.add(CustTable::find('Клиент1'));
    mySet.add(CustTable::find('Клиент2'));
    if (mySet.in(CustTable::find('Клиент1')))
        info(strfmt('%1', mySet.remove(CustTable::find('Клиент1'))));
самое весело, что не отрабатывает именно remove. IF выполняется. Что за мистика такая?
Что-то останавливает писать такой код. Я бы так не смог. Нутро бы не дало.

Или хранить RecId в Set или использовать Map c ключом RecId и значением типа Record.
Старый 20.02.2017, 12:57   #5  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Что-то останавливает писать такой код. Я бы так не смог. Нутро бы не дало.

Или хранить RecId в Set или использовать Map c ключом RecId и значением типа Record.
функционалом предусмотрен такой код, почему бы его не написать... делать по-вашему ни в первом ни во втором случае не представляется возможным условиями задачи. сейчас попробую с использованием SetIterator'a сделать, будет громоздко, но лишь бы работало
Старый 20.02.2017, 13:05   #6  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
It is best practice to use the (SetEnumerator) class instead of the SetIterator class. This avoids problems if you are accessing the set on one tier with an iterator on another tier. Set iterators and the sets over which they iterate must be on the same client/server side. If you use SetIterator and code is marked as Called from, it is possible that the set and the iterator will end up on different tiers, and the code will fail. If you use SetEnumerator, the enumerator is automatically created on the same tier as the set. Also, to move to the next item in a set, you must explicitly call the more and next methods if you are using a set iterator. If you use SetEnumerator, you only have to call moveNext method.
https://msdn.microsoft.com/en-us/lib...titerator.aspx
Старый 20.02.2017, 13:20   #7  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
в setEnumerator нет метода удаления. С SetIterator другая проблема

буду делать с помощью List и ListIterator, он отработал
За это сообщение автора поблагодарили: ax_mct (3).
Старый 20.02.2017, 13:38   #8  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
функционалом предусмотрен такой код, почему бы его не написать... делать по-вашему ни в первом ни во втором случае не представляется возможным условиями задачи. сейчас попробую с использованием SetIterator'a сделать, будет громоздко, но лишь бы работало
Чем отличается опытный программист от неопытного? Именно этим: "функционалом предусмотрен такой код, почему бы его не написать?"

SetEnumerator как уже отметили, будет лучше. Так же как и MapEnumerator.

А то что не представляется возможным по условиям задачи использовать другой код - это бред.

Не потому что не работает, а потому дикий код он и в стандарте - дикий.

P.S. List - вот это более натурально. Я лично доверяю Set только RecID. Оно как бы и логично.
P.P.S. Кстати временная таблица в сложных случаях - тоже опция.

Последний раз редактировалось ax_mct; 20.02.2017 в 13:46.
Старый 20.02.2017, 13:46   #9  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
А что будет, если у вас между первым, вторым и третьим вызовами CustTable::find('Клиент1'), соседний пользователь что-то обновит и всякие modifiedBy, ModifiedDateTime, modifiedTransactionId, recVersion и тд и тп - поменяются ? Какого поведения от системы вы ожидаете в этом случае (особенно если условие myset.in() отрабтает, а дальнейшая попытка что-то удалить обломается в связи с тем что поля у записи в set и в табличном буфере - разные)?
Старый 20.02.2017, 13:46   #10  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
сделаю через List
Старый 20.02.2017, 13:47   #11  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от fed Посмотреть сообщение
А что будет, если у вас между первым, вторым и третьим вызовами CustTable::find('Клиент1'), соседний пользователь что-то обновит и всякие modifiedBy, ModifiedDateTime, modifiedTransactionId, recVersion и тд и тп - поменяются ? Какого поведения от системы вы ожидаете в этом случае (особенно если условие myset.in() отрабтает, а дальнейшая попытка что-то удалить обломается в связи с тем что поля у записи в set и в табличном буфере - разные)?
для этого я буду сравнивать только TableId и RecId
Старый 20.02.2017, 13:58   #12  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
для этого я буду сравнивать только TableId и RecId
Это в целом - правильная идея, но тогда и List не понадобится. Достаточно будет сделать set из контейнеров с двумя элементами.
Старый 20.02.2017, 14:41   #13  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от fed Посмотреть сообщение
Это в целом - правильная идея, но тогда и List не понадобится. Достаточно будет сделать set из контейнеров с двумя элементами.
согласен
Старый 20.02.2017, 18:51   #14  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
согласен
Я бы использовал Set только для набора примитивных типов как RecId.
Что-то там было, а что уже и не помню. В системном коде более принятый вариант все же Map(RecId, Record). Если нужен составный ключ то просто делайте уникальную строку TableId&&RecId. Тоже общий подход.

И подумайте нужно ли вам удаление. Возможно несколько коллекций будет лучше, то есть результат - в отдельный Map или в Set если RecId или строка как ключ. Дорогое это удаление. Уверен можно без него обойтись.

Последний раз редактировалось ax_mct; 20.02.2017 в 18:56.
Старый 21.02.2017, 09:07   #15  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Если в контексте подразумевается конкретная таблица, то TableId не нужен. Саму запись хранить в коллекции - дурной тон (Record***List - исключение из правил). Для Set/Map/List лучше и быстрее работать с RecId. Если вам нужно работать непосредственно с некоторым набором записей, сделайте CustTable временной таблицей. Как вариант еще можно RecordInsertList рассмотреть.
__________________
// no comments
За это сообщение автора поблагодарили: ax_mct (3).
Старый 21.02.2017, 11:51   #16  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от dech Посмотреть сообщение
Как вариант еще можно RecordInsertList рассмотреть.
Может лучше RecordSortedList?
Старый 21.02.2017, 12:24   #17  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
305 / 873 (30) +++++++
Регистрация: 23.10.2012
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Добрый день! Данный код не отрабатывает...
На ядрах:
4.0.2503...
5.0.1500...
6.3.164...
Код выполняется корректно, кол-во элементов сета уменьшается с 2 до 1.
Теги
remove, set, беда, проблема

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Классы коллекций (инициализация, сериализация): List, Set, Map. petergunn DAX: База знаний и проекты 12 06.11.2024 18:38
emeadaxsupport: How to set up Images to show in MPOS Blog bot DAX Blogs 0 01.07.2015 19:11
ax_gfm_framework_team: Clear the dimension set balance ledger dimension cache Blog bot DAX Blogs 0 13.12.2013 07:12
Malaysia: Set Blog bot DAX Blogs 0 29.10.2012 19:11
fed: Net requirements update in MRP Module and Working Set of MRP Blog bot DAX Blogs 14 08.05.2012 13:09

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

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

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