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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.02.2012, 17:41   #1  
2rik is offline
2rik
Участник
 
20 / 10 (1) +
Регистрация: 15.11.2011
Plugin не подхватывает создание сущности бизнес-процессом
Господа, доброго времени суток.
У меня такая проблема. Есть плагин, который висит на создание сущности. При создании - в поле записывает текстовую информацию. Пришлось данный плагин повесить асинхронно, иначе он не отрабатывал (так и не смог понять почему).
Проблема в том, что Plugin не подхватывает создание сущности бизнес-процессом. Т.е. если я создаю вручную - все хорошо, но когда бизнес процессом - он не отрабатывает.

Сможете подсказать - в какую сторону копать?

Спасибо
Старый 20.02.2012, 20:45   #2  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Я думаю, копать надо в сторону отладки вашего плагина, так как он, очевидно, не работает. Почему - без кода понять сложно, однако с уверенностью могу сказать вам одно: событие создания записи происходит вне зависимости от того, создаете ли вы запись через интерфейс или же из кода.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 21.02.2012, 11:28   #3  
2rik is offline
2rik
Участник
 
20 / 10 (1) +
Регистрация: 15.11.2011
Спасибо. Сам не понимаю, почему он может не подхватывать.
Ниже привожу код плагина

X++:
using System;
using System.ServiceModel;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Client;
using Microsoft.Xrm.Sdk.Query;
using System.Collections;
using Microsoft.Xrm.Sdk.Client;
using System.Data;

namespace WorkWithProject
{
    public  class Plugin : IPlugin
    {
        
        public  OrganizationServiceContext orgContext;
        public  OrganizationServiceProxy _serviceProxy;
        public  IOrganizationService _service;

        public  int Nomer = 0;
        public string ProjectPrefix = "";
        public  string StrNomer = "";
        public  string EntityPrefix = "";
        
        

        public  void Init()
        {
            _serviceProxy.EnableProxyTypes();
            _service = (IOrganizationService)_serviceProxy;
            // Create the OrganizationServiceContext object that will generate the IQueryable collections for LINQ calls.
            orgContext = new OrganizationServiceContext(_service);
        }
        public  string WorkWithNumber(int Number, string EntityPrefix, string PrefixProekta)
        {
            string result = null;

            result = String.Format("{1}{2}-{0,5:00000}", Number, EntityPrefix, PrefixProekta);

            return result;
        }

        public  void Execute(IServiceProvider serviceProvider)
        {
           
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            _service = serviceFactory.CreateOrganizationService(context.UserId);
            orgContext = new OrganizationServiceContext(_service);
             
            ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            
            if (context.Depth > 1)
            {
                return;
            }

            Entity entity = null;

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                // Obtain the target business entity from the input parmameters.
                entity = (Entity)context.InputParameters["Target"];
                // TODO Test for an entity type and message supported by your plug-in.
                
                
            }
            else return;
           

            if (entity != null)
            {
                try
                {
                    Guid EntityId = ((Guid)entity.Id);


                    if (entity.LogicalName == "project_task")
                    {
                        #region  
                        //вынимаем задачу проекта-------------------------------------------------------------
                        var ProjectTask = (from PT in orgContext.CreateQuery<project_task>()
                                           where (PT.Id == EntityId)
                                           select new project_task{ Id = PT.Id }).FirstOrDefault();
                        if (ProjectTask == null) return;
                        //------------------------------------------------------------------------------------
                        if (ProjectTask.project== null) return;
                        else
                        {
                            //вытягиваем проект-------------------------------------------------------
                            var Project = (from P in orgContext.CreateQuery<project>()
                                           where (P.Id == ProjectTask.project.Id)
                                           select new project{ Id = P.Id }).FirstOrDefault();
                            if (Project == null) return;
                            //-----------------------------------------------------------------------

                            if (Project.number== null) Nomer = 1;
                            else Nomer = (int)Project.task_number;

                            EntityPrefix = "T";

                            if (Project.prefix != null) ProjectPrefix = Project.prefix;
                            StrNomer = WorkWithNumber(Nomer, EntityPrefix, ProjectPrefix);

                            ProjectTask.number = StrNomer;


                            orgContext.UpdateObject(ProjectTask);
                            _service.Update(ProjectTask);



                            Project.number = Nomer + 1;
                            orgContext.UpdateObject(Project);
                            _service.Update(Project);


                            //orgContext.SaveChanges();

                        }
                       
                    }

                    else if (entity.LogicalName == "out_task")
                    {
                        #region  

                        //вынимаем задачу проекта-------------------------------------------------------------
                        var ProjectTaskOut = (from PTO in orgContext.CreateQuery<out_task>()
                                              where (PTO.Id == EntityId)
                                              select new out_task{ Id = PTO.Id }).FirstOrDefault();
                        if (ProjectTaskOut == null) return;
                        //------------------------------------------------------------------------------------
                        if (ProjectTaskOut.project== null) return;
                        else
                        {
                            //вытягиваем проект-------------------------------------------------------
                            var Project = (from P in orgContext.CreateQuery<project>()
                                           where (P.Id == ProjectTaskOut.project.Id)
                                           select new project{ Id = P.Id }).FirstOrDefault();
                            if (Project == null) return;
                            //-----------------------------------------------------------------------

                            if (Project.out_task_number == null) Nomer = 1;
                            else Nomer = (int)Project.out_task_number;

                            EntityPrefix = "E";

                            if (Project.prefix != null) ProjectPrefix = Project.prefix;
                            StrNomer = WorkWithNumber(Nomer, EntityPrefix, ProjectPrefix);

                            ProjectTaskOut.number = StrNomer;
                            orgContext.UpdateObject(ProjectTaskOut);
                            _service.Update(ProjectTaskOut);

                            Project.out_task_number = Nomer + 1;
                            orgContext.UpdateObject(Project);
                            _service.Update(Project);

                        }



                        #endregion
                    }

                    else if (entity.LogicalName == "defect")
                    {
                        #region 

                        //вынимаем задачу проекта-------------------------------------------------------------
                        var Defect = (from D in orgContext.CreateQuery<defect>()
                                      where (D.Id == EntityId)
                                      select new defect{ Id = D.Id }).FirstOrDefault();
                        if (Defect == null) return;
                        //------------------------------------------------------------------------------------
                        if (Defect.project== null) return;
                        else
                        {
                            //вытягиваем проект-------------------------------------------------------
                            var Project = (from P in orgContext.CreateQuery<project>()
                                           where (P.Id == Defect.project.Id)
                                           select new project{ Id = P.Id }).FirstOrDefault();
                            if (Project == null) return;
                            //-----------------------------------------------------------------------

                            if (Project.new_nomer_defecta == null) Nomer = 1;
                            else Nomer = (int)Project.new_nomer_defecta;

                            EntityPrefix = "D";

                            if (Project.prefix!= null) ProjectPrefix = Project.new_prefix_numeracii;
                            StrNomer = WorkWithNumber(Nomer, EntityPrefix, ProjectPrefix);

                            Defect.number= StrNomer;
                            orgContext.UpdateObject(Defect);
                            _service.Update(Defect);

                            Project.number= Nomer + 1;
                            orgContext.UpdateObject(Project);
                            _service.Update(Project);

                        }



                        #endregion
                    }

                    else if (entity.LogicalName == "changes")
                    {
                        #region 

                        //вынимаем задачу проекта-------------------------------------------------------------
                        var Izm = (from I in orgContext.CreateQuery<changes>()
                                   where (I.Id == EntityId)
                                   select new changes{ Id = I.Id }).FirstOrDefault();
                        if (Izm == null) return;
                        //------------------------------------------------------------------------------------
                        if (Izm.new_proekt == null) return;
                        else
                        {
                            //вытягиваем проект-------------------------------------------------------
                            var Project = (from P in orgContext.CreateQuery<project>()
                                           where (P.Id == Izm.project.Id)
                                           select new project{ Id = P.Id }).FirstOrDefault();
                            if (Project == null) return;
                            //-----------------------------------------------------------------------

                            if (Project.changes== null) Nomer = 1;
                            else Nomer = (int)Project.number;

                            EntityPrefix = "C";

                            if (Project.prefix != null) ProjectPrefix = Project.prefix;
                            StrNomer = WorkWithNumber(Nomer, EntityPrefix, ProjectPrefix);

                            Izm.new_nomer = StrNomer;
                            orgContext.UpdateObject(Izm);
                            _service.Update(Izm);

                            Project.new_nomer_izmeneniya = Nomer + 1;
                            orgContext.UpdateObject(Project);
                            _service.Update(Project);

                        }



                        #endregion
                    }

                    else if (entity.LogicalName == "risk")
                    {
                        #region 

                        //вынимаем задачу проекта-------------------------------------------------------------
                        var Risk = (from R in orgContext.CreateQuery<risk>()
                                    where (R.Id == EntityId)
                                    select new risk{ Id = R.Id }).FirstOrDefault();
                        if (Risk == null) return;
                        //------------------------------------------------------------------------------------
                        if (Risk.project== null) return;
                        else
                        {
                            //вытягиваем проект-------------------------------------------------------
                            var Project = (from P in orgContext.CreateQuery<project>()
                                           where (P.Id == Risk.new_proektid.Id)
                                           select new project{ Id = P.Id }).FirstOrDefault();
                            if (Project == null) return;
                            //-----------------------------------------------------------------------

                            if (Project.number== null) Nomer = 1;
                            else Nomer = (int)Project.number;

                            EntityPrefix = "R";

                            if (Project.prefix!= null) ProjectPrefix = Project.prefix;
                            StrNomer = WorkWithNumber(Nomer, EntityPrefix, ProjectPrefix);

                            Risk.number= StrNomer;
                            orgContext.UpdateObject(Risk);
                            _service.Update(Risk);

                            Project.number= Nomer + 1;
                            orgContext.UpdateObject(Project);
                            _service.Update(Project);

                        }



                        #endregion
                    }

                }
                
                catch (FaultException<OrganizationServiceFault> ex)
                {
                    throw new InvalidPluginExecutionException(ex.Message,ex);
                }
            }
        }
    }
}

Последний раз редактировалось 2rik; 21.02.2012 в 11:43.
Старый 21.02.2012, 11:51   #4  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
А вы в отладчике смотрели, плагин не запускается вообще или по какой-то причине не выполняет заложенную логику?
Старый 21.02.2012, 11:55   #5  
2rik is offline
2rik
Участник
 
20 / 10 (1) +
Регистрация: 15.11.2011
Пока не могу получить доступ на сервак, где он лежит, но когда создаю сущность вручную - он отрабатывает без проблем. Поэтому делаю выводы - что не запускается вообще.
Старый 21.02.2012, 12:06   #6  
griefon is offline
griefon
Участник
 
131 / 52 (2) ++++
Регистрация: 07.12.2010
Адрес: down under
Смущает вот такая проверка context.Depth > 1
Вроде как бизнес-процесс увеличивает глубину на единицу.

http://www.officeextend.nl/blog/tag/CRM%204

По ссылке есть пост с заголовком Workflow adds 1 to context depth of plugin, там подробно расписано.
За это сообщение автора поблагодарили: 2rik (1).
Старый 21.02.2012, 12:09   #7  
2rik is offline
2rik
Участник
 
20 / 10 (1) +
Регистрация: 15.11.2011
Спасибо. Тоже грешил на глубину запуска. Сейчас подправлю - посмотрим.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание Order из другой сущности ashuron Dynamics CRM: Разработка 3 16.11.2011 22:21
создание прайса бизнес-процессом lin2nil Dynamics CRM: Функционал 2 12.10.2011 00:06
Как открыть в новом окне созданный бизнес-процессом объект? NatK Dynamics CRM: Разработка 6 30.09.2009 09:18
Создание экземпляра кастомной сущности из плагина Roman08 Dynamics CRM: Разработка 14 31.08.2009 21:34
Создание объекта сущности из другого объекта! SnSS Dynamics CRM: Разработка 5 29.05.2008 13:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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