您的位置:首页 > 其它

竞价排名Demo - after insert / after update更新记录(防止递归)

2017-06-23 18:06 399 查看
背景介绍:现有应标对象,供应商和招标项目三个对象,其中应标对象为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 aft
b6dc
erUnDelete() {

}

}
BidRecordTriggerFunction.cls
public class BidRecordTriggerFunction {
public static boolean isExecuting = false;// avoid recursion
/**
功能说明:根据应标金额排序
参数说明:应标记录集合
返回值:null
作者:Wilson
日期:2017-06-20
**/
public static void sortByBidAmount(List<Advertiser_Tender_Relationship__c> atrs){
if(BidRecordTriggerFunction.isExecuting) {
return;
}
BidRecordTriggerFunction.isExecuting = true;

// excute your code logic. such as update Advertiser_Tender_Relationship__c list records.

BidRecordTriggerFunction.isExecuting = false;

}
}
遇到过的问题:假如没做递归处理,在after update的Trigger中更新竞价排名字段,会因为递归而报错,最终导致并没有更新竞价排名。
解决方案:目前有两种方案,一种是为触发器增加一个布尔类型的开关来控制死循环;另一种是“用完即走”的理念,即“按需调用方法,档需要去执行某段逻辑时,才去调用相应的方法”,我同事于是说。

补充:在after trigger里面再去更新记录,就会无限循环,造成query 101。
Salesforce官方提供的防止递归策略:
Class Code:
public Class checkRecursive{
private static boolean run = true;
public static boolean runOnce(){
if(run){
run=false;
return true;
}else{
return run;
}
}
}Trigger Code:
trigger updateTrigger on anyObject(after update) {

if(checkRecursive.runOnce()) {
//write your code here
}

}
参考资源:https://help.salesforce.com/articleView?id=000133752&language=en_US&type=1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐