27.04.2009, 15:56 | #6 |
Чайный пьяница
|
Дошли руки - проверил, написал, работает
Итак. Решение таково:
1. Пишется плагин на RetreiveMultiple сущности activitypointer задача которого - перехватить Query, который отправляется серверу для получения данных, изменить её, отдать серверу. 2. Задеплоить на сервер. 3. Пользоваться. Код плагина: Код: using System; using System.Collections.Generic; using System.Text; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Win32; namespace TestPlugin { public class ExecuteHandler : IPlugin { public ExecuteHandler(string config, string secureConfig) { } #region IPlugin Members public void Execute(IPluginExecutionContext context) { if (context.PrimaryEntityName == EntityName.activitypointer.ToString() && context.InputParameters.Contains("Query")) { Microsoft.Crm.Sdk.Query.QueryExpression query = (Microsoft.Crm.Sdk.Query.QueryExpression)context.InputParameters["Query"]; if (query.LinkEntities.Count == 1)//делается для проверки, что есть фильтр по связанности { Microsoft.Crm.Sdk.Query.LinkEntity link = (Microsoft.Crm.Sdk.Query.LinkEntity)query.LinkEntities[0]; if (link.LinkFromAttributeName == "activityid" && link.LinkFromEntityName == "activitypointer" && link.LinkToAttributeName == "activityid" && link.LinkToEntityName == "activityparty")//проверка на то, что связка идёт в поле regarding { Microsoft.Crm.Sdk.Query.ConditionExpression expr = (Microsoft.Crm.Sdk.Query.ConditionExpression)link.LinkCriteria.Conditions[0]; if (expr.AttributeName == "partyid" && expr.Operator == Microsoft.Crm.Sdk.Query.ConditionOperator.Equal) { Guid relatedEntityId = (Guid)expr.Values[0];//получаю идентификатор связанной записи CrmService crmService = GetCrmService(context.OrganizationName);//потребуется для проверки то, что связанная сущность - компания - чтобы остальные цепочки такого рода не порезало try { crmService.Retrieve(EntityName.account.ToString(), relatedEntityId, new Microsoft.Crm.Sdk.Query.AllColumns());//еслит связанная сущность - действительно компания - всё пройдёт нормально, если нет - будет экзепшен и изменение фильтра не произойдёт query.Criteria.Filters.RemoveAt(0); } catch { } } } } } } #endregion private CrmService GetCrmService(string OrgName) { CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = AuthenticationType.AD; token.OrganizationName = OrgName; CrmService crmService = new CrmService(); crmService.UseDefaultCredentials = true; crmService.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx"; crmService.CrmAuthenticationTokenValue = token; return crmService; } } } Собственно всё.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: mistah (1). |