2012-07-29 52 views
14

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

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

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

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

+0

思路:克隆 - 能够控制哪些字段被克隆(http://success.salesforce.com/ideaview?id=08730000000BpUXAA0) – 2012-07-29 09:40:04

回答

6

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

+0

这需要更多的爱 – booky99 2018-01-08 17:33:00

1

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

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

希望这是有道理的!

阿努普

5

一种方法,虽然那种缺憾,是创建一个新的领域,说original_id__c,它获取由工作流填充(或触发,根据您的喜好为order of execution)时,与空白salesforce的记录ID。对于新记录,该字段将与标准salesforce id相匹配,对于克隆记录他们不会。关于什么时候以及如何以及如何填充该字段有很多变化,但关键是要给自己一个钩子来区分新的和克隆的记录。

如果您只是想要控制最终用户的体验(与开发人员扩展托管软件包相反),则可以使用自定义页面来覆盖标准克隆按钮,该页面将清除使用字段子集的值url hacking。有一些警告,即该字段是可编辑的,并在点击克隆按钮的用户的页面布局上可见。在写这篇文章时,我不相信你可以打包标准按钮覆盖,但是可能的变化列表会随着发布而改变。