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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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).
Теги
c#, plugin, retrievemultiple

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Строка сервисного контракта: работает ли ограничение по срокам действия? Lazarus Dynamics CRM: Функционал 1 10.04.2009 08:04
Область по умолчанию deniska Dynamics CRM: Администрирование 1 25.03.2009 11:38
Как изменить печатную форму счета Talisman2005 Dynamics CRM: Разработка 8 09.07.2008 17:27
Завершенные действия koalex Dynamics CRM: Функционал 2 25.04.2008 10:52

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:19.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.