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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.02.2012, 09:18   #1  
KP0H is offline
KP0H
Участник
 
41 / 11 (1) +
Регистрация: 11.08.2011
Адрес: Тюмень
Ошибка с таблицей 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);
Ошибка возникает при попытке сохранить (m_service.Update).

Судя по всему он пытается обновить и таблицу 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  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
Попробуйте перезапросить 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  
KP0H is offline
KP0H
Участник
 
41 / 11 (1) +
Регистрация: 11.08.2011
Адрес: Тюмень
Да, такой вариант работает.
Вопрос в том, грамотно ли это делать доп запрос (а по сути получается 2), т.к. дальше идет функционал которому необходимы все поля?
Нагрузки конечно с них на данном этапе практически нет и выполняются они мигом.
Старый 22.02.2012, 14:47   #4  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Подозреваю, что неверно изменять Target. Надо попытаться заполнить Target на событии Pre. Если Вы его заполните, то Вам не нужен веб-сервис. Объект targer на протяжении всего процесса один и тот же.
Если Вы измените его на шаге pre, то изменения попаду в CRM. думаю что именно из-за попытки изменения target таким способом у Вас ошибка.
Старый 22.02.2012, 15:10   #5  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
Подозреваю, что неверно изменять Target. Надо попытаться заполнить Target на событии Pre. Если Вы его заполните, то Вам не нужен веб-сервис. Объект targer на протяжении всего процесса один и тот же.
Если Вы измените его на шаге pre, то изменения попаду в CRM. думаю что именно из-за попытки изменения target таким способом у Вас ошибка.
Да, по возможности лучше менять target на этапе Pre. Но не всегда это возможно, тогда можно обновлять его и потом (по сути вызывается веб-сервис для обновления записи с указанным типом, guid и набором полей), но только при этом важно, чтобы обновлялись только те поля, которые изменились. И не забывать о том, что плагин может зациклиться.
Старый 24.02.2012, 10:44   #6  
KP0H is offline
KP0H
Участник
 
41 / 11 (1) +
Регистрация: 11.08.2011
Адрес: Тюмень
Спасибо. Я всегда ставлю)
Старый 22.02.2012, 15:06   #7  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
Цитата:
Сообщение от KP0H Посмотреть сообщение
Да, такой вариант работает.
Вопрос в том, грамотно ли это делать доп запрос (а по сути получается 2), т.к. дальше идет функционал которому необходимы все поля?
Нагрузки конечно с них на данном этапе практически нет и выполняются они мигом.
Да, не совсем грамотно, я немного поспешил с ответом.

Лучше сделать вот так:
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).
Старый 27.02.2012, 15:25   #8  
KP0H is offline
KP0H
Участник
 
41 / 11 (1) +
Регистрация: 11.08.2011
Адрес: Тюмень
У меня острый когнитивный диссонанс, но проблема возникла снова.
Предложенное решение не спасает.
Старый 27.02.2012, 22:20   #9  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
Тогда такие варианты:
- все-таки проверить, что обновляемая сущность не содержит лишних полей, и что на обновление этого поля не висит этот же самый или другой плагин, который вызывает ошибку
- посмотреть профайлером SQL, что за запрос вызывает ошибку
- попробовать сделать плагин асинхронным (не знаю почему, но пишут, что может помочь)

По результатам поиска в гугл по слову "ndx_for_forward_update" есть два поста с форума MS:
- в одном советуют тоже самое, что и я: http://social.microsoft.com/Forums/e...6-b2b0644018a7
- в другом советуют смотреть профайлер: http://social.microsoft.com/Forums/z...7-e5e05950724d
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка при работе отчетов Elka Dynamics CRM: Администрирование 14 03.02.2011 09:59
Ошибка при создании плагина SergGrey Dynamics CRM: Разработка 1 26.05.2010 11:47
Ошибка при создание "Возможной сделки" Alpen Dynamics CRM: Администрирование 12 14.11.2009 13:41
Создание экземпляра кастомной сущности из плагина Roman08 Dynamics CRM: Разработка 14 31.08.2009 21:34
Создание и регистрация плагина на Execute и Retreive a33ik Dynamics CRM: Разработка 7 30.11.2008 15:03

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

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

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