2012-07-29 23 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。有一些警告,即該字段是可編輯的,並在點擊克隆按鈕的用戶的頁面佈局上可見。在寫這篇文章時,我不相信你可以打包標準按鈕覆蓋,但是可能的變化列表會隨着發佈而改變。