|
|
#1 |
|
Участник
|
Вчера решал следующую задачу: при изменении поля Сегмент (типа выпадающий список) в Интересе необходимо его, интерес, назначить пользователю с должностью Главный менеджер (пользователь с такой должностью в системе 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);Спасибо. |
|
|
|
|
#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). | |
|
|
#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. Спасибо, буду иметь в виду. Надеюсь, что кому-нибудь, когда-нибудь поможет рахобранный выше пример. |
|
|
|
|
#4 |
|
Участник
|
Попробовал использовать метод RetrieveMultiple объекта ICrmService.
На вход он просит QueryBase, который в свою очередь не содержит методов или свойств отбора, т.е. я не могу получить пользователей с определённой должностью! Или я плохо смотрю? |
|
|
|
|
#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). | |
|
|
#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 |
|
|
|
|
|