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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.04.2014, 12:58   #1  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Подсчёт записей
Добрый день!

В опросе есть токены и ниже есть поля (показано на картинке), нужно сосчитать сколько всего токенов, сколько стартовавших и сколько финишировало. Нужно сделать именно плагин, вот этот код поставил на 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)
        {
        }
    }
}
Но в итоге вот такая хрень если к примеру меняю название опроса. Может есть другие варианты (но нужен именно плагин).
Миниатюры
Нажмите на изображение для увеличения
Название: surv.jpg
Просмотров: 362
Размер:	41.7 Кб
ID:	8832  
Вложения
Тип файла: txt ErrorDetails.txt (4.7 Кб, 398 просмотров)
Старый 22.04.2014, 14:53   #2  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
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).
Старый 22.04.2014, 15:55   #3  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от 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);
Вроде как и мысль понял, но если убрать Entity survey = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet(true)); и использовать вот этот следующий код, то та же проблема.
Старый 22.04.2014, 20:13   #4  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
Вы не поняли.
В первом пунке описано почему ошибка: потому что у Вас зациклен плагин.

А во втором просто замечание по коду.

Теперь, чтобы не было повторного вызова кода плагина можно добавить в начале плагина проверку

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);
            }

}
Старый 23.04.2014, 17:02   #5  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Спасибо, помогло, разобрался. Теперь другая трабла, хочу чтобы при удалении токена, обновлялось поле в опросе (тоесть если удалю то на 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);
                }
            }
Вложения
Тип файла: txt ErrorDetails.txt (1.6 Кб, 380 просмотров)

Последний раз редактировалось Lavdislav; 23.04.2014 в 17:24. Причина: Прикрепил ошибку
Старый 23.04.2014, 17:18   #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
А может ещё ошибку сюда прикрепите?

Но моя гипотеза в следующем - при удалении записи в Target приходит не Entity а EntityReference. Для получения значения поля из лукапа рекомендую использовать Pre-Image удаляемой записи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подсчет количества записей , требуется подсказка filo Dynamics CRM: Разработка 2 19.06.2013 10:39
Ошибка массовой загрузки связанных записей Артем Enot Грунин Dynamics CRM: Функционал 0 08.11.2012 09:31
axforum blogs: Параметр TotalRecordCount и проблемы производительности. Как отключить подсчет количества записей в представлении Blog bot Dynamics CRM: Blogs 0 13.06.2012 22:11
Подсчет всех записей со всех страниц lin2nil Dynamics CRM: Функционал 21 08.12.2011 11:02
Фильтр для отчета - из списка связанных записей? AlekseyS Dynamics CRM: Разработка 3 11.09.2008 10:54

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

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

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