|
20.02.2012, 17:41 | #1 |
Участник
|
Plugin не подхватывает создание сущности бизнес-процессом
Господа, доброго времени суток.
У меня такая проблема. Есть плагин, который висит на создание сущности. При создании - в поле записывает текстовую информацию. Пришлось данный плагин повесить асинхронно, иначе он не отрабатывал (так и не смог понять почему). Проблема в том, что Plugin не подхватывает создание сущности бизнес-процессом. Т.е. если я создаю вручную - все хорошо, но когда бизнес процессом - он не отрабатывает. Сможете подсказать - в какую сторону копать? Спасибо |
|
20.02.2012, 20:45 | #2 |
Moderator
|
Я думаю, копать надо в сторону отладки вашего плагина, так как он, очевидно, не работает. Почему - без кода понять сложно, однако с уверенностью могу сказать вам одно: событие создания записи происходит вне зависимости от того, создаете ли вы запись через интерфейс или же из кода.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
21.02.2012, 11:28 | #3 |
Участник
|
Спасибо. Сам не понимаю, почему он может не подхватывать.
Ниже привожу код плагина 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 |
Участник
|
А вы в отладчике смотрели, плагин не запускается вообще или по какой-то причине не выполняет заложенную логику?
|
|
21.02.2012, 11:55 | #5 |
Участник
|
Пока не могу получить доступ на сервак, где он лежит, но когда создаю сущность вручную - он отрабатывает без проблем. Поэтому делаю выводы - что не запускается вообще.
|
|
21.02.2012, 12:06 | #6 |
Участник
|
Смущает вот такая проверка 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 |
Участник
|
Спасибо. Тоже грешил на глубину запуска. Сейчас подправлю - посмотрим.
|
|