Запись результата операции над элементами блока в другой блок

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

Пусть у нас есть два блока:

  • Блок Объем продаж. Блок содержит в себе информацию об объеме продаж (шт.) продукта компании за каждый квартал.

    Свойства блока:

    Наименование – товар, тип Строка;

    1 квартал – значение объема продаж по данному продукту в 1-м квартале, тип Целое число;
    2 квартал – значение объема продаж по данному продукту в 2-м квартале, тип Целое число;
    3 квартал – значение объема продаж по данному продукту в 3-м квартале, тип Целое число;
    4 квартал – значение объема продаж по данному продукту в 4-м квартале, тип Целое число.
  • Блок Всего. Блок содержит информацию об объеме продаж за каждый квартал по всем продуктам вместе. Блок и его свойства доступны только для чтения.

    Свойства блока:

    Sum – продукт, тип Строка;

    1 квартал – значение объема продаж по всем продуктам в 1-м квартале, тип Целое число;
    2 квартал – значение объема продаж по всем продуктам в 2-м квартале, тип Целое число;
    3 квартал – значение объема продаж по всем продуктам в 3-м квартале, тип Целое число;
    4 квартал – значение объема продаж по всем продуктам в 4-м квартале, тип Целое число.

Напишем сценарий, который при заполнении значений первого блока будет автоматически заполнять значения второго блока. Для этого будем использовать стандартный сценарий при изменении, привязанный к переменной блока Объем продаж. Такой сценарий будет выполняться при добавлении нового элемента или сохранении изменений в уже существующем элементе блока. То есть при каждом изменении блока Объем продаж полностью пересчитываются значения блока Всего.

Для использования сценариев должно быть подключено пространство имен:

using EleWise.ELMA.Model.Services;

Первоначально при открытии задачи блок Всего не будет иметь ни одной строки, поэтому необходимо добавить строку, которая будет содержать в себе значения сумм:

public virtual void LoadForm (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
        {
            var newRow = InterfaceActivator.Create<P_RabotaSBlokamiVScenarii_Total> ();  //создаем строку блока Total
            newRow.Quarter1 = 0;  // ячейкам присваиваем значение «0»
            newRow.Quarter2 = 0;
            newRow.Quarter3 = 0;
            newRow.Quarter4 = 0;
            newRow.Name = "Сумма";//присваиваем первой ячейке значение «Сумма»
            context.Total.Add (newRow); // добавляем созданную строку в блок Total
                    }
Внимание!
При работе с элементами блока (item-ы) НЕ НУЖНО вызывать метод item.Save(), так как это может привести к нарушению целостности базы данных.

Теперь суммируем значения по первому блоку Объем продаж и записываем результат во второй блок Всего. Для передачи значения используем дополнительные переменные:

Sum_Q1 – значение объема продаж по всем продуктам в 1-м квартале, тип Целое число;
Sum_Q2 – значение объема продаж по всем продуктам в 2-м квартале, тип Целое число;
Sum_Q3 – значение объема продаж по всем продуктам в 3-м квартале, тип Целое число;
Sum_Q4 – значение объема продаж по всем продуктам в 4-м квартале, тип Целое число.

public virtual void SumBlock (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
        {
            int Sum_Q1 = 0; // переменным присваиваем значение «0»
            int Sum_Q2 = 0;
            int Sum_Q3 = 0;
            int Sum_Q4 = 0;
 
                foreach (var item in context.VolumeSales)
              {
                  if(item.Quarter1 == null) // проверяем, заполнено ли значение ячейки, если нет, присваиваем значение «0»
                 item.Quarter1 = 0;
                 if(item.Quarter2 == null)
                 item.Quarter2 = 0;
                 if(item.Quarter3 == null)
                 item.Quarter3 = 0;
                 if(item.Quarter4 == null)
                 item.Quarter4 = 0;
             
                Sum_Q1 += (Int32)item.Quarter1; //в контекстную переменную добавляем значение ячейки блока VolumeSales
                Sum_Q2 += (Int32)item.Quarter2;
                Sum_Q3 += (Int32)item.Quarter3;
                Sum_Q4 += (Int32)item.Quarter4;
              }
   
            foreach (var item in context.Total.ToList())
            {
                item.Quarter1 = Sum_Q1; //в ячейки блока Total записываем значения переменных
                item.Quarter2 = Sum_Q2;
                item.Quarter3 = Sum_Q3;
                item.Quarter4 = Sum_Q4;
            }
        }

Тогда при использовании простого процесса, получим следующее отображение в веб-части. При открытии задачи "Список товаров" строка блока Всего уже создана, и ей присвоены первоначальные значения:

После добавления строк в блок Объем продаж значения блока Всего автоматически пересчитываются:

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