競價排名Demo,
背景介紹:現有應標對象,供應商和招標項目三個對象,其中應標對象為junction object,串連了供應商和招標項目,現在需要根據應標對象中的競價金額為同一招標項目的應標記錄進行排序,即建立一個應標記錄或更新應標記錄的競價金額的時候,需要自動去計算當前應標記錄的排名(競價排名)。
Trigger設計模式:每個對象一個Trigger模式。
TriggerHandler.cls
/***********************************************************************Name:所有對象的Trigger邏輯分發抽象類別*Description:具體對象的Trigger Handler重寫相應觸發事件的處理方法======================================================History ------- VERSION AUTHOR DATE DETAIL 1.0 Wilson Xu 2017-06-23 Created***********************************************************************/ public abstract class TriggerHandler { public virtual void beforeInsert(){}//before insert事件處理方法 public virtual void beforeUpdate(){}//before update事件處理方法 public virtual void beforeDelete(){}//before delete事件處理方法 public virtual void afterInsert(){}//after insert事件處理方法 public virtual void afterUpdate(){}//after update事件處理方法 public virtual void afterDelete(){}//after delete事件處理方法 public virtual void afterUndelete(){}//after undelete事件處理方法 public void run(){ if(Trigger.isBefore && Trigger.isInsert) { this.beforeInsert(); } else if(Trigger.isBefore && Trigger.isUpdate) { this.beforeUpdate(); } else if(Trigger.isBefore && Trigger.isDelete) { this.beforeDelete(); } else if(Trigger.isAfter && Trigger.isInsert) { this.afterInsert(); } else if(Trigger.isAfter && Trigger.isUpdate) { this.afterUpdate(); } else if(Trigger.isAfter && Trigger.isDelete) { this.afterDelete(); } else if(Trigger.isAfter && Trigger.isUndelete) { this.afterUndelete(); } } }
BidRecordTrigger.trigger
/***********************************************************************Name:應標記錄觸發器*Description:可加一些其他條件限制Trigger是否觸發,比如加一個控制Trigger邏輯是否觸發的Custom Setting,滿足條件則運行run(),否則不運行======================================================History ------- VERSION AUTHOR DATE DETAIL 1.0 Wilson Xu 2017-06-23 Created***********************************************************************/ trigger BidRecordTrigger on Advertiser_Tender_Relationship__c (before insert,before update,before delete,after insert,after update,after delete,after undelete) { SkipTriggerSetting__c setting = SkipTriggerSetting__c.getInstance(); //如果目前使用者設定了不觸發Trigger,跳過Trigger觸發邏輯 if (setting != null && setting.DisableTrigger__c){ return; } new BidRecordTriggerHandler().run(); }
BidRecordTriggerHandler.cls
public class BidRecordTriggerHandler extends TriggerHandler { /** before insert事件處理邏輯 **/ public override void beforeInsert() { } /** after insert事件處理邏輯 **/ public override void afterInsert() { } /** before update事件處理邏輯 **/ public override void beforeUpdate() { } /** after update事件處理邏輯 **/ public override void afterUpdate() { /** before delete事件處理邏輯 **/ public override void beforeDelete() { } /** after delete事件處理邏輯 **/ public override void afterDelete() { } /** after undelete事件處理邏輯 **/ public override void afterUnDelete() { } }
BidRecordTriggerHunction.cls
public class BidRecordTriggerFunction { /** 功能說明: 參數說明: 傳回值: 作者:Wilson Xu 日期:2017-06-23 **/ public static void sortByBidAmount(List<Advertiser_Tender_Relationship__c> atrs){ // your code here. } }
遇到過的問題:假如沒做遞迴處理,在after update的Trigger中更新競價排名欄位,會因為遞迴而報錯,最終導致並沒有更新競價排名。
解決方案:目前有兩種方案,一種是為觸發器增加一個布爾類型的開關來控制死迴圈;另一種是“用完即走”的理念,即“按需調用方法,檔需要去執行某段邏輯時,才去調用相應的方法”,我同事於是說。
補充:在after trigger裡面再去更新記錄,就會無限迴圈,造成query 101。
-
頂
-
1
-
踩
-
0
查看評論