|
|
|
|
#1 |
|
Участник
|
Подсчёт записей
Добрый день!
В опросе есть токены и ниже есть поля (показано на картинке), нужно сосчитать сколько всего токенов, сколько стартовавших и сколько финишировало. Нужно сделать именно плагин, вот этот код поставил на post-operation, но ошибка (прикрепил лог): Код: using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Bum.Survey.CRM.Plugin.BaseLib;
using Microsoft.Xrm.Sdk.Query;
namespace Bum.Survey.CRM.Plugin
{
public class SurveyAIU : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
var process = new SurveyAIUProcess(serviceProvider);
process.LoadEntity();
if (!process.ValidateEntityName("bf_survey")) return;
if (!process.ValidateMessage(MessageName.Create, MessageName.Update)) return;
process.Run();
}
}
class SurveyAIUProcess : bf_PluginProcess
{
public override void Execute()
{
Entity survey = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet(true));
QueryExpression token = new QueryExpression()
{
EntityName = "bf_surveytoken",
ColumnSet = new ColumnSet(true)
};
token.Criteria.AddCondition("bf_surveytoken_survey", ConditionOperator.Equal, TargetKey.Id);
List<Entity> surveyTokens = crmService.RetrieveMultiple(token).Entities.ToList();
if (surveyTokens.Count > 0)
{
survey["bf_survey_tkcnt"] = surveyTokens.Count.ToString();
crmService.Update(survey);
}
}
public SurveyAIUProcess(IServiceProvider serviceProvider)
: base(serviceProvider)
{
}
}
} |
|
|
|
|
#2 |
|
Участник
|
1. Вот этот вот апдейт crmService.Update(survey); вызывает Ваш плагин снова и снова. Что получается? Бесконечный цикл. Но СРМ умный и останавливает это после 8-го раза.
Для того чтобы это не случалось нужно либо делать это в пре-плагине. Или добавлять как-то флаг, который бы говорил нужно ли делать апдейт или нет. 2. Вместо вот этого: Entity survey = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet(true)); Используйте пост-имедж. Хотя в Вашем коде и этого не нужно. Для апдета достаточно следующего кода: Entity survey = new Entity(TargetEntity.LogicalName); survey.Id = TargetEntity.Id; survey["bf_survey_tkcnt"] = surveyTokens.Count.ToString(); crmService.Update(survey); |
|
|
|
| За это сообщение автора поблагодарили: Lavdislav (1). | |
|
|
#3 |
|
Участник
|
Цитата:
Сообщение от Ksani
1. Вот этот вот апдейт crmService.Update(survey); вызывает Ваш плагин снова и снова. Что получается? Бесконечный цикл. Но СРМ умный и останавливает это после 8-го раза.
Для того чтобы это не случалось нужно либо делать это в пре-плагине. Или добавлять как-то флаг, который бы говорил нужно ли делать апдейт или нет. 2. Вместо вот этого: Entity survey = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet(true)); Используйте пост-имедж. Хотя в Вашем коде и этого не нужно. Для апдета достаточно следующего кода: Entity survey = new Entity(TargetEntity.LogicalName); survey.Id = TargetEntity.Id; survey["bf_survey_tkcnt"] = surveyTokens.Count.ToString(); crmService.Update(survey);
|
|
|
|
|
#4 |
|
Участник
|
Вы не поняли.
В первом пунке описано почему ошибка: потому что у Вас зациклен плагин. А во втором просто замечание по коду. Теперь, чтобы не было повторного вызова кода плагина можно добавить в начале плагина проверку X++: if(!TargetEntity.Contains("bf_survey_tkcnt")) { QueryExpression token = new QueryExpression() { EntityName = "bf_surveytoken", ColumnSet = new ColumnSet(true) }; token.Criteria.AddCondition("bf_surveytoken_survey", ConditionOperator.Equal, TargetKey.Id); List<Entity> surveyTokens = crmService.RetrieveMultiple(token).Entities.ToList(); if (surveyTokens.Count > 0) { Entity survey = new Entity(TargetEntity.LogicalName); survey.Id = TargetEntity.Id; survey["bf_survey_tkcnt"] = surveyTokens.Count.ToString(); crmService.Update(survey); } } |
|
|
|
|
#5 |
|
Участник
|
Спасибо, помогло, разобрался. Теперь другая трабла, хочу чтобы при удалении токена, обновлялось поле в опросе (тоесть если удалю то на 1 меньше), но вот кидает ошибку (лог прикрепляю). Код вот:
Код: if (executionContext.MessageName == MessageName.Delete)
{
QueryExpression surveyz = new QueryExpression()
{
EntityName = "bf_survey",
ColumnSet = new ColumnSet(true)
};
surveyz.Criteria.AddCondition("bf_surveyid", ConditionOperator.Equal, TargetEntity.GetAttributeValue<EntityReference>("bf_surveytoken_survey").Id);
List<Entity> surveylists = crmService.RetrieveMultiple(surveyz).Entities.ToList();
foreach (var surveylist in surveylists)
{
QueryExpression token = new QueryExpression()
{
EntityName = "bf_surveytoken",
ColumnSet = new ColumnSet(true)
};
token.Criteria.AddCondition("bf_surveytoken_survey", ConditionOperator.Equal, surveylist.Id);
List<Entity> surveyTokens = crmService.RetrieveMultiple(token).Entities.ToList();
surveylist["bf_survey_tkcnt"] = surveyTokens.Count - 1;
crmService.Update(surveylist);
}
}Последний раз редактировалось Lavdislav; 23.04.2014 в 17:24. Причина: Прикрепил ошибку |
|
|
|
|
#6 |
|
Чайный пьяница
|
А может ещё ошибку сюда прикрепите?
Но моя гипотеза в следующем - при удалении записи в Target приходит не Entity а EntityReference. Для получения значения поля из лукапа рекомендую использовать Pre-Image удаляемой записи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|