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

时间:2012-07-29 06:57:45

标签: triggers salesforce apex-code

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

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

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

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

3 个答案:

答案 0 :(得分:9)

Winter '16 release中,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

答案 1 :(得分:5)

一种方法,虽然有点kludgy,但是会创建一个新字段,比如original_id__c,当使用salesforce id为空时,它会被工作流(或触发器,取决于您对order of execution的偏好)填充的记录。对于新记录,此字段将匹配标准salesforce id,而不是克隆记录。关于何时以及如何以及如何填充该字段有许多变化,但关键是给自己一个自己的钩子来区分新的和克隆的记录。

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

答案 2 :(得分:1)

您无法在触发器内检测克隆操作。它被视为“插入”操作。

您仍然可以使用专用代码来调用sObject.Clone()并排除不需要的字段。您可以使用sObject描述信息来确保包含所有字段,以获取该对象的所有字段,然后排除不需要的字段。

希望这是有道理的!

阿努普