有没有办法检测插入的记录是否是触发器中克隆操作的结果?
作为托管软件包的一部分,我想在克隆Opportunity和OpportunityLineItem记录时清除一些自定义字段。
或者触发器不是阻止克隆某些字段的正确位置?
我曾考虑过创建专用代码来调用sObject.Clone()并排除不需要的字段。这似乎不是托管包的理想解决方案,因为它还会排除商机上的任何其他自定义字段。
答案 0 :(得分:9)
在Winter '16 release中,Apex有两个新方法可以让您检测是否正在克隆记录以及来自哪个源记录ID。您可以在触发器中使用它。
isClone()
- 如果实体是从某个东西克隆的,则返回true,即使该实体尚未保存。getCloneSourceId()
- 返回克隆对象的实体的ID。答案 1 :(得分:5)
一种方法,虽然有点kludgy,但是会创建一个新字段,比如original_id__c,当使用salesforce id为空时,它会被工作流(或触发器,取决于您对order of execution的偏好)填充的记录。对于新记录,此字段将匹配标准salesforce id,而不是克隆记录。关于何时以及如何以及如何填充该字段有许多变化,但关键是给自己一个自己的钩子来区分新的和克隆的记录。
如果您只想控制最终用户的体验(而不是扩展托管包的开发人员),您可以使用自定义页面覆盖标准克隆按钮,该页面使用{清除字段子集的值{3}}。有一些警告,即对于单击克隆按钮的用户,该字段在页面布局上是可编辑和可见的。在撰写本文时,我不相信您可以打包标准按钮覆盖,但是可以随时发布的更改列表。
答案 2 :(得分:1)
您无法在触发器内检测克隆操作。它被视为“插入”操作。
您仍然可以使用专用代码来调用sObject.Clone()并排除不需要的字段。您可以使用sObject描述信息来确保包含所有字段,以获取该对象的所有字段,然后排除不需要的字段。
希望这是有道理的!
阿努普