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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.08.2011, 13:13   #1  
ShadowXXX is offline
ShadowXXX
Участник
 
11 / 11 (1) +
Регистрация: 01.09.2006
? CRM 4.0. Плагин. Как получить пользователя по его Должности?
Вчера решал следующую задачу: при изменении поля Сегмент (типа выпадающий список) в Интересе необходимо его, интерес, назначить пользователю с должностью Главный менеджер (пользователь с такой должностью в системе 1, если их несколько, то берётся первый).

Написал плагин, который вызывается при изменении поля Сегмент.
Вот часть его кода:

Код:
        public void Execute(IPluginExecutionContext context)
        {
 
            if(!context.InputParameters.Properties.Contains("Target"))
                return;
            if (context.InputParameters.Properties["Target"] is DynamicEntity)
            {}
            else
                return;
 
            // Получаем сущность, для которой сработал плагин
            DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];
            // Проверяем, что бы сущность была Интересом или Возможной сделкой
            if ((entity.Name != EntityName.lead.ToString()) && (entity.Name != EntityName.opportunity.ToString()))
                return;
            Picklist Anketa = (Picklist)entity.Properties["new_segment"];
            Key leadID = (Key)entity.Properties["leadid"];
            ICrmService CrmService = context.CreateCrmService(true);
            IMetadataService CrmMetadata = context.CreateMetadataService(true);
            ConditionExpression CD = new ConditionExpression();
            CD.AttributeName = "title";
            CD.Operator = ConditionOperator.Equal;
            CD.Values = new string[] { "Главный менеджер" };
            FilterExpression FE = new FilterExpression();
            FE.FilterOperator = LogicalOperator.And;
            FE.Conditions.Add(CD);// = new ConditionExpression[] {CD};
            QueryExpression query = new QueryExpression("systemuser");
            query.ColumnSet = new AllColumns();
            query.Criteria = FE;
            RetrieveMultipleRequest RMReq = new RetrieveMultipleRequest();
            RMReq.Query = query;
            RMReq.ReturnDynamicEntities = true;
            RetrieveMultipleResponse RMRes = (RetrieveMultipleResponse)CrmService.Execute(RMReq);
            string FN="";
            foreach (DynamicEntity BEC in RMRes.BusinessEntityCollection.BusinessEntities)
            {
                FN += (BEC.Name +"="+BEC.Properties["fullname"]+ "\n");
            }
            throw new InvalidPluginExecutionException(FN);
Собственно вопросы: корректно ли осуществляю поиск пользователя? Каким ещё способом можно было решить задачу поиска? Какие методы произвольного поиска по сущностям можно использовать в плагинах?

Спасибо.
Старый 09.08.2011, 14:00   #2  
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
Добрый день.

Код написан корректно, но есть несколько ньюансов на которые я не мог не обратить внимания:
1. Зачем создаётся метадатасервис?
2. Зачем использовать везде Properties - и без них индексатор нормально работает.
3. Зачем при получении стандартной сущности использовать RetrieveMultipleRequest и работать с динамическими сущностями? RetrieveMultiple метод ICrmService прекрассно отработает.
4. Зачем без сложного выражения для поиска использовать QueryExpression - в данном случае QueryByAttribute был бы выгоднее.
5. Зачем для получения одного аттрибута передаёте AllColumns? ColumnSet с нужным полем - то что надо для этого случая.
6. При каждом вызове вебсервиса стоит обрабатывать SoapException - а то в случае возникновения исключения на клиенте получите нерепрезентабельное сообщение Server Was Unable To Process Request... я для такого случая использую следующий код:

Код:
try
{
//вызов сервиса
}
catch(SoapException e)
{
throw new InvalidPluginException(e.Detail.InnerText);
}
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: ShadowXXX (1).
Старый 09.08.2011, 19:10   #3  
ShadowXXX is offline
ShadowXXX
Участник
 
11 / 11 (1) +
Регистрация: 01.09.2006
Спасибо за ответы.

1. В финальной версии не будет. Использовался мной в процессе изучения.
2. Т.е. можно писать:

DynamicEntity entity = (DynamicEntity)context.InputParameters["Target"];
...
Picklist Anketa = (Picklist)entity["new_segment"];

3. В чём отличие RetrieveMultipleRequest от RetrieveMultiple? Я так понял динамические сущности это когда используется CrmService myService = new CrmService()?!

4. Если бы знать что использовать, поэтому и спросил тут что правильно, а что можно сделать ещё правильнее! Про QueryByAttribute буду иметь в виду.

5. В бета версии лень было инициализировать ColumnSet, для указания нужной мне колонки. В релизе конечно же будет с ColumnSet, т.к. зачем лишний раз нагружать сервер и клиента по сути ненужными данными.

6. Спасибо, буду иметь в виду.

Надеюсь, что кому-нибудь, когда-нибудь поможет рахобранный выше пример.
Старый 09.08.2011, 19:25   #4  
ShadowXXX is offline
ShadowXXX
Участник
 
11 / 11 (1) +
Регистрация: 01.09.2006
Попробовал использовать метод RetrieveMultiple объекта ICrmService.
На вход он просит QueryBase, который в свою очередь не содержит методов или свойств отбора, т.е. я не могу получить пользователей с определённой должностью!
Или я плохо смотрю?
Старый 09.08.2011, 20:02   #5  
ShadowXXX is offline
ShadowXXX
Участник
 
11 / 11 (1) +
Регистрация: 01.09.2006
Следуя советам поиск заменил на

Код:
QueryByAttribute QBY = newQueryByAttribute();
QBY.EntityName = "systemuser";
QBY.ColumnSet = newColumnSet(newstring[] { "systemuserid","fullname" });
QBY.Attributes = newstring[] { "title" };
QBY.Values = newstring[] { " call-" };
BusinessEntityCollection BEC = null;
try
{
BEC = CrmService.RetrieveMultiple(QBY);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
thrownewInvalidPluginExecutionException(" (plug-in Opps_price): " + ex.Message.ToString());
}
string FN="";
foreach (systemuser tDE in BEC.BusinessEntities)
{
FN += (tDE.systemuserid + "=" + tDE.fullname + "\n");
}
thrownewInvalidPluginExecutionException(FN);
За это сообщение автора поблагодарили: a33ik (1).
Старый 09.08.2011, 21:41   #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
Не так - вы получите всё тот же нечитабельный текст

Код:
try
{
BEC = CrmService.RetrieveMultiple(QBY);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
throw new InvalidPluginExecutionException(" (plug-in Opps_price): " + ex.Message.ToString());
}
Стоит так:

Код:
try
{
BEC = CrmService.RetrieveMultiple(QBY);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
throw new InvalidPluginExecutionException(" (plug-in Opps_price): " + ex.Detail.InnerText);
}
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
CRM DE LA CREME! CRM 4.0 Disaster Recovery Blog bot Dynamics CRM: Blogs 2 26.02.2016 08:23
Microsoft Dynamics CRM Team Blog: Microsoft Dynamics CRM 2011 ~ Online Test Drive Guide Blog bot Dynamics CRM: Blogs 0 05.08.2011 20:13
Все о Microsoft Dynamics CRM: Как установить Microsoft Dynamics CRM 2011 Beta Blog bot Dynamics CRM: Blogs 0 31.10.2010 15:08
CRM DE LA CREME! Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment Blog bot Dynamics CRM: Blogs 0 18.08.2009 11:05
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0 Deployment Scenarios Blog bot Dynamics CRM: Blogs 0 30.01.2009 22:05

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:43.