Доступ к контексту родительского экземпляра процесса из сценария
В статье рассмотрены примеры сценариев для получения/изменения простых и блоковых контекстных переменных родительского процесса.
А так же сценарий для передачи блока из родительского процесса в подпроцесс.
Для работы необходимы сборки:
Сценарий подпроцесса для изменения значения контекстной переменной родительского процесса.
Нужно подключить Глобальную сбоку:
Microsoft.CSharp
Пространства имен:
using Microsoft.CSharp;Текст сценария:
var parentInstance = context.WorkflowInstance.ParentInstance; if (parentInstance != null) { // Есть родительский экземпляр // Получаем контекст родительского экземпляра dynamic parentContext = parentInstance.Context; // Устанавливаем значение свойства контекста родительского экземпляра (из контекста данного процесса) parentContext.Znachenie = context.Znachenie; }
Сценарий для создания элементов блока в родительском процессе из подпроцесса.
EleWise.ELMA.Workflow.Processes
ICSharpCode.NRefactory (глобальная сборка)
Microsoft.CSarp (глобальная сборка)
Пространства имен:
using EleWise.ELMA.Model.Entities.ProcessContext; using EleWise.ELMA.Model.Services; using Microsoft.CSharp;Также в коде перед самим сценарием следует поместить описание использующейся в нем функции:
// Функция создания элемента блока: 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); }Текст сценария:
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 (глобальная сборка)
Пространства имен:
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;Текст сценария:
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 {}" для обработки ошибки в процессе исполнения.