21.02.2012, 09:18 | #1 |
Участник
|
Ошибка с таблицей EmailSearchBase при работе плагина на создание Account
Ошибка возникает из-за плагина, в отсутствие плагина все работает замечательно.
Пробовал получать Account из контекста, пробовал делать Post Image, результат одинаковый. С самим полем Email плагин не работает, проставляет совершенно другие поля и значения. Если быть более точным он проставляет ссылки на сущности двух пользователей и после этого обновляет организацию. Условно код такой: X++: Entity account = (Entity)context.InputParameters["Target"]; account["ars_leadaccountant"] = new EntityReference(leadAccountant.LogicalName, leadAccountant.Id); account["ars_officemanager"] = new EntityReference("systemuser", context.UserId); m_service.Update(account); Судя по всему он пытается обновить и таблицу EmailSearch, но Email я даже не трогаю. Сам CRM выдает ошибку Generic SQL Error, Plugin никаких ошибок не выдает. В Trace SQL Server Profiler получил следующее: Error: 2601, Severity: 14, State: 1 Не удается вставить повторяющуюся строку ключа в объект "dbo.EmailSearchBase" с уникальным индексом "ndx_for_forward_update". Повторяющееся значение ключа: (5b5a0ec3-495c-e111-801c-0022648a6e48, 35). Выполнение данной инструкции было прервано. Что нужно сделать по другому чтобы этой ошибки не было? |
|
21.02.2012, 09:29 | #2 |
Участник
|
Попробуйте перезапросить account с минимальным набором полей.
Что-то вроде: X++: Entity account = (Entity)context.InputParameters["Target"]; Entity acc_for_update = m_service.Retrieve("account", (Guid)account["accountid"], new ColumnSet("accountid")); acc_for_update["ars_leadaccountant"] = new EntityReference(leadAccountant.LogicalName, leadAccountant.Id); acc_for_update["ars_officemanager"] = new EntityReference("systemuser", context.UserId); m_service.Update(acc_for_update); |
|
21.02.2012, 10:30 | #3 |
Участник
|
Да, такой вариант работает.
Вопрос в том, грамотно ли это делать доп запрос (а по сути получается 2), т.к. дальше идет функционал которому необходимы все поля? Нагрузки конечно с них на данном этапе практически нет и выполняются они мигом. |
|
22.02.2012, 14:47 | #4 |
Участник
|
Подозреваю, что неверно изменять Target. Надо попытаться заполнить Target на событии Pre. Если Вы его заполните, то Вам не нужен веб-сервис. Объект targer на протяжении всего процесса один и тот же.
Если Вы измените его на шаге pre, то изменения попаду в CRM. думаю что именно из-за попытки изменения target таким способом у Вас ошибка. |
|
22.02.2012, 15:06 | #5 |
Участник
|
Цитата:
Лучше сделать вот так: X++: Entity account = (Entity)context.InputParameters["Target"]; Entity acc_for_update = new Entity(); acc_for_update.LogicalName = "account"; acc_for_update.Id = (Guid)account["accountid"]; acc_for_update["ars_leadaccountant"] = new EntityReference(leadAccountant.LogicalName, leadAccountant.Id); acc_for_update["ars_officemanager"] = new EntityReference("systemuser", context.UserId); m_service.Update(acc_for_update); |
|
|
За это сообщение автора поблагодарили: a33ik (1), KP0H (1). |
22.02.2012, 15:10 | #6 |
Участник
|
Цитата:
Сообщение от g.Naukovych
Подозреваю, что неверно изменять Target. Надо попытаться заполнить Target на событии Pre. Если Вы его заполните, то Вам не нужен веб-сервис. Объект targer на протяжении всего процесса один и тот же.
Если Вы измените его на шаге pre, то изменения попаду в CRM. думаю что именно из-за попытки изменения target таким способом у Вас ошибка. |
|
24.02.2012, 10:44 | #7 |
Участник
|
Спасибо. Я всегда ставлю)
|
|
27.02.2012, 15:25 | #8 |
Участник
|
У меня острый когнитивный диссонанс, но проблема возникла снова.
Предложенное решение не спасает. |
|
27.02.2012, 22:20 | #9 |
Участник
|
Тогда такие варианты:
- все-таки проверить, что обновляемая сущность не содержит лишних полей, и что на обновление этого поля не висит этот же самый или другой плагин, который вызывает ошибку - посмотреть профайлером SQL, что за запрос вызывает ошибку - попробовать сделать плагин асинхронным (не знаю почему, но пишут, что может помочь) По результатам поиска в гугл по слову "ndx_for_forward_update" есть два поста с форума MS: - в одном советуют тоже самое, что и я: http://social.microsoft.com/Forums/e...6-b2b0644018a7 - в другом советуют смотреть профайлер: http://social.microsoft.com/Forums/z...7-e5e05950724d |
|