12.11.2009, 15:46 | #1 |
Участник
|
Как передать переменную из одного плагина в другой?
Задача: прервать каскадное выполнение некоторых плагинов при определенном действии.
Плагины на разных сущностях - т.е. шины разные. Можно ли расшарить какие-то переменные между разными плагинами и как это сделать? Что-то вроде SharedVariables на одной шине. Коллеги, выслушаю любые идеи.
__________________
CRM programmer |
|
12.11.2009, 15:59 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от SVK
Задача: прервать каскадное выполнение некоторых плагинов при определенном действии.
Плагины на разных сущностях - т.е. шины разные. Можно ли расшарить какие-то переменные между разными плагинами и как это сделать? Что-то вроде SharedVariables на одной шине. Коллеги, выслушаю любые идеи.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
12.11.2009, 16:11 | #3 |
Участник
|
ParentContext пустой для второго плагина, а установить его нельзя, судя по мсдн
"Remarks This property is read only. "
__________________
CRM programmer |
|
12.11.2009, 16:27 | #4 |
Чайный пьяница
|
Цитата:
Можете более детально рассказать о Вашем каскадном механимзе? Т.е. какие плагины есть и какие сообщения они обрабатывают.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
12.11.2009, 16:36 | #5 |
Участник
|
1) При переназначении(assign) сущности Opportunity создаю сущность история сделки(new_opportunityhistory).
2) при создании сущности история сделки(new_opportunityhistory), обновляются некоторые поля сущности Opportunity. Нужно, чтобы второй плагин, при таком порядке вызова, обновлял не все поля на сущности Opportunity. Сейчас думаю, что можно как-то через базовый класс Request передать параметры, но пока не придумал как.
__________________
CRM programmer |
|
12.11.2009, 16:47 | #6 |
Чайный пьяница
|
Цитата:
Сообщение от SVK
1) При переназначении(assign) сущности Opportunity создаю сущность история сделки(new_opportunityhistory).
2) при создании сущности история сделки(new_opportunityhistory), обновляются некоторые поля сущности Opportunity. Нужно, чтобы второй плагин, при таком порядке вызова, обновлял не все поля на сущности Opportunity. Сейчас думаю, что можно как-то через базовый класс Request передать параметры, но пока не придумал как. 1. Используйте OptionalParameters. 2. В Вашем шаге 1 при создании сущности new_opportunityhistory создавайте какое то фиктивное поле-флаг, а в плагине Pre-Create этой сущности запоминайте, что поле пришло в контексте, убирайте его из контекста и передавайте дальше при помощи SharedVariables. 3. Мусорный, но на 100% рабочий. Создайте в сущности new_opportunityhistory служебное поле и при Вашем шаге 1 - заполняйте это поле, а на шаге 2 судите о наличии флага по наличию поля-флага в контексте. Фокусов 1 и 2 я не делал, потому если это заработает - сообщите, пожалуйста.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 12.11.2009 в 16:49. |
|
12.11.2009, 17:49 | #7 |
Участник
|
OptionalParameters предопределены. Наследовать класс не получается - он не сериализует мои типы ((
Второй способ пока не опробовал. Ох и огород получится. Через служебное поле то как раз и не хотел - утомил этот способ уже.
__________________
CRM programmer Последний раз редактировалось SVK; 12.11.2009 в 19:05. |
|
12.11.2009, 18:44 | #8 |
Участник
|
Второй способ - валидатор не пускает - "\n 0x80041103\n 'New_opportunityhistory' entity doesn't contain attribute with Name = 'UpdateOppAfterHistory'.\n
Это при вызове Create до вызова плагина падает
__________________
CRM programmer |
|
13.11.2009, 10:33 | #9 |
Moderator
|
Я не слишком искушен в программировании плагинов, но почему-бы не использовать IPluginExecutionContext.SharedVariables. Есть даже целый раздел SDK: Passing Data Between Plug-ins.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
13.11.2009, 11:29 | #10 |
Участник
|
Нюансы SharedVariables таковы, что невозможно передать сообщение между двумя плагинами на разных сущностях, а только между плагинами пре и пост на одной сущности.
Следует учесть, что у меня плагины для разных сущностей разнесены по разным сборкам. Может быть, если запихнуть все в одну сборку будет иначе...
__________________
CRM programmer Последний раз редактировалось SVK; 13.11.2009 в 12:57. |
|
13.11.2009, 13:35 | #11 |
Участник
|
UPD. Иначе не стало - плагин теряет этот контекст для разных сущностей ((
__________________
CRM programmer |
|
13.11.2009, 14:09 | #12 |
Участник
|
Коллеги, я сделал это - передал что мне нужно, не используя базу )
Через следующую конструкцию 1) сделал промежутчную DLL для общих методов 2) реализовал статичный метод, через еоторый можно будет передавать статичные переменные X++: namespace Helper { public static class Keeper { private static bool _UpdateOppAfterHistory = true; public static bool UpdateOppAfterHistory { get { return _UpdateOppAfterHistory; } set { _UpdateOppAfterHistory = value; } } } public class OpportunityHelper { ... } } X++: // Перед вызовом создания истории, устанавливаем флаг, // для плагина New_opportunityhistory.OpportunityHistory_Create Keeper.UpdateOppAfterHistory = false; OpportunityHelper.CreateOpportunityHistory(Opp,crmService); // снимаем флажок обратно Keeper.UpdateOppAfterHistory = true; X++: bool UpdateOppAfterHistory = Keeper.UpdateOppAfterHistory;
if (UpdateOppAfterHistory)
{ ... }
__________________
CRM programmer |
|
13.11.2009, 14:15 | #13 |
Moderator
|
Извините, не внимательно прочитал топик. Можете подробно рассказать что и как должно происходить? А то есть ощущение, что "код с душком". Если плагин на назначение создает какой-то объект, то пусть он сам и меняет сделку! Зачем вешать на "историю" дополнительный плагин с feedback? На мой взгляд это перегрузка логики служебного объекта.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
13.11.2009, 14:22 | #14 |
Участник
|
Есть два разных случая:
1) Создание истории ВС вручную, открывается карточка и пользователь заполняет поля, при этом срабатывает плагин, переносящий заполненые поля с истории ВС на саму ВС. 2) Создание истории ВС автоматически, при переназначении ВС. Вот при втором случае, каскадом стреляет плагин для случая один. Его и надо было отключить.
__________________
CRM programmer |
|
13.11.2009, 14:29 | #15 |
Moderator
|
На этот случай у объекта есть такое поле isWorkFlowCreated.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
13.11.2009, 15:17 | #16 |
Участник
|
У какого объекта?
У opportunity такого нету, у моего кастомного - тоже. По SDK я вижу, что данное поле относится только к Activity разного типа и *close объектам. Кроме того, оно разве относится к плагинам?
__________________
CRM programmer |
|