12.02.2009, 16:30 | #1 |
Kostya Afendikov
|
Plugin на для обновления задачи (Task)
Добрый день!
Второй день разбираюсь с 4-й, немного запутался с обновлением Задачи. Вешаю на Update (Post) Вот пример кода. При update ошибка - "В экземпляре объекта не задана ссылка на объект", но я вроде и с вязываю с ActivityId. Спасибо X++: public void Execute(IPluginExecutionContext context) { DynamicEntity entity = null; DynamicEntity inpEntity = null; // Check if the InputParameters property bag contains a target // of the current operation and that target is of type DynamicEntity. if (context.InputParameters.Properties.Contains(ParameterName.Target) && context.InputParameters.Properties[ParameterName.Target] is DynamicEntity) { // Obtain the target business entity from the input parmameters. entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target]; // TODO Test for an entity type and message supported by your plug-in. // if (entity.Name != EntityName.account.ToString()) { return; } // if (context.MessageName != MessageName.Create.ToString()) { return; } } else { return; } try { Key inputEntityId = new Key(); /* if (inpEntity.Name == EntityName.task.ToString() || inpEntity.Name == EntityName.letter.ToString() || inpEntity.Name == EntityName.appointment.ToString() || inpEntity.Name == EntityName.email.ToString() || inpEntity.Name == EntityName.fax.ToString() || inpEntity.Name == EntityName.phonecall.ToString() || inpEntity.Name == EntityName.orderclose.ToString() || inpEntity.Name == EntityName.quoteclose.ToString() || inpEntity.Name == EntityName.incidentresolution.ToString()) {*/ if (inpEntity.Name == EntityName.task.ToString()) { if (inpEntity.Properties.Contains("activityid")) { inputEntityId = ((Key)inpEntity["activityid"]);//.Value;//.ToString(); inpEntity = (DynamicEntity)context.InputParameters[ParameterName.Target]; DynamicEntity task = new DynamicEntity(); task.Name = EntityName.task.ToString(); task.Properties = new PropertyCollection(); task.Properties.Add(new StringProperty("subject", "test")); task.Properties.Add(new KeyProperty("activityid", inputEntityId)); TargetUpdateDynamic targetUpdate = new TargetUpdateDynamic(); targetUpdate.Entity = task; UpdateRequest update = new UpdateRequest(); update.Target = targetUpdate; ICrmService service = context.CreateCrmService(true); UpdateResponse updated = (UpdateResponse)service.Execute(update); } } } catch (System.Web.Services.Protocols.SoapException ex) { throw new InvalidPluginExecutionException( String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex); } |
|
12.02.2009, 16:39 | #2 |
Чайный пьяница
|
Цитата:
Код: public void Execute(IPluginExecutionContext context) { DynamicEntity entity = null; DynamicEntity inpEntity = null; // Check if the InputParameters property bag contains a target // of the current operation and that target is of type DynamicEntity. if (context.InputParameters.Properties.Contains(ParameterName.Target) && context.InputParameters.Properties[ParameterName.Target] is DynamicEntity) { // Obtain the target business entity from the input parmameters. entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target]; // TODO Test for an entity type and message supported by your plug-in. // if (entity.Name != EntityName.account.ToString()) { return; } // if (context.MessageName != MessageName.Create.ToString()) { return; } } else { return; } try { Key inputEntityId = new Key(); /* if (inpEntity.Name == EntityName.task.ToString() || inpEntity.Name == EntityName.letter.ToString() || inpEntity.Name == EntityName.appointment.ToString() || inpEntity.Name == EntityName.email.ToString() || inpEntity.Name == EntityName.fax.ToString() || inpEntity.Name == EntityName.phonecall.ToString() || inpEntity.Name == EntityName.orderclose.ToString() || inpEntity.Name == EntityName.quoteclose.ToString() || inpEntity.Name == EntityName.incidentresolution.ToString()) {*/ if (inpEntity.Name == EntityName.task.ToString()) { if (inpEntity.Properties.Contains("activityid")) { inputEntityId = ((Key)inpEntity["activityid"]);//.Value;//.ToString(); inpEntity = (DynamicEntity)context.InputParameters[ParameterName.Target]; DynamicEntity task = new DynamicEntity(); task.Name = EntityName.task.ToString(); task.Properties = new PropertyCollection(); task.Properties.Add(new StringProperty("subject", "test")); task.Properties.Add(new KeyProperty("activityid", inputEntityId)); ICrmService service = context.CreateCrmService(true); service.Update(task); } } } catch (System.Web.Services.Protocols.SoapException ex) { throw new InvalidPluginExecutionException( String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex); }
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 12.02.2009 в 16:44. |
|
|
За это сообщение автора поблагодарили: Bondonello (1). |
12.02.2009, 18:41 | #3 |
Kostya Afendikov
|
>>>Попробуйте так
Не помогло "В экземпляре объекта не задана ссылка на объект". Регистрировал на Update сначала Post потом и Pre попробовал. |
|
12.02.2009, 18:52 | #4 |
Чайный пьяница
|
Завтра покопаюсь. Но всё примитивно просто.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
12.02.2009, 20:49 | #5 |
Участник
|
2 Bondonello:
Ну посмотрите внимательно, что у Вас написано: Код: if (inpEntity.Name == EntityName.task.ToString()) { if (inpEntity.Properties.Contains("activityid")) { Код: DynamicEntity inpEntity = null; А для чего введены две переменные inpEntity и entity вообще неясно. Очевидно, надо оставить одну. Но это всё фигня по сравнению с тем, что у вас нет "защиты" от бесконечного цикла. |
|
|
За это сообщение автора поблагодарили: Bondonello (1). |
13.02.2009, 12:05 | #6 |
Kostya Afendikov
|
Да, бесконечный цикл был, да и вторая переменная оказалась лишняя, спасибо что указали. еще не набил руку.
Сделал Image на Post и событие и Зарегистрировал сборку на Update (Post) исправленный метод Execute X++: public void Execute(IPluginExecutionContext context) { DynamicEntity entity = null; if (context.PostEntityImages.Properties.Contains("Image")) { entity = (DynamicEntity)context.PostEntityImages.Properties["Image"]; if (entity.Properties.Contains("subject")) { if (entity.Properties["subject"].ToString() == "test1") { return; } } } else { throw new InvalidPluginExecutionException("Some sheet happened!"); } if (context.InputParameters.Properties.Contains(ParameterName.Target) && context.InputParameters.Properties[ParameterName.Target] is DynamicEntity) { entity = (DynamicEntity)context.InputParameters[ParameterName.Target]; } else { return; } try { Key entityId = new Key(); if (entity.Name == EntityName.task.ToString()) { if (entity.Properties.Contains("activityid")) { entityId = ((Key)entity.Properties["activityid"]); //entity = (DynamicEntity)context.InputParameters[ParameterName.Target]; DynamicEntity task = new DynamicEntity(); task.Name = EntityName.task.ToString(); task.Properties = new PropertyCollection(); task.Properties.Add(new StringProperty("subject", "test1")); task.Properties.Add(new KeyProperty("activityid", entityId)); ICrmService service = context.CreateCrmService(true); service.Update(task); } else { throw new InvalidPluginExecutionException("Entity image do not contains activityid field!"); } } } catch (System.Web.Services.Protocols.SoapException ex) { throw new InvalidPluginExecutionException( String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex); } } |
|
25.02.2009, 10:26 | #7 |
Участник
|
Тоже столкнулся с какой то непонятной ошибкой при Update на плагине. Т.е. у меня написан плагин рабочий на Create, где он прекрасно работает, но когда я попробовал его переделать на Update он начал выводить ошибку "Данный ключ отсутствует в словаре", после операций с комментированием выяснилось что он ругается на начало
Цитата:
DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];
string accountName = entity["name"].ToString(); string accountId = context.OutputParameters.Properties["id"].ToString(); |
|
25.02.2009, 10:36 | #8 |
Участник
|
Если не ошибаюсь, то на строчку
X++: string accountId = context.OutputParameters.Properties["id"].ToString(); |
|
25.02.2009, 10:40 | #9 |
Участник
|
А на строчку
X++: string accountName = entity["name"].ToString(); |
|
25.02.2009, 10:58 | #10 |
Участник
|
Цитата:
DynamicEntity entity = (DynamicEntity)context.PostEntityImages.Properties["Image"];
string accountName = entity.Properties["name"].ToString(); Так тоже не работает |
|
25.02.2009, 11:10 | #11 |
Участник
|
А Image точно зарегистрировано на Post и в нем есть атрибут name?
А не работает, что пишет, опять "Данный ключ отсутствует в словаре"? |
|
25.02.2009, 11:30 | #12 |
Участник
|
Да тоже самое пишет
Цитата:
А Image точно зарегистрировано на Post и в нем есть атрибут name?
|
|
25.02.2009, 11:39 | #13 |
Участник
|
Для того чтобы использовать снимок состояния (Image), его нужно объявить в регистраторе плагинов, указав, какое состояние (Pre, Post или оба) вам собственно нужно и какие поля.
|
|
|
За это сообщение автора поблагодарили: Roman08 (1), Казарин Александр (1). |
25.02.2009, 12:01 | #14 |
Участник
|
АА.. разобрался, спасибо большое
|
|
25.02.2009, 12:13 | #15 |
Kostya Afendikov
|
Я немного не разобрался с Image пока что, и сделал вот так. Возможно кому-то пригодиться
Регистрирую на Create и Update + Pre Stage. А вот с Image разбираюсь X++: public void Execute(IPluginExecutionContext context) { DynamicEntity entity = null; if (context.InputParameters.Properties.Contains(ParameterName.Target) && context.InputParameters.Properties[ParameterName.Target] is DynamicEntity) { entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target]; if (context.MessageName != MessageName.Update.ToString() && context.MessageName != MessageName.Create.ToString()) { throw new InvalidPluginExecutionException("Smth wrong with Update stage may be"); } } else { return; } try { ICrmService crmService = context.CreateCrmService(false); if(entity.Properties.Contains("regardingobjectid")) { String do_companyname = ""; ColumnSet cs = new ColumnSet(); Lookup regarding = (Lookup)entity.Properties["regardingobjectid"]; // проверяю, что в лукапе выбран Интерес if (regarding.type == EntityName.lead.ToString()) { cs.Attributes.Add("companyname"); lead _lead = (lead)crmService.Retrieve(EntityName.lead.ToString(), regarding.Value, cs); if (_lead == null || _lead.companyname == null) { return; } else { new_companyname = _lead.companyname; } } entity.Properties.Add(new StringProperty("new_companyname", new_companyname)); } } |
|
|
Похожие темы | ||||
Тема | Ответов | |||
PlugIn ImageEntity | 3 | |||
Доступ к custom fields в Plugin | 3 | |||
Получить id объекта вызвавшего PlugIn | 5 | |||
Закрыть задачи | 2 | |||
Письма в "Списки ожидания" - "Мои задачи" | 0 |
|