logo

Динамические формы задач БП: запись результата операций над элементами блока в другой блок

При использовании блоков в процессных задачах бывает необходимо значения переменных из одного блока записать в виде значений переменных другого блока. Рассмотрим запись суммы значений столбца одного блока в другой блок.

Пусть у нас есть 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;
      }
Важное замечание
При работе с элементами блока (item-ы) НЕ нужно вызывать метод item.Save(), так как это может привести к нарушению целостности базы данных.

Примеры сценариев для блоков Вы можете изучить в статье "Работа с блоками в сценариях".

Тогда при использовании простого процесса, получим следующее отображение в веб-части.

При открытии задачи «Заполнение значений» строка блока Sale_Sum уже создана, и ей присвоены первоначальные значения:

После добавления строк в блок Sale_Product значения блока Sale_Sum автоматически перечитываются:

Использование подобной реализации бывает удобно, когда в процессе значения текущих показателей вводятся одним пользователем, а другому пользователю необходимо выводить на форму лишь значение агрегированных показателей.