Итак. Решение таково:
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;
}
}
}
Регистрация плагина - Выполняется регистрация сборки, регистрация шага с указанием сообщения RetreiveMultiple и Pre Stage выполнения.
Собственно всё.