09.08.2011, 13:13 | #1 |
Участник
|
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 |
Чайный пьяница
|
Добрый день.
Код написан корректно, но есть несколько ньюансов на которые я не мог не обратить внимания: 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 |
Участник
|
Спасибо за ответы.
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 |
Участник
|
Попробовал использовать метод RetrieveMultiple объекта ICrmService.
На вход он просит QueryBase, который в свою очередь не содержит методов или свойств отбора, т.е. я не могу получить пользователей с определённой должностью! Или я плохо смотрю? |
|
09.08.2011, 20:02 | #5 |
Участник
|
Следуя советам поиск заменил на
Код: 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 |
Чайный пьяница
|
Не так - вы получите всё тот же нечитабельный текст
Код: 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 |
|
|
|