检测何时在触发器中克隆记录

Dan*_*ger 15 triggers salesforce apex-code

有没有办法检测插入的记录是否是触发器中克隆操作的结果?

作为托管包的一部分,我想在克隆Opportunity和OpportunityLineItem记录时清除一些自定义字段.

或者是一个触发器不是防止某些字段被克隆的正确位置?

我曾考虑过创建专用代码来调用sObject.Clone()并排除不需要的字段.这似乎不是托管包的理想解决方案,因为它还会排除Opportunity上的任何其他自定义字段.

Dou*_*ers 10

在2016年冬季版本中,Apex有两种新方法可以让您检测是否正在克隆记录以及来自哪个源记录ID.您可以在触发器中使用它.

  • isClone() - 如果实体是从某个东西克隆的,则返回true,即使该实体尚未保存.
  • getCloneSourceId() - 返回克隆对象的实体的ID.

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


Ral*_*way 5

一种方法,尽管有点类似,就是创建一个新的字段,比如original_id__c,当用记录的salesforce id填空时,它会被工作流(或触发器,取决于你对执行顺序的偏好)填充.对于新记录,此字段将匹配标准salesforce id,而不是克隆记录.关于何时以及如何以及如何填充该字段有许多变化,但关键是给自己一个自己的钩子来区分新的和克隆的记录.

如果您只想控制最终用户的体验(而不是扩展托管包的开发人员),您可以使用自定义页面覆盖标准克隆按钮,该页面使用网址黑客清除字段子集的值.有一些警告,即对于单击克隆按钮的用户,该字段在页面布局上是可编辑和可见的.在撰写本文时,我不相信您可以打包标准按钮覆盖,但列出了可能发生的变化.