Показать сообщение отдельно
Старый 27.04.2009, 15:56   #6  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Lightbulb Дошли руки - проверил, написал, работает
Итак. Решение таково:
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 выполнения.

Собственно всё.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: mistah (1).