18.04.2012, 11:19 | #1 |
Участник
|
CRM 4.0 Запрет удаления сущности
Добрый день!
Подскажите, пожалуйста, возможно ли программно запретить удалять определенную сущность при выполнении какого-либо условия? И если можно, то как? |
|
18.04.2012, 11:30 | #2 |
Участник
|
Да можно. Для этого Вы должны создать плагин на PreDelete для необходимой Вам сущности.
Плагине у Вас будет PreImage. Вы сможете его подключить и в случае если условие невозможности удаления сработало, то Вы "Выплевываете" Exception. X++: public void Execute(IPluginExecutionContext context) { string preImageName = "preimage"; DynamicEntity myEntity = (DynamicEntity)context.PreEntityImages[preImageName]; if(myEntity.Properties.Contains("name") && myEntity["name"]!= null && myEntity["name"].ToString() == "not delete") throw new InvalidPluginExecutionException ("You can not remove this object"); } Здесь если имя объекта "not delete" удаление происходить не будет. Последний раз редактировалось g.Naukovych; 18.04.2012 в 11:43. |
|
18.04.2012, 14:11 | #3 |
Участник
|
Цитата:
Подскажите, пожалуйста, а как правильно вставить SOAP-запрос в такой плагин? Просто я никогда до этого плагины не писала. Мне необходимо проверить на некоторое условие атрибут связанной сущности и в зависимости от этого запрещать удаление и изменение сущности. |
|
18.04.2012, 14:37 | #4 |
Чайный пьяница
|
Цитата:
Сообщение от probka
Спасибо. Я правильно поняла, что PreImage - это названием удаляемой сущности?
Подскажите, пожалуйста, а как правильно вставить SOAP-запрос в такой плагин? Просто я никогда до этого плагины не писала. Мне необходимо проверить на некоторое условие атрибут связанной сущности и в зависимости от этого запрещать удаление и изменение сущности.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: probka (1). |
18.04.2012, 14:43 | #5 |
Участник
|
Цитата:
Сообщение от probka
Спасибо. Я правильно поняла, что PreImage - это названием удаляемой сущности?
Подскажите, пожалуйста, а как правильно вставить SOAP-запрос в такой плагин? Просто я никогда до этого плагины не писала. Мне необходимо проверить на некоторое условие атрибут связанной сущности и в зависимости от этого запрещать удаление и изменение сущности. Далее нажмете правой кнопкой на Ваш шаг и добавите Image. Image это снимок состояния сущности. PreImage до того как событие произошло PostImage после. SOAP запрос можно, но скорее не нужно. Можно FetchXML запрос. Вообще я обычно не пишу их в плагине, а пишу через QueryExpression. Это как мне кажется проще. здесь все пишется кодом, без всяких FetchXML. Но и его можно вызвать из плагина. Для этого Вы должны воспользоваться FetchExpression. Прочитайте как делать плагины. Это очень мощный функционал и в 2х словах его не расскажешь. Последний раз редактировалось g.Naukovych; 18.04.2012 в 14:45. |
|
|
За это сообщение автора поблагодарили: probka (1). |
18.04.2012, 15:05 | #6 |
Участник
|
Спасибо. А вы не подскажете, где можно прочитать, как делать плагины? Желательно на русском, с английским у меня туговато.
|
|
18.04.2012, 15:08 | #7 |
Участник
|
|
|
30.07.2012, 14:00 | #8 |
Участник
|
Написала плагин, воспользовавшись докладом http://crmmagic.blogspot.com/2010/02/techdays.html. Получилось следующее:
X++: public void Execute(IPluginExecutionContext context) { if (context.MessageName != MessageName.Delete || !(context.InputParameters.Contains("Target")) || !(context.InputParameters["Target"] is DynamicEntity)) return; DynamicEntity _grmember = (DynamicEntity) context.InputParameters["Target"]; if (!_grmember.Properties.Contains("new_contractid")) return; Customer customer = (Customer)_grmember["new_contractid"]; if (customer.type != EntityName.opportunity.ToString()) return; Guid opportunityid = customer.Value; string[] fields = new string[] { "new_status" }; ICrmService crmservice = context.CreateCrmService(true); RetrieveRequest request = new RetrieveRequest(); request.ColumnSet = new ColumnSet(fields); request.ReturnDynamicEntities = true; TargetRetrieveDynamic target = new TargetRetrieveDynamic(); target.EntityId = opportunityid; target.EntityName = EntityName.opportunity.ToString(); request.Target = target; DynamicEntity _opportunity = (DynamicEntity)((RetrieveResponse)crmservice.Execute(request)).BusinessEntity; if ((string)_opportunity["new_status"] == "2") throw new InvalidPluginExecutionException("Вы не можете удалить этот объект!"); } |
|
30.07.2012, 15:43 | #9 |
Участник
|
1. В плагин регистраторе добавте preimage
2. В плагине image будет в context.preImage (Название точно не помню, но по первым буквам найдете) 3. Все данные которы Вам нужны берите от туда. |
|
|
За это сообщение автора поблагодарили: probka (1). |
31.07.2012, 10:10 | #10 |
Участник
|
Спасибо, в этом месте заработало.
Теперь на строке, где выполняется запрос, меня выкидывает с сообщением: "Сбой запроса с состоянием HTTP 404: Not Found". Отчего это может быть? |
|
03.08.2012, 10:32 | #11 |
Участник
|
Добрый день! С этим плагином разобралась. Все ошибки разрулила, все работает.
Вопрос еще такой: А можно ли сделать аналогичный плагин для запрета деактивации записи? В плагин регистраторе я не нахожу подобной возможности. |
|
03.08.2012, 10:40 | #12 |
Чайный пьяница
|
SetState/SetStateDynamicEntity сообщения посмотрите.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: probka (1). |
03.08.2012, 12:44 | #13 |
Участник
|
Спасибо! Разобралась, все получилось.
|
|
|
|