16.03.2018, 13:19 | #1 |
Участник
|
Плагины, транзакции, автонумерация
Платформа Dynamics 365.
Колхозю автонумерацию (готовые решения просьба не предлагать ). Есть сущность "Нумератор", хранящая актуальный номер + сущность "Правило нумерации", задающее некие настройки. Помниться был такой способ создания автонумерации, когда делаешь плагин, в нем сначала обновляешь какое то мусорное поле записи нумератора, потому считываешь номер и обновляешь его новым значением. Плагины выполняются в транзакции, поэтому после первого "мусорного" обновления запись нумератора блокируется и это не дает номерам задваиваться при одновременной попытке получения номера. Сделал плагин на Post-RetrieveMultiple для сущности "Правило нумерации", в котором делаю все вышеописанное со связанной записью "Нумератор", но при тестировании получаю задвоенные номера. Чего то я не понимаю... Либо я не в Лондоне, либо Эйфелева башня не в Лондоне... Почему номера задваиваются?.. Может плагины на запрос данных (вроде Retrieve и RetrieveMultiple) не выполняются в транзакции? Это было бы конечно логично, что информации про это я как то не нашел. |
|
16.03.2018, 16:45 | #2 |
Чайный пьяница
|
Вопрос - почему вы используете RetrieveMultiple сущности "Правило нумерации", а не Create сущности, для которой собственно автономерацию и делаете?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
16.03.2018, 17:10 | #3 |
Участник
|
Потому что планирую сделать получение номера не только при создании записи, а, например, в WF. Нумерация записи при создании - это лишь частный случай (в моих нынешних реалиях, к тому же, не особо нужный).
|
|
16.03.2018, 17:56 | #4 |
Moderator
|
+1 за Create, хотя идея с RetrieveMultiple мне понравилась. Полагаю, идея была сделать а-ля сиквенс?
Мне очень сомнительно, что чтение тоже делается в транзакции, но вы легко можете это проверить: IPluginExecutionContext имеет свойство IsInTransaction. p.s. Сделайте хотя бы на Retrieve, а то ваш нумератор будет наматывать при каждом просмотре списка сущности "Правило нумерации". Как вариант, сделайте строковый альтернативный ключ и ретривьте по нему. Увы не нашел, поддерживается ли этот сценарий. Возможно работает только с Create или Update.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional Последний раз редактировалось Артем Enot Грунин; 16.03.2018 в 18:02. |
|
19.03.2018, 09:23 | #5 |
Участник
|
Цитата:
Сделанно специально на RetrieveMultiple, потому что это позволяет "передавать в запрос параметры" через условие поиска. В зависимости от этих "параметров" происходит или не происходит генерация номера. |
|
19.03.2018, 09:52 | #6 |
Участник
|
Цитата:
Сообщение от ZooY
Помниться был такой способ создания автонумерации, когда делаешь плагин, в нем сначала обновляешь какое то мусорное поле записи нумератора, потому считываешь номер и обновляешь его новым значением. Плагины выполняются в транзакции, поэтому после первого "мусорного" обновления запись нумератора блокируется и это не дает номерам задваиваться при одновременной попытке получения номера.
Опишите подробнее для чего Вам нужны правила нумерации. В большинстве случаев все реализуется на уровне сущности автонумерации, даже несколько разных вариантов номеров для 1 сущности, но, не универсально. Если Вы заранее показываете пользователю номер, то у Вас будут пропуски в нумерации, если пользователь не сохранит запись и закроет форму создания. |
|
19.03.2018, 10:50 | #7 |
Участник
|
Цитата:
Цитата:
Хочется сделать просто и универсальное решение. Собственно с RetrieveMultiple и Lock оно вполне получилось, но хотелось узнать, почему не получилось с транзакциями. Это то понятно... Но когда я говорил о формировании номера в JS я скорее имел в виду OnSave формы или какие-нибудь дикие кейсы с предсоздание новой записи... |
|