Доступ к контексту родительского экземпляра процесса из сценария
В статье рассмотрены примеры сценариев для получения/изменения простых и блоковых контекстных переменных родительского процесса.
А так же сценарий для передачи блока из родительского процесса в подпроцесс.
Текст сценария:
Для работы необходимы сборки:
Также в коде перед самим сценарием следует поместить описание использующейся в нем функции:
Текст сценария:
Текст сценария:
Сценарий подпроцесса для изменения значения контекстной переменной родительского процесса.
Нужно подключить Глобальную сбоку:
Microsoft.CSharp
Пространства имен:
1 2 3 | using Microsoft.CSharp; |
1 2 3 4 5 6 7 8 9 | var parentInstance = context.WorkflowInstance.ParentInstance; if (parentInstance != null ) { // Есть родительский экземпляр // Получаем контекст родительского экземпляра dynamic parentContext = parentInstance.Context; // Устанавливаем значение свойства контекста родительского экземпляра (из контекста данного процесса) parentContext.Znachenie = context.Znachenie; } |
Сценарий для создания элементов блока в родительском процессе из подпроцесса.
EleWise.ELMA.Workflow.Processes
ICSharpCode.NRefactory (глобальная сборка)
Microsoft.CSarp (глобальная сборка)
Пространства имен:
1 2 3 | using EleWise.ELMA.Model.Entities.ProcessContext; using EleWise.ELMA.Model.Services; using Microsoft.CSharp; |
1 2 3 4 5 6 7 8 9 10 | // Функция создания элемента блока: private dynamic CreateParentItem( object parentTablePart) { if (parentTablePart == null ) { throw new InvalidOperationException( "Блок не существует" ); } var itemType = parentTablePart.GetType().GetInterface( typeof (Iesi.Collections.Generic.ISet<>).FullName).GetGenericArguments()[0]; return InterfaceActivator.Create(itemType); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | var parentInstance = context.WorkflowInstance.ParentInstance; if (parentInstance != null ) { // Есть родительский экземпляр // Получаем контекст родительского экземпляра dynamic parentContext = parentInstance.Context; // Создаем элемент родительского блока var item = CreateParentItem(parentContext.Blok); // Присваиваем значения переменных в этом элементе блока item.StrokaBloka = context.Stroka; // Добавляем элемент в блок parentContext.Blok.Add(item); } |
Сценарий для передачи блока из родительского процесса в подпроцесс.
Для работы необходимы сборки:
EleWise.ELMA.Workflow.Processes
ICSharpCode.NRefactory (глобальная сборка)
Microsoft.CSarp (глобальная сборка)
Пространства имен:
1 2 3 4 5 6 7 | using EleWise.ELMA.Extensions; using EleWise.ELMA.Model.Common; using EleWise.ELMA.Model.Entities; using EleWise.ELMA.Model.Entities.ProcessContext; using EleWise.ELMA.Model.Managers; using EleWise.ELMA.Model.Types.Settings; using Microsoft.CSharp; |
1 2 3 4 5 6 7 8 9 10 | var parentInstance = context.WorkflowInstance.ParentInstance; if (parentInstance != null ) { dynamic parentContext = parentInstance.Context; foreach (var t in (Iesi.Collections.ISet)parentContext.Blok) { var b = new P_Pod_test_Podblok(); //создание элемента блока подпроцесса b.Stroka=t.AsDynamic().StorkaBloka; //получение значения родительского блока context.PodBlok.Add(b); } } |
Примечание
При работе с переменной "parentContext" автозаполнение (подсказки) в редакторе сценариев работать не будут. Кроме того, при публикации не проверяется правильно ли записаны имена свойств, к которым идет обращение в parentContext. Т.е. если написать "parentContext.Znachenie123", а на самом деле переменной Znachenie123 в родительском процессе нет, то процесс опубликуется нормально, но при исполнении сценария будет выдана ошибка.Поэтому нужно быть внимательными при работе с контекстом родительского экземпляра. Можно для надежности оборачивать данный код в "try { } catch {}" для обработки ошибки в процессе исполнения.