13.03.2009, 12:56 | #1 |
Участник
|
Ошибка в плагине при создании связей N:N
Добрый день.
Возникла задача при создании Предложения из Возможной сделки связать все контакты из Возможной сделки с Предложением. Делаю следующее: - Создаю плагин и вешаю его на post create предложения. Выполняется в child pipeline. - В плагине создаю свой CrmServer. - Извлекаю все контакты связанные с возможной сделкой. - Пытаюсь связать их с помощью AssociateEntitiesRequest с предложением. При этом появляется ошибка: Server was unable to process request. В логах нашел следующее сообщение: Exception when executing query: select quote0.QuoteId as 'quoteid', quote .OwningBusinessUnit as 'owningbusinessunit', quote0.OwningUser as 'owninguser' from Quote as quote0 where (quote0.QuoteId = '6f0b783a-240f-de11-a822-00155d001f15' and quote0.DeletionStateCode = 0) Exception: System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. Т.е. выходит что записи создаваемого предложения заблокированы, и он не может его связать с какими-либо сущностями. Может кто-нибудь сталкивался с чем-то подобным? Задача то вроде бы типовая... Вариант вызывать плагин асинхронно не подходит, т.к. связываемые с предложением контакты должны тут же отображаться на открытой карточке. Можно конечно это проделать в отдельном веб-сервисе, но хотелось бы конечно сделать по-нормальному в плагине. PS: - Код создающий CrmService: Код: private CrmService CreateCrmService(IPluginExecutionContext context, Boolean flag) { CrmAuthenticationToken authToken = new CrmAuthenticationToken(); authToken.AuthenticationType = 0; authToken.OrganizationName = context.OrganizationName; // Include support for impersonation. if (flag) authToken.CallerId = context.UserId; else authToken.CallerId = context.InitiatingUserId; CrmService service = new CrmService(); service.CrmAuthenticationTokenValue = authToken; service.UseDefaultCredentials = true; // Include support for infinite loop detection. CorrelationToken corToken = new CorrelationToken(); corToken.CorrelationId = context.CorrelationId; corToken.CorrelationUpdatedTime = context.CorrelationUpdatedTime; corToken.Depth = context.Depth; RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM"); service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/crmservice.asmx"); service.CorrelationTokenValue = corToken; return service; } Код: Moniker moniker1 = new Moniker(); moniker1.Name = entityName1; moniker1.Id = entityID1; Moniker moniker2 = new Moniker(); moniker2.Name = entityName2; moniker2.Id = entityID2; AssociateEntitiesRequest request = new AssociateEntitiesRequest(); request.Moniker1 = moniker1; request.Moniker2 = moniker2; request.RelationshipName = relationshipName; crmService.Execute(request); // здесь после 30 сек. ожидания происходит ошибка |
|
13.03.2009, 13:43 | #2 |
Участник
|
Цитата:
Пытаюсь связать их с помощью AssociateEntitiesRequest с предложением.
У вас есть id нового предложения и id возможной сделки, из которой предложение создается. По id возможной сделки получаете все id контактов, связанных с ней. А потом в цикле этим контактам проставляется в quioteid id-ик нового предложения и делаете Update. В итоге плагин свяжет эти контакты с новым предложением. |
|
13.03.2009, 15:56 | #3 |
Участник
|
Так сделать не получится, т.к. один контакт м.б. связан с несколькими предложениями. Там используется именно связь N:N.
|
|
14.03.2009, 10:21 | #4 |
Moderator
|
Можно попробовать увеличить время ожидания на SQL Server, конечно... Не совсем понятно о чем идет речь. У вас настроена связь между Контактами и Возможной сделкой, и Контактами и Предложением?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
18.03.2009, 20:19 | #5 |
Участник
|
Увеличение время ожидания не поможет. Если уж sql заблокировал записи, то заблокировал.
В итоге сделал так: повесил на OnLoad скрипт, который дергает метод мной написанного веб-сервиса, в котором и выполняю нужные мне действия, а после делаю reload формы. |
|