Обнаруживать, когда запись клонируется в триггере

Есть ли способ обнаружить, что вставленная запись является результатом операции клонирования в триггере?

Как часть управляемого пакета, я хотел бы очистить некоторые пользовательские поля, когда клонируются записи Opportunity и OpportunityLineItem.

Или триггер не является правильным местом для предотвращения клонирования определенных полей?

Я подумал о создании выделенного кода для вызова sObject.Clone() и исключения полей, которые не требуются. Это не похоже на идеальное решение для управляемого пакета, так как это также исключает любые другие настраиваемые поля в Opportunity.

Ответы

Ответ 1

В выпуске Winter '16 у Apex есть два новых метода, которые позволяют вам определить, клонируется ли запись и из какого идентификатора записи источника, Вы можете использовать это в своих триггерах.

  • isClone() - Возвращает true, если объект клонирован от чего-то, даже если объект не был сохранен.
  • getCloneSourceId() - возвращает идентификатор объекта, из которого клонирован объект.

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_sobject.htm#apex_System_SObject_getCloneSourceId

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_sobject.htm#apex_System_SObject_getCloneSourceId

Ответ 2

Один из подходов, хотя и вроде kludgy, должен был создать новое поле, скажем, original_id__c, которое заполняется рабочим процессом (или триггером, в зависимости от вашего предпочтения порядка исполнение), когда пробел с идентификатором salesforce записи. Для новых записей это поле будет соответствовать стандартным идентификаторам Salesforce, для клонированных записей они не будут. Существует множество вариантов того, когда и как и что заполнять поле, но ключ состоит в том, чтобы дать вам собственный крюк, чтобы отличать новые и клонированные записи.

Если вы хотите контролировать опыт для конечного пользователя (в отличие от разработчика, расширяющего ваш управляемый пакет), вы можете переопределить стандартную кнопку клонирования с помощью специальной страницы, которая очищает значения для подмножества полей, используя взломать URL. Есть некоторые оговорки, а именно, что поле доступно для редактирования и видимо на макете страницы для пользователя, который нажал кнопку клонирования. На данный момент я не верю, что вы можете упаковать стандартные переопределения кнопок, но список возможных изменений при выпуске.

Ответ 3

Вы не можете обнаружить операцию клонирования внутри триггера. Он обрабатывается как операция "Вставить".

Вы можете использовать выделенный код для вызова sObject.Clone() и исключить поля, которые не требуются. Вы можете обеспечить включение всех полей с помощью sObject для описания информации, чтобы получить все поля для этого объекта, а затем исключить поля, которые не требуются.

Надеюсь, это имеет смысл!

Anup