競價排名Demo,

來源:互聯網
上載者:User

競價排名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
    查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.