33 Проход по коллекции

advertisement
Глава 3.3 Проход по коллекции
По всем и для каждого
Действие “Для каждого” (For each) – используется для последовательной обработки
данных в коллекциях. Коллекции чаще всего получается в результате запроса к
списка. Набор значений, хранящихся в коллекци обрабатывается с помощью
действия “Для каждого” методом последовательного прохода от первого элемента
коллекции и до последнего элемента.
Внутри действия “Для каждого” нужно определить набор действий, которые будут
выполнятся для каждого прохода. Таким образом вы можете определить каким
образом обрабатывается коллекция.
С каждым проходом внутри действия “Для каждого” определяется текущее значение
Текущий элемент обработки определяется при каждом проходе Другие действия можно перетащить в конструктор как дочерние действия по
отношению к действию Для каждого, и эти действия будут выполняться для каждого
значения в коллекции. Текущее значение коллекции доступно для каждого
дочернего действия через переменную рабочего процесса.
Параметры действия “Для каждого”
Действие “Для каждого” определяется следующими параметрами:
 Целевая коллекция - коллекция, для которой выполняется цикл. Коллекция
определяется как переменная процесса и заполняется заранее.
 Сохранять результат в – значение элемента коллекции которая соотвествует
текущем проходу
 Индекс – числовая переменная, в которую будет при каждом проходе
устанавливаться номер прохода. Первый проход нумеруется как нулевой.
 Остановить обработку - Для прерывания цикла можно задать переменную
типа «Да/Нет».
Как это работает
Зачем все таки?
Зачем нам может понадобиться действие “Для каждого”? Представьте себе что
переда вами стоит на текущем шаге процесса одна из следующих задач:
 Посчитать сумму скидки по линиям заказа – причем в самих линиях заказа
указана только сумма и процент скидки
 Установить категорию для выборки импортированных компаний исходя из
отрасли, количества сотрудников, оборота
 Отправить электронные сообщения исполнителям, которые не выполнили
рекомендации аудита в срок на сегодня
В каждом из приведенных случаев нам необходимо провести обработку набора
данных или выполнить какие –то действия для определенной выборки. Для того
чтобы выполнить проход по определенному набору данных нам и нужны коллекции.
Создаем коллекцию
Перед тем как начать работать с коллекций вам надо завести как минимум две
переменных. Самая главная переменная – это переменная с типом Коллекция - для
того чтобы указать действию целевую коллекцию
Перед началом работы вы не просто должны создать переменную для целевой
коллекции – но и заполнить ее значением. Чаще всего коллекции заполняются в
результате запросов к спискам или к базам данных.
Рисунок 1 Запрос к списку
Переменная для значения
Вторая важная переменная-параметре – это переменная которая указывается в поле
“Сохранять результат в”. Тут вы можете указывать переменную с типом Строка /
Число / Пользователь – для того чтобы определить место хранения для
перебираемых значений из целевой коллекции.
Надо быть крайне осторожным с типом переменной для хранения перебираемых
значений – она должна быть совместима со всеми значениями в коллекции. У вас
может быть ситуация когда большинство получаемых значений конвертируются в
число – но одно из них нет. Например, из-за неверно используемого символа
разделения целой части. При несовпадении типов при их конвертации вы получите
ошибку и процесс немеделнно остановится.
После того как мы сформировали значения коллекции, подготовили переменную для
хранения результатов прохода по коллекции мы можем начинать работу с
коллекцией.
Какой такой индекс?
Кроме двух основных параметров есть еще два не основных. Один из них – Индекс.
Если вы зададите переменную в параметре Индекс – то вы сможете вместе с текущим
значением прохода по элементам коллекции получать их номер в коллекции. Это
может вам помочь, например, в таких случаыях:
 При отладке – когда вы будете писать детальную информацию об обработке
элементов – указывать в журнал номер элемента в коллекции
 Когда необходимости подсчитать сколько элементов было обработано на
каждом этапе.
 Для использования номера в форматировании вывода – при генерации текста
ставить номер для каждого элемента
Индекс – это числовая переменная. Особенность нумерации элементов коллекции
заключается в том что программисты научились считать с 0 а не с 1 – как все
нормальные люди. Поэтому первый элемент в коллекции будет иметь значения
переменной в индексе как 0. Второй – 1. Третий – 2. Ужасно, но такова природа
программистов!
Побежали!
С началом работы действия “Для каждого” из коллекции выбирается самый первый
элемент из целевой коллекции. Это первое полученное значение из первого прохода
по коллекции. Его значение запсывается в переменную, указанную в настройка
действия в поле “Сохранять результат в”. Это основная рабочая переменная данного
действия.
Внутри действия “Для каждого” мы можем определить набор действий для
обработки полученной переменной. Это могут быть действия с проверками,
расчетами или действия создающие специальный записи в системе. Именно эти
действия будут использовать переменную с текущим значением прохода по
коллекции.
После того как мы обработали первое полученное значение мы можем перейти к
следующему значению. Механизм действия для каждого сдвинет свой указатель на
следующий элемент, индекс следующего элемента увеличится на единицу. Таким
образом мы получим второй элемент коллекции – и так далее – пока элементы
коллекции не закончатся.
Обратите внимание на то что количество элементов в коллекции может быть разным
– 100,30,3,1 и даже 0. В случае если вы стартовали с пустой коллекцией – действие
Для каждого выполнится без единого прохода. В случае если в коллекции будет всего
один элемент – выполнится один проход.
Нажми, кондуктор, на тормоза!
У нас остался последний параметр действия “Для каждого” – “Остановить обработку”.
С помощью него вы можете прервать ход обработки коллекции. Зачем это нужно:
 Вы обрабатывали коллекцию с целью найти определенный элемент – и вот вы
нашли его! Зачем обрабатывать остальные элементы? Самое время сказать
СТОП!
 Вы обработали нужное количество элементов? Машина устала? СТОП!!
 При обработке коллекции сумм денег вы обнаружили следующее значение
“денег нет” – это явная ошибка в исходных данных! СТОП!!!
Для того чтобы вы могли в нужный момент сказать обработчику СТОП! – вам
необходимо установить значение переменной указанной в параметре “Остановить
обработку” значение Да. Пока значение этой переменной “Нет” обработка будет
продолжаться.
Практика использования Прохода по коллекции
Пример обработки переменных с типом Денежное значение
Рассмотрим пример использования действия “Для каждого” для обработки линий
заказа. В нашем примере в линиях заказа хранятся детали заказа – какой товар был
заказ, в каком количестве и какая сумма к оплате по каждой линии. Поле сумма
заказа имеет тип “Денежное значение”.
Для того чтобы получить общую сумму заказа мы в процессе выполним “Запрос к
списку”.
Внимание! При опросе поле с типом “Денежное значение” в коллекцию попадут не
число суммы – а строка – сумма и код валюты. Например, для суммы в гривне формат
может бысть следующим: 100,00 грн. Это обстоятельство затрудняет обработку
данных сумм посредством математических операций а также делает невозможным
присвоение напрямую значения из коллекции в переменную с типом Число.
Для того чтобы трансформировать данные из формата “Денежное значение” в число
необходимо:
 В настройках действия указать переменную с типом “Однострочный текст”
 Обработать текст с помощью регулярного выражения – убрать валюту и
пересохранить значение в текстовую переменную уже без валюты.
 Конвертировать текстовое значение в числовое.
В итоге часть процесса в которой будет выполнена обработка будет выглядеть
следующим образом (изображение процесса разбито на две части для удобства
отображения в книге):
Рисунок 2 Схема рабочего процесса получения суммы по линиям заказа
Настройка действия для каждого в данном случае будет следующим:
Рисунок 3 Настройка действия Запрос к списку
В настройках действия “Для каждого” мы получаем значение суммы в виде строки
текста. Так как поле сумма имеет тип “Денежное значение” преобразование в число
невозможно. Если вы вместо текстовой переменной попробуете подставить
переменную с типом число – процесс выдаст ошибку и остановится на данном блоке.
Рисунок 4 Настройка действия “Для каждого”
В регулярном выражении мы обрабатываем переменную “Сумма к оплате по линии
(строка)” следующим образом:
Рисунок 5 Настройка действия "Регулярное выражение".
С помощью регулярного выражения переменная “Сумма к оплате по линии (строка)”
была очищена от текста с валютой суммы. После этого обновленное значене
переменной можно конвертировать в число и проводить над ним математические
операции (суммирование).
Download