15.07.2014, 13:21 | #1 |
Участник
|
Конфликт плагина и рабочего процесса
Приветствую, коллеги.
Нужен совет в следующей сложившейся ситуации. Есть плагин, зарегистрированный на Pre Email Create. Плагин проводит некие манипуляции со связанным с письмом обращением (regarding case). Один из шагов плагина - это обновление связанного обращения (service.Update). Но вот в чём проблема, на шаге апдейта получается рекурсия с другим real-time рабочим процессом, который падает в эксепшн, который в свою очередь не даёт корректно отработать самому плагину. Ниже текст самого эксепшена. Код: [Microsoft.Crm.ObjectModel: Microsoft.Crm.ObjectModel.SyncWorkflowExecutionPlugin][7133aad3-f70b-e411-80d9-0050568c1ffc: ] Starting sync workflow 'Простановка категории организации', Id: 6833aad3-f70b-e411-80d9-0050568c1ffc Entering UpdateStep1_step: Sync workflow 'Простановка категории организации' terminated with error 'Value cannot be null. Parameter name: culture' Код: regardingCase = service.Retrieve("incident", regardingCaseId, new ColumnSet(true)); regardingCase["dt_ustomerrating"] = userRating.ToString(); service.Update(regardingCase); Код: regardingCase = service.Retrieve("incident", regardingCaseId, new ColumnSet(new string[] { "dt_ustomerrating" })); Ну и на последок, если я отключаю конфликтный рабочий процесс, то плагин отрабатывает без ошибок и проблем. Ещё пробовал утилитой XrmToolBox понизить приоритет запуска проблемного р\п, но это тоже не помогло. Как лучше всего выйти из сложившейся ситуации и сделать так, чтобы р\п и плагин не мешали и не конфликтовали друг с другом? Заранее благодарю за помощь . |
|
15.07.2014, 14:02 | #2 |
Moderator
|
Добрый день. Я бы рекомендовал вам запрашивать и обновлять только те атрибуты, которые нужно. Во-первых, такое решение более производительно, во-вторых, оно не будет приводить к срабатыванию лишних плагинов и процессов (так как вы не обновите атрибуты, на которые они подписаны).
Исключение выкидывает не решение, а ваш код. Всегда проверяйте наличие атрибута в выборке, прежде чем к нему обратится. Ну или используйте безопасный метод GetAttributeValue. Если не ошибаюсь, он не выбрасывает исключений.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: magicandy (1). |
15.07.2014, 18:11 | #3 |
Участник
|
Артем, спасибо.
Цитата:
Я бы рекомендовал вам запрашивать и обновлять только те атрибуты, которые нужно.
Код: regardingCase = service.Retrieve("incident", regardingCaseId, new ColumnSet(new string[] { "dt_ustomerrating" })); Цитата:
Всегда проверяйте наличие атрибута в выборке, прежде чем к нему обратится.
Цитата:
Ну или используйте безопасный метод GetAttributeValue.
Ведь метод service.Update обновляет сущность. А GetAttributeValue возвращает значение атрибута. Поправьте меня, если я не прав. в service.Retrieve я получаю сущность, а потом её же обновляю. А как я обновлю сущность по GetAttributeValue? Возможно, простенький примерчик поставит меня на путь истины Ещё раз спасибо! |
|
15.07.2014, 18:46 | #4 |
Чайный пьяница
|
Если поле пустое (равно null) то атрибута в коллекции вы не найдёте. Именно поэтому надо или проверять наличие атрибута.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: magicandy (1). |
15.07.2014, 19:03 | #5 |
Moderator
|
Цитата:
Цитата:
Цитата:
X++: regardingCase = service.Retrieve("incident", regardingCaseId, new ColumnSet(new string[] { "dt_ustomerrating" })); ustomerrating = regardingCase["dt_ustomerrating"]; X++: regardingCase = service.Retrieve("incident", regardingCaseId, new ColumnSet(new string[] { "dt_ustomerrating" })); ustomerrating = regardingCase.GetAttributeValue<Type>("dt_ustomerrating"); X++: regardingCase.["someattribute"] = value; X++: regardingCase.SetAttributeValue("someattribute", value);
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.07.2014, 10:57 | #6 |
Участник
|
Коллеги, всем большое спасибо за рекомендации.
Всё получилось и работает. |
|
17.07.2014, 19:42 | #7 |
Участник
|
Коллеги, снова требуется помощь. Решил не создавать новую тему, так как вопрос касается того же плагина. Возникла необходимость получить имя отправителя письма (from). Плагин зарегистрирован на PreCreate. Получить пытаюсь так.
X++: var from = (EntityCollection)entity.Attributes["from"]; var fromEntity = from.Entities[0]; var fromName = ((EntityReference)fromEntity.Attributes["partyid"]).Name; |
|
17.07.2014, 19:53 | #8 |
Чайный пьяница
|
Попробуйте так :
X++: var partyid = fromEntity["partyid"] as EntityReference; var entity = service.Retrieve("account" "contact", partyid.Id, new ColumnSet("name" "fullname"); var fullName = entity.GetAttributeValue<string>("name" "fullname");
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
17.07.2014, 20:25 | #9 |
Участник
|
Чёрт возьми, работает!
Если не сложно, не подскажите почему мой вариант не давал результата, а ваш очень даже? Логика ведь та же. Я тоже пытался через service.Retrieve, но не те гуиды подставлял видимо. Большое спасибо. |
|
17.07.2014, 20:34 | #10 |
Чайный пьяница
|
Свойство Name заполняется только при Retrieve/RetrieveMuluple, но не при Create.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
17.07.2014, 20:59 | #11 |
Участник
|
Спасибо. Не совсем понятно правда, почему мой вариант возвращал Name при ручном сценарии создания письма .
И ещё один вопросик, который давно не даёт покоя. В чём разница между: X++: var fromName = entityz.GetAttributeValue<string>("name"); X++: var fromName = (string)entityz.Attributes["name"]; Какая конструкция наиболее предпочтительна, если речь идёт о разработке под ЦРМ2013? Специально опробовал сейчас оба варианта. И оба рабочие. |
|
17.07.2014, 21:17 | #12 |
Чайный пьяница
|
Почитайте это.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|