20.02.2017, 12:30 | #1 |
Участник
|
Беда с 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')))); |
|
20.02.2017, 12:38 | #2 |
Участник
|
В ядре 6.3.4000.2855 отрабатывает.
|
|
20.02.2017, 12:47 | #3 |
Участник
|
да, забыл уточнить, ms dax2009
|
|
20.02.2017, 12:49 | #4 |
Banned
|
Цитата:
Сообщение от 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')))); Или хранить RecId в Set или использовать Map c ключом RecId и значением типа Record. |
|
20.02.2017, 12:57 | #5 |
Участник
|
функционалом предусмотрен такой код, почему бы его не написать... делать по-вашему ни в первом ни во втором случае не представляется возможным условиями задачи. сейчас попробую с использованием SetIterator'a сделать, будет громоздко, но лишь бы работало
|
|
20.02.2017, 13:05 | #6 |
Участник
|
Цитата:
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.
|
|
20.02.2017, 13:20 | #7 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
20.02.2017, 13:38 | #8 |
Banned
|
Цитата:
SetEnumerator как уже отметили, будет лучше. Так же как и MapEnumerator. А то что не представляется возможным по условиям задачи использовать другой код - это бред. Не потому что не работает, а потому дикий код он и в стандарте - дикий. P.S. List - вот это более натурально. Я лично доверяю Set только RecID. Оно как бы и логично. P.P.S. Кстати временная таблица в сложных случаях - тоже опция. Последний раз редактировалось ax_mct; 20.02.2017 в 13:46. |
|
20.02.2017, 13:46 | #9 |
Moderator
|
А что будет, если у вас между первым, вторым и третьим вызовами CustTable::find('Клиент1'), соседний пользователь что-то обновит и всякие modifiedBy, ModifiedDateTime, modifiedTransactionId, recVersion и тд и тп - поменяются ? Какого поведения от системы вы ожидаете в этом случае (особенно если условие myset.in() отрабтает, а дальнейшая попытка что-то удалить обломается в связи с тем что поля у записи в set и в табличном буфере - разные)?
|
|
20.02.2017, 13:46 | #10 |
Участник
|
сделаю через List
|
|
20.02.2017, 13:47 | #11 |
Участник
|
Цитата:
Сообщение от fed
А что будет, если у вас между первым, вторым и третьим вызовами CustTable::find('Клиент1'), соседний пользователь что-то обновит и всякие modifiedBy, ModifiedDateTime, modifiedTransactionId, recVersion и тд и тп - поменяются ? Какого поведения от системы вы ожидаете в этом случае (особенно если условие myset.in() отрабтает, а дальнейшая попытка что-то удалить обломается в связи с тем что поля у записи в set и в табличном буфере - разные)?
|
|
20.02.2017, 13:58 | #12 |
Moderator
|
|
|
20.02.2017, 14:41 | #13 |
Участник
|
|
|
20.02.2017, 18:51 | #14 |
Banned
|
Я бы использовал Set только для набора примитивных типов как RecId.
Что-то там было, а что уже и не помню. В системном коде более принятый вариант все же Map(RecId, Record). Если нужен составный ключ то просто делайте уникальную строку TableId&&RecId. Тоже общий подход. И подумайте нужно ли вам удаление. Возможно несколько коллекций будет лучше, то есть результат - в отдельный Map или в Set если RecId или строка как ключ. Дорогое это удаление. Уверен можно без него обойтись. Последний раз редактировалось ax_mct; 20.02.2017 в 18:56. |
|
21.02.2017, 09:07 | #15 |
Участник
|
Если в контексте подразумевается конкретная таблица, то TableId не нужен. Саму запись хранить в коллекции - дурной тон (Record***List - исключение из правил). Для Set/Map/List лучше и быстрее работать с RecId. Если вам нужно работать непосредственно с некоторым набором записей, сделайте CustTable временной таблицей. Как вариант еще можно RecordInsertList рассмотреть.
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
21.02.2017, 11:51 | #16 |
Участник
|
|
|
21.02.2017, 12:24 | #17 |
Участник
|
|
|
Теги |
remove, set, беда, проблема |
|
|