Динамические формы задач БП: запись результата операций над элементами блока в другой блок
При использовании блоков в процессных задачах бывает необходимо значения переменных из одного блока записать в виде значений переменных другого блока. Рассмотрим запись суммы значений столбца одного блока в другой блок.
Пусть у нас есть 2 блока:
1) Блок Sale_Product
Блок содержит в себе информацию об объеме продаж (шт.) продукта компании за каждый квартал.
Свойства блока:
Product – продукт, тип Строка;
Q1 – значение объема продаж по данному продукту в 1-м квартале, тип Целое число;
Q2 – значение объема продаж по данному продукту в 2-м квартале, тип Целое число;
Q3 – значение объема продаж по данному продукту в 3-м квартале, тип Целое число;
Q4 – значение объема продаж по данному продукту в 4-м квартале, тип Целое число.
2) Блок Sale_Sum
Блок содержит информацию об объеме продаж за каждый квартал по всем продуктам вместе. Блок и его свойства доступны только для чтения.
Свойства блока:
Sum – продукт, тип Строка;
Sum_Q1 – значение объема продаж по всем продуктам в 1-м квартале, тип Целое число;
Sum_Q2 – значение объема продаж по всем продуктам в 2-м квартале, тип Целое число;
Sum_Q3 – значение объема продаж по всем продуктам в 3-м квартале, тип Целое число;
Sum_Q4 – значение объема продаж по всем продуктам в 4-м квартале, тип Целое число.
Напишем сценарий, который при заполнении значений первого блока будет автоматически заполнять значения второго блока. Для этого будем использовать стандартный сценарий при изменении, привязанный к переменной блока Sale_Product. Такой сценарий будет выполняться при добавлении нового элемента или сохранении изменений в уже существующем элементе блока Sale_Product. Т. е. при каждом изменении блока Sale_Product полностью пересчитываются значения блока Sale_Sum.
Для использования сценариев должно быть подключено пространство имен:
using EleWise.ELMA.Model.Services;
Первоначально при открытии задачи блок Sale_Sum не будет иметь ни одной строки, поэтому нужно добавить строку, которая будет содержать в себе значения сумм:
public void Sum(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form) { var newRow = InterfaceActivator.Create<P_Blok_Sale_Sum>(); //создаем строку блока Sale_Sum newRow.Sum_Q1 = 0; // ячейкам присваиваем значение «0» newRow.Sum_Q2 = 0; newRow.Sum_Q3 = 0; newRow.Sum_Q4 = 0; newRow.Sum = "Сумма"; //присваиваем первой ячейке значение «Сумма» context.Sale_Sum.Add(newRow); // добавляем созданную строку в блок Sale_Sum }
Теперь суммируем значения по первому блоку Sale_Product и записываем результат во второй блок Sale_Sum. Для передачи значения используем дополнительные переменные:
Summa_Q1 – значение объема продаж по всем продуктам в 1-м квартале, тип Целое число;
Summa_Q2 – значение объема продаж по всем продуктам в 2-м квартале, тип Целое число;
Summa_Q3 – значение объема продаж по всем продуктам в 3-м квартале, тип Целое число;
Summa_Q4 – значение объема продаж по всем продуктам в 4-м квартале, тип Целое число.
Подробнее о подсчете суммы элементов блока с использованием дополнительной переменной в статье https://www.elma-bpm.ru/kb/article-373.html
public void Sum_block(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form) { context.Summa_Q1 = 0; // контекстным переменным присваиваем значение «0» context.Summa_Q2 = 0; context.Summa_Q3 = 0; context.Summa_Q4 = 0; foreach (var item in context. Sale_Product) { if(item.Q1 == null) // проверяем, заполнено ли значение ячейки, если нет, присваиваем значение «0» item.Q1 = 0; if(item.Q2 == null) item.Q2 = 0; if(item.Q3 == null) item.Q3 = 0; if(item.Q4 == null) item.Q4 = 0; context.Summa_Q1 += item.Q1; //в контекстную переменную добавляем значение ячейки блока Sale_Product context.Summa_Q2 += item.Q2; context.Summa_Q3 += item.Q3; context.Summa_Q4 += item.Q4; } foreach (var item in context.Sale_Sum.ToList()) { item.Sum_Q1 = context.Summa_Q1; //в ячейки блока Sale_Sum записываем значения контекстных переменных item.Sum_Q2 = context.Summa_Q2; item.Sum_Q3 = context.Summa_Q3; item.Sum_Q4 = context.Summa_Q4; }
Примеры сценариев для блоков Вы можете изучить в статье "Работа с блоками в сценариях".
Тогда при использовании простого процесса, получим следующее отображение в веб-части.
При открытии задачи «Заполнение значений» строка блока Sale_Sum уже создана, и ей присвоены первоначальные значения:
После добавления строк в блок Sale_Product значения блока Sale_Sum автоматически перечитываются:
Использование подобной реализации бывает удобно, когда в процессе значения текущих показателей вводятся одним пользователем, а другому пользователю необходимо выводить на форму лишь значение агрегированных показателей.