Рассмотрим ситуацию когда нужно автоматизировать определенный бизнес процесс не используя Apex при этом нужно будет работать с коллекцией объектов. Из всех графических средств автоматизации в Salesforce, нам может помочь только Visual Workflow.
Содержание:
Суть задачи
Реализация
Заключение
Задача.
И так суть задачи:
Существует два объекта «Opportunity Product» - стандартный, «Subscription__c» - кастомный. Между ними Lookup связь то-есть объект «Subscription__c» - родитель и может иметь много «Opportunity Product» - дочерних объектов. Нужно на объекте «Subscription__c» в текстовом поле записывать названия продуктов из всех объектов «Opportunity Product» относящихся к одному «Subscription__c» через запятую. Текстовое поле на объекте «Subscription__c» нужно обновлять всякий раз когда добавляется или редактируется продукт.
Для того что бы решить эту задачу создадим связку из Process builder и Visual Workflow.
Process builder нам нужен, для того чтобы запускать Visual Workflow когда запись продукта обновляется или создается.
Visual Workflow будем использовать для перебора коллекции объектов и обновления текстового поля на объекте «Subscription__c».
Начнем с создания Visual Workflow.
Вот так выглядит готовая схема Visual Workflow. Начнем по порядку нумерации элементов на схеме.
Реализация задачи.
1. Создание Fast Lookup;
2. Создание Loop;
3. Создание Record Lookup;
4. Создание Assignments;
5. Создание Record Update;
Flow – декларативный инструмент автоматизации позволяющий максимально гибко автоматизировать бизнес процесс не используя Apex. Но в отличие от Process Builder и Workflow запускается пользователем по нажатию на кнопку или можно вызвать Flow из Apex или Process Builder. Каждый элемент представляет собой действие, которое может выполнять Flow. Например чтение или запись данных Salesforce, отображение информации и сбор данных от пользователей, выполнение бизнес-логики или управление данными.
1. Добавим первый элемент на схему под названием Fast Lookup.
Чтобы это сделать нужно на вкладке «Palette» найти нужный элемент ниже в списке и перетащить его на схему.
Fast Lookup – элемент, который находит записи определенных объектов по критериям поиска, и может сохранить результат в переменную созданную пользователем. Переменная может быть двух типов: просто sObject если результат возвращает одну запись или коллекция sObjects. Это работает как SOQL запрос в Apex.
Появится окно настройки Fast Lookup.
В разделе «General Settings» указываем имя элемента:
Name | : Product Names |
Unique Name | : Product_Names |
В разделе «Filters and Assignments» в поле «Look up» выбираем нужный объект для поиска у нас это OpportunityLineItem (Opportunity Product) и ниже добавляем критерии для поиска:
Мы будем искать по кастомному полю «TL_Subscription__c» из объекта OpportunityLineItem которое должно быть равно Id сохраненному в переменной {!SubscriptionId}.
Переменная {!SubscriptionId} инициализируется при помощи Process builder который будет вызывать наш Flow. Именно при вызове Flow и передается значение в переменную {!SubscriptionId}.
Чтобы создать переменную {!SubscriptionId} нужно:
-
В поле «Value» из выпадающего списка выбрать CREATE NEW – Variable;
-
Появиться окно создания переменной здесь нужно указать имя переменно «SubscriptionId» и Data Type – Text, нажать OK.
Дальше в поле «Variable» нам нужно указать переменную в которую мы будем сохранять результат. Для этого нам нужно создать переменную аналогично как предыдущую только нужно выбрать создание SObject Collection Variable
И последнее что нужно сделать это указать поля объекта которые будут возвращены в результате поиcка.
В нашем случае нас интересует только стандартное поле «Product2Id».
После этого сохранить элемент Fast Lookup и отметить его как первый элемент с которого будет начинаться Flow. Для это нужно навести курсор на элемент и нажать на зеленый кружочек в углу как на рисунке ниже.
2. Создадим новый элемент «Loop».
Loop – элемент позволяющий перебирать коллекции sObject. Создается он точно так же как и «Fast Lookup».
И заполним как показано ниже на рисунке.
В разделе «Assignments» в поле «Loop through» выбираем из выпадающего списка раннее созданную нами коллекцию
В поле «Loop Variable» создадим новую переменную {!sProduct} куда будет сохраняться каждый элемент коллекции поочередно.
3. Создадим элемент «Record Lookup»
Record Lookup очень похож на Fast Lookup, но в результате возвращает только определенные поля одной записи. Заполним как на картинке ниже.
Так же как и Fast Lookup здесь в разделе «Filters and Assignments» указывается объект для поиска и критерии поиска. В нашем критерии мы находим объект по его Id который мы берем из переменной {!sProduct} а точнее из поля этой переменной {!sProduct.Product2Id}.
Ниже мы указываем что нас интересует поле Name и значение этого поля мы присваиваем переменной {!Product2Name}, которую по аналогии создания предыдущих переменных нужно создать.
4. Создадим элемент «Assignments».
Assignments позволяет присваивать значения любым переменным созданным в Flow.
Так как нам в результате нужно иметь строку со всеми именами продуктов через запитую,
то Assignments будет добавлять каждое новое имя продукта в одну текстовую переменную пока мы перебираем коллекцию продуктов.
{!AllProductName} — это переменная в которую будут сохранятся имена продуктов.
{!TestFormula} — формула, которая будет добавлять новое значение в {!AllProductName}.
Вот как выглядит сама формула:
IF(OR(ISBLANK({!AllProductName}),ISNULL({!AllProductName})),
{!Product2Name}, ','+{!Product2Name})
Формула создается аналогично переменной:
5. Создадим элемент «Record Update».
Record Update позволяет обновить любую запись любого объекта.
В разделе «Filters and Assignments» указывается объект в поле «Update» и критерии поиска нужной записи. Мы ищем по Id записи.
Дальше выбираем нужные поля для обновления и присваиваем им новое значение у нас это
поле «Product_Name__c», а значение мы берем из переменной {!AllProductName}.
После всего нужно проставить стрелочки, которые определяют последовательность выполнения элементов в Flow, как на самой первой картинке в статье.
Как это сделать:
Наводим курсор на ромбик под элементом и перетягиваем стрелочку к нужному элементу.
В конце сохраняем наш Flow при этом нужно обязательно указать Type = Autolaunched Flow, чтоб к нему можно было обратится из Process builder.
Заключение
В заключении оставлю ссылки где можно детальней ознакомится с возможностями Flow
- Trailhead
https://trailhead.salesforce.com/content/learn/modules/business_process_automation
https://trailhead.salesforce.com/en/content/learn/trails/automate_business_processes - Developer Documentation
https://help.salesforce.com/articleView?id=vpm_lightning_flow.htm&type=5
https://developer.salesforce.com/docs/atlas.en-us.salesforce_vpm_guide.meta/salesforce_vpm_guide/vpm_designer_flow_create.htm
https://developer.salesforce.com/docs/atlas.en-us.salesforce_vpm_guide.meta/salesforce_vpm_guide/vpm_considerations_design.htm
В следующей статье «Обход коллекции в Flow и вызов его из Process builder (Часть 2)» создадим Process builder который будет вызывать наш Flow.