有没有办法检测插入的记录是触发器中克隆操作的结果?
作为托管包的一部分,我想在克隆 Opportunity 和 OpportunityLineItem 记录时清除一些自定义字段。
或者触发器不是防止某些字段被克隆的正确位置?
我曾考虑创建专用代码来调用 sObject.Clone() 并排除不需要的字段。这似乎不是受管软件包的理想解决方案,因为它还会排除 Opportunity 上的任何其他自定义字段。
有没有办法检测插入的记录是触发器中克隆操作的结果?
作为托管包的一部分,我想在克隆 Opportunity 和 OpportunityLineItem 记录时清除一些自定义字段。
或者触发器不是防止某些字段被克隆的正确位置?
我曾考虑创建专用代码来调用 sObject.Clone() 并排除不需要的字段。这似乎不是受管软件包的理想解决方案,因为它还会排除 Opportunity 上的任何其他自定义字段。
在Winter '16 版本中,Apex 有两种新方法,可让您检测是否正在克隆记录以及来自哪个源记录 ID。您可以在触发器中使用它。
isClone()
- 如果实体是从某物克隆的,则返回 true,即使该实体尚未保存。getCloneSourceId()
- 返回从中克隆对象的实体的 ID。一种方法(尽管有点笨拙)是创建一个新字段,例如 original_id__c,当记录的销售人员 ID 为空白时,该字段由工作流(或触发器,取决于您对执行顺序的偏好)填充。对于新记录,此字段将匹配标准 salesforce id,而对于克隆记录则不会。关于何时、如何以及用什么填充该字段有许多变化,但关键是给自己一个钩子来区分新记录和克隆记录。
如果您只想控制最终用户的体验(而不是扩展您的托管软件包的开发人员),您可以使用自定义页面覆盖标准克隆按钮,该页面使用url hacking清除字段子集的值。有一些注意事项,即对于单击克隆按钮的用户,该字段是可编辑的并且在页面布局上可见。在撰写本文时,我不相信您可以打包标准按钮覆盖,但列出了随着版本发布可能发生的变化。
您无法检测到触发器内的克隆操作。它被视为“插入”操作。
您仍然可以使用专用代码来调用 sObject.Clone() 并排除不需要的字段。您可以通过使用 sObject 描述信息来确保包含所有字段,以获取该对象的所有字段,然后排除不需要的字段。
希望这是有道理的!
阿努普