SFDC之trigger那些事兒

2021-08-07 05:11:52 字數 3281 閱讀 7679

初學salesforce 的apex開發,trigger可以說的開發者的基本功了。

trigger的定義模式如下:

trigger triggername on objectname (trigger_events)

triggername相當於trigger的命名,objectname指trigger繫結的類的名字,trigger_events指能引起**觸發的條件,主要有insert,update,delete,merge,upsert,undelete六種,本文主要介紹insert,update和delete三種。

trigger的型別包括兩種

建立乙個測試用例testtrigger__c,裡面含欄位status__c,觸發器**如下:

trigger testtrigger on testtrigger__c (before insert,before update,before delete,after insert,after update,after delete) 

//更新前

if(trigger.isupdate)

//刪除前

if(trigger.isdelete)

} if(trigger.isafter)

//更新後

if(trigger.isupdate)

//刪除後

if(trigger.isdelete)

}}

新建乙個

testtrigger__c物件,控制台輸出可以看到:

*******插入前trigger.new********(testtrigger__c:)

*******插入前trigger.newmap********null

*******插入前trigger.old********null

*******插入前trigger.oldmap********null

*******插入後trigger.new********(testtrigger__c:)

*******插入後trigger.newmap********}

*******插入後trigger.old********null

*******插入後trigger.oldmap********null

修改物件,控制台輸出看到:

*******更新前trigger.new********(testtrigger__c:)

*******更新前trigger.newmap********}

*******更新前trigger.old********(testtrigger__c:)

*******更新前trigger.oldmap********}

*******更新後trigger.new********(testtrigger__c:)

*******更新後trigger.newmap********}

*******更新後trigger.old********(testtrigger__c:)

*******更新後trigger.oldmap********}

刪除物件,控制台輸出可以看到:

*******刪除前trigger.new********null

*******刪除前trigger.newmap********null

*******刪除前trigger.old********(testtrigger__c:)

*******刪除前trigger.oldmap********}

*******刪除後trigger.new********null

*******刪除後trigger.newmap********null

*******刪除後trigger.old********(testtrigger__c:)

*******刪除後trigger.oldmap********}

上述結果可以看到,trigger.new等變數不是在任何時候都會有值,當它實際上等於null的時候,在trigger_events下是沒有意義的。

對於trigger中的new/old變數需要注意的是,它的實質的乙個list集合的儲存形式,裡面包含的不僅只是乙個物件的值,更多的是針對批處理的情況、apex開發後期使用dataloader匯入使用者資料就是很典型的一種批處理場景。所以在開發的時候,我們更多的要針對多條資料進行處理。

listlist_test = trigger.new
if(trigger.isbefore)

}}

每次新建testtrigger__c物件的時候,將狀態都修改為「狀態二」

而對於trigger中的newmap/oldmap變數,實質是乙個map儲存了物件的id和物件,通過id可以取出對應的sobject。

下面舉個例子

trigger testtrigger on testtrigger__c (after update)      

handler.onafterupdate(trigger.new,trigger.oldmap);

}}

/**

* author:小青

* time:2017-8-21

* function:testtrigger__c的狀態發生變化

* */

public class testtriggerhandle

listlist_update = [select id,status__c from testtrigger__c where id in :set_id];

for(testtrigger__c test : advlist)

}}

以上是常用的觸發器開發的方法,邏輯處理放在乙個handler類中,在觸發器中呼叫handler類的方法進行處理,從而實現**的分離,便於控制**的執行順序以及避免業務邏輯過於複雜。

最後,對於觸發器的開發需要理解,例如trigger.new在before insert中,不需要進行dml操作就可以直接修改記錄的資料,然後就能進行儲存,而在after update中,並不能直接使用trigger.new所代表是資料,因為這條記錄已經被插入到資料庫中,這時候直接進行dml操作會報錯,所以需要我們用乙個set記錄下對應的id然後再進行一次查詢,對這個查詢出來的集合重新dml操作就沒有問題了。

餐館那些事之 Mediator Pattern

1.概述 mediator pattern 封裝了 一組物件之間的互動,使得物件之間保持松耦合的關係,避免物件維護複雜的關係互動。簡單的說,mediator封裝的是互動。類圖 object例項之間的互動,統一由mediator維護。2.例項 餐館有cook和waiter,cook之間需要彼此交流配合...

前端那些事之 jQuery

1.jquery是什麼 乙個js的框架,可以方便的使用js 2 什麼是jquery物件 是由jquery封裝後的dom物件 注意 與dom物件的方法不同,不可以混用,但是可以相互轉換 3.基本語法 jquery物件.方法 4.得到jquery物件 1 選擇器 基本選擇器 id class eleme...

Http之Auth的那些事

謹以此文獻給那些需要實現http auth的 程式猿 們。關於http auth的文件不多。rfc在 wiki在 使用http auth需要在server端配置http auth資訊 一般是webserver啟動的時候從配置檔案裡面讀取相關資訊 我用中文簡述一下http auth的過程 一次典型的訪...