В релизе Winter ’21 Salesforce представил Before Delete Record-Triggered Flow. В этой статье рассмотрим его возможности.
Данный тип Flow будет активироваться при удалении записи до того, как операция удаления будет инициирована и завершена.
Значения полей записи, которая запускает Flow Trigger, доступны в глобальной переменной $Record во всем Flow. Их можно использовать в родительских и дочерних релейтед записях.
Важный момент: в отличие от Before Insert и Before Update Flow триггеров, где доступны только Get Records элемент, в Before Delete Flow доступны все четыре элемента (Get, Create, Update и Delete). Все эти операции, с любым видом записей, могут быть выполнены до того, как запись будет удалена.
Рассмотрим пример использования Before Delete Record-Triggered Flow
У нас есть требование удалять любую запись Contact даже при наличии у него релейтед записей Case. В таких случаях просто удалить Contact мы не можем, т.к. получим ошибку.
Удалить данную запись Contact можно будет только после удаления всех релейтед Cases.
Данный процесс нам нужно автоматизировать, т.к. если понадобится удалить много записей, то в каждой из них проверять, а затем и удалять все Cases - это трудоемкий процесс. Ранее у нас был только один выбор - писать Apex Trigger, но сейчас появился Before Delete Record-Triggered Flow, так что попробуем использовать его.
И немного усложним логику: будем удалять только те записи Contact, в которых поле Level имеет значение Tertiary
Выполнение
Переходим в Setup, далее - Process Automation - и выбираем пункт Flows. Создаем новый Flow по нажатию кнопки New Flow и выбираем пункт Record-Triggered Flow
Далее жмем Next, выбираем удобный для себя лейаут
Кликаем на Edit на стартовом элементе для выбора типа Record Triggered Flow
И выбираем “A record is Deleted”
Теперь в стартовом элементе выберем объект и зададим критерии срабатывания Flow
В нашем случае это будет Contact с описанным выше условием. С релиза Winter '21 мы можем активировать Flow Trigger при определенном заданном условии. Записи, которые не соответствуют этому условию, Flow Trigger запускать не будет.
Далее нужно получить все релейтед записи Case, используя элемент Get Record.
Перетаскиваем элемент Get Record на лейаут и даем ему имя. Выбираем объект, записи которого нам надо получить - Case. И в фильтре указываем, что значения поля ContactId на объекте Case должно быть равно Id записи Contact. Для этого используем глобальную переменную $Record и Id записи Contact, которая запустила Flow. В “How Many Records to Store” - выбираем “All records”, а в “How to Store Record Data” - “Automatically store all fields”.
Теперь добавим элемент Decision для того, чтобы проверить, вернул ли элемент Get Records “Cases” какие либо записи Case, которые подлежат удалению.
В случае если у нас нет записей, то Flow перестает действовать, а если записи есть, то их нужно удалить. Для этого используем элемент Delete Records.
Где указываем, какие записи нужно будет удалить. После — соединяем все элементы.
Далее сохраняем и активируем Flow.
Этот Flow сработает при удалении записи Contact, у которой поле Level установлено в значении Tertiary. Flow удалит релейтед Cases, если они есть. И поскольку они удалятся в контексте до удаления записи Contact, то сама запись Contact удалится успешно.
Как видите, Flow отработал, Contact с релейтед Cases успешно удалился.
Данный Flow дает нам возможность не писать каждый раз код, когда нам нужно выполнить какую-либо Before Delete логику.