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 Кб, 399 просмотров)
Старый 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
Старый 23.04.2014, 17:24   #7  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
А может ещё ошибку сюда прикрепите?

Но моя гипотеза в следующем - при удалении записи в Target приходит не Entity а EntityReference. Для получения значения поля из лукапа рекомендую использовать Pre-Image удаляемой записи.
Извиняюсь, прикрепил ошибку в предыдущем посте.
Старый 23.04.2014, 17:36   #8  
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
Цитата:
Сообщение от Lavdislav Посмотреть сообщение
Извиняюсь, прикрепил ошибку в предыдущем посте.
Скорее всего я прав. Полный код плагина предоставьте, пожалуйста.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 23.04.2014, 17:39   #9  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Скорее всего я прав. Полный код плагина предоставьте, пожалуйста.
X++:
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;
using Microsoft.Xrm.Sdk.Messages;

namespace Bum.Survey.CRM.Plugin
{
    public class SurveyTokenAIU : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var process = new SurveyTokenAIUProcess(serviceProvider);
            process.LoadEntity();
            if (!process.ValidateEntityName("bf_surveytoken")) return;
            if (!process.ValidateMessage(MessageName.Create, MessageName.Update, MessageName.Delete)) return;
            process.Run();
        }
    }

    class SurveyTokenAIUProcess : bf_PluginProcess
    {
        public override void Execute()
        {
            if (TargetEntity.Contains("regardingobjectid"))
            {
                Entity record = new Entity();

                Entity EntityName = (Entity)executionContext.InputParameters["Target"];

                if (EntityName.Attributes.Contains("subject"))
                    EntityName.Attributes["subject"] = EntityName.GetAttributeValue<EntityReference>("regardingobjectid").Name;
                if (executionContext.MessageName == MessageName.Update)
                {
                    crmService.Update(EntityName);
                }

                if (executionContext.MessageName == MessageName.Update)
                {
                    record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid"));
                }
                else
                {
                    record = TargetEntity;
                }

                string uniq = "";

                int uniqLength = 1024;

                if (record.Contains("regardingobjectid"))
                {
                    uniq = record.GetAttributeValue<EntityReference>("regardingobjectid").Name;

                    RetrieveEntityRequest rerq = new RetrieveEntityRequest
                    {
                        LogicalName = record.GetAttributeValue<EntityReference>("regardingobjectid").LogicalName,
                        RetrieveAsIfPublished = true
                    };

                    RetrieveEntityResponse rers = (RetrieveEntityResponse)crmService.Execute(rerq);

                    uniq = rers.EntityMetadata.DisplayName.UserLocalizedLabel.Label + " " + "[" + uniq + "]";
                }

                if (!record.Contains("subject") || record["subject"].ToString() != uniq)
                {
                    uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq);
                    record["subject"] = uniq;
                    if (executionContext.MessageName == MessageName.Update)
                    {
                        crmService.Update(record);
                    }
                }
            }

            if (executionContext.MessageName == MessageName.Create)
            {
                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();

                    QueryExpression tokenstart = new QueryExpression()
                    {
                        EntityName = "bf_surveytoken",
                        ColumnSet = new ColumnSet(true)
                    };

                    tokenstart.Criteria.AddCondition("bf_surveytoken_survey", ConditionOperator.Equal, surveylist.Id);
                    tokenstart.Criteria.AddCondition("bf_surveytoken_sts", ConditionOperator.Equal, 100000001);

                    List<Entity> surveyStartTokens = crmService.RetrieveMultiple(tokenstart).Entities.ToList();

                    QueryExpression tokenfinish = new QueryExpression()
                    {
                        EntityName = "bf_surveytoken",
                        ColumnSet = new ColumnSet(true)
                    };

                    tokenfinish.Criteria.AddCondition("bf_surveytoken_survey", ConditionOperator.Equal, surveylist.Id);
                    tokenfinish.Criteria.AddCondition("bf_surveytoken_sts", ConditionOperator.Equal, 100000002);

                    List<Entity> surveyFinishTokens = crmService.RetrieveMultiple(tokenfinish).Entities.ToList();

                    surveylist["bf_survey_tkfin"] = surveyStartTokens.Count;

                    surveylist["bf_survey_tkstart"] = surveyStartTokens.Count;

                    surveylist["bf_survey_tkcnt"] = surveyTokens.Count + 1;

                    crmService.Update(surveylist);
                }
            }

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

        public SurveyTokenAIUProcess(IServiceProvider serviceProvider)
            : base(serviceProvider)
        {
        }
    }
}
Старый 23.04.2014, 17:43   #10  
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
А код bf_PluginProcess? В конструкторе ведь наверняка TargetEntity заполяете...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 23.04.2014, 17:46   #11  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
А код bf_PluginProcess? В конструкторе ведь наверняка TargetEntity заполяете...
X++:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace Bum.Survey.CRM.Plugin.BaseLib
{
    public static class MessageName
    {
        public const string Create = "Create";
        public const string Update = "Update";
        public const string Delete = "Delete";
        public const string RetrieveMultiple = "RetrieveMultiple";
        public const string Retrieve = "Retrieve";
    }

    public static class ParameterName
    {
        public const string Target = "Target";
        public const string id = "id";
        public const string Query = "Query";
        public const string BusinessEntityCollection = "BusinessEntityCollection";
        public const string BusinessEntity = "BusinessEntity";
    }

    public class bf_PluginError : Exception
    {
        public bf_PluginError(string message)
            : base(message)
        {
        }
    }

    public abstract class bf_PluginProcess
    {
        IServiceProvider _serviceProvider;
        public IServiceProvider serviceProvider
        {
            get { return _serviceProvider; }
        }

        IPluginExecutionContext _executionContext;
        public IPluginExecutionContext executionContext
        {
            get
            {
                if (_executionContext == null)
                    _executionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                return _executionContext;
            }
        }

        IOrganizationServiceFactory _serviceFactory;
        public IOrganizationServiceFactory serviceFactory
        {
            get
            {
                if (_serviceFactory == null)
                    _serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                return _serviceFactory;
            }
        }

        IOrganizationService _crmService;
        public IOrganizationService crmService
        {
            get
            {
                if (_crmService == null)
                    _crmService = serviceFactory.CreateOrganizationService(executionContext.UserId);
                return _crmService;
            }
        }

        ITracingService _tracingService;
        public ITracingService tracingService
        {
            get
            {
                if (_tracingService == null)
                    _tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                return _tracingService;
            }
        }

        public bf_PluginProcess(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        Entity _entity;
        public Entity TargetEntity
        {
            get
            {
                return _entity;
            }
        }

        EntityReference _entity_key;
        public EntityReference TargetKey
        {
            get { return _entity_key; }
        }

        public void LoadEntity()
        {
            if (executionContext.InputParameters.Contains(ParameterName.Target))
            {
                if (executionContext.InputParameters[ParameterName.Target] is Entity)
                {
                    _entity = (Entity)executionContext.InputParameters[ParameterName.Target];
                    _entity_key = new EntityReference(_entity.LogicalName, _entity.Id);
                }
                else if (executionContext.InputParameters[ParameterName.Target] is EntityReference)
                {
                    _entity_key = (EntityReference)executionContext.InputParameters[ParameterName.Target];
                }
            }
            if (executionContext.MessageName == MessageName.Create)
            {
                if (executionContext.OutputParameters.Contains(ParameterName.id))
                    _entity_key.Id = (Guid)executionContext.OutputParameters[ParameterName.id];
            }
        }

        public void RequeryTarget()
        {
            RequeryTarget(new ColumnSet(true));
        }

        public void RequeryTarget(ColumnSet columnSet)
        {
            _entity = crmService.Retrieve(TargetKey.LogicalName, TargetKey.Id, columnSet);
        }

        public bool ValidateEntityName(string logicalName)
        {
            return _entity_key.LogicalName == logicalName;
        }

        public bool ValidateMessage(params string[] messages)
        {
            return messages.Contains(executionContext.MessageName);
        }

        abstract public void Execute();

        public void Run()
        {
            try
            {
                Execute();
            }
            catch (System.Exception ex)
            {
                throw new InvalidPluginExecutionException(
                    String.Format("An error occurred in the {0} plug-in: {1}", this.GetType().ToString(), ex.ToString()), ex);
            }
        }

        public Dictionary<int, string> GetOptionSet(string entityName, string optionSetName)
        {
            RetrieveAttributeRequest req = new RetrieveAttributeRequest();
            req.EntityLogicalName = entityName;
            req.LogicalName = optionSetName;
            RetrieveAttributeResponse res = (RetrieveAttributeResponse)_crmService.Execute(req);


            Dictionary<int, string> result = new Dictionary<int, string>();

            foreach (var r in ((PicklistAttributeMetadata)res.AttributeMetadata).OptionSet.Options)
            {
                result.Add(r.Value.Value, r.Label.UserLocalizedLabel.Label);
            }
            return result;
        }
    }

    public static class DateTimeExt
    {
        public static string ConvertToCulturalString(this DateTime dt)
        {
            return dt.ToLocalTime().ToString("dd.MM.yyyy");
        }
    }
}
Старый 23.04.2014, 18:08   #12  
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
Мда. Зачем таким образом плагины писать - мне умом не понять (хотя я в CRM пришёл из мира ООП и немного в этом понимаю), но то ваше дело.

Суть в чём - как я и писал у вас не заполняется _entity. И соответственно проперти TargetEntity отдаёт null. Отсюда и ошибка.

А вообще - учитесь дебажить плагины через VS.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: Lavdislav (1).
Старый 24.04.2014, 10:25   #13  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Мда. Зачем таким образом плагины писать - мне умом не понять (хотя я в CRM пришёл из мира ООП и немного в этом понимаю), но то ваше дело.

Суть в чём - как я и писал у вас не заполняется _entity. И соответственно проперти TargetEntity отдаёт null. Отсюда и ошибка.

А вообще - учитесь дебажить плагины через VS.
Хорошо, попробую разобратся с этим PreImage
Старый 24.04.2014, 10:54   #14  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
:(
Цитата:
Сообщение от a33ik Посмотреть сообщение
Мда. Зачем таким образом плагины писать - мне умом не понять (хотя я в CRM пришёл из мира ООП и немного в этом понимаю), но то ваше дело.

Суть в чём - как я и писал у вас не заполняется _entity. И соответственно проперти TargetEntity отдаёт null. Отсюда и ошибка.

А вообще - учитесь дебажить плагины через VS.
Вроде и preimage сделал, в коде тож добавил, но ругается так и так на ту же ошибку...

X++:
if (executionContext.MessageName == MessageName.Delete)
            {
                if (executionContext.PreEntityImages.Contains("Target") && executionContext.PreEntityImages["Target"] is Entity)
                {
                    Entity preMessageImage = (Entity)executionContext.PreEntityImages["Target"];

                    QueryExpression surveyz = new QueryExpression()
                    {
                        EntityName = "bf_survey",
                        ColumnSet = new ColumnSet(true)
                    };

                    surveyz.Criteria.AddCondition("bf_surveyid", ConditionOperator.Equal, preMessageImage.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);
                    }
                }
            }
Я хоть на правильном пути?
Изображения
 
Старый 24.04.2014, 11:01   #15  
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
Повторюсь. Учитесь отлаживать плагины.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 24.04.2014, 11:46   #16  
Lavdislav is offline
Lavdislav
Участник
 
34 / 10 (1) +
Регистрация: 28.02.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Повторюсь. Учитесь отлаживать плагины.
Ок.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подсчет количества записей , требуется подсказка 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, время: 16:38.