16

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

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

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

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

4

3 回答 3

14

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

于 2016-09-13T15:22:28.810 回答
5

一种方法(尽管有点笨拙)是创建一个新字段,例如 original_id__c,当记录的销售人员 ID 为空白时,该字段由工作流(或触发器,取决于您对执行顺序的偏好)填充。对于新记录,此字段将匹配标准 salesforce id,而对于克隆记录则不会。关于何时、如何以及用什么填充该字段有许多变化,但关键是给自己一个钩子来区分新记录和克隆记录。

如果您只想控制最终用户的体验(而不是扩展您的托管软件包的开发人员),您可以使用自定义页面覆盖标准克隆按钮,该页面使用url hacking清除字段子集的值。有一些注意事项,即对于单击克隆按钮的用户,该字段是可编辑的并且在页面布局上可见。在撰写本文时,我不相信您可以打包标准按钮覆盖,但列出了随着版本发布可能发生的变化。

于 2012-07-29T22:10:46.157 回答
1

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

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

希望这是有道理的!

阿努普

于 2012-07-29T09:08:46.180 回答