アフィリエイト広告を利用しています

広告

posted by fanblog

2018年04月12日

SFDCトリガー一般的なテンプレ

salesforce トリガーについて
今回書こうと思います,
今回はとりあえずトリガーの実装は
一般的なテンプレを共有したいと思います。
トリガーの実行回数もこの記事の最後に話そうと思います。



この記事の目次

 AccountTrigger.trigger

 AccountTriggerHandler.cls

 トリガーの挙動





AccountTrigger.trigger


trigger AccountTrigger on Account (after delete, after insert, after undelete, after update, before delete, before insert, before update) {
AccountTriggerHandler handler = new AccountTriggerHandler(Trigger.isExecuting, Trigger.size);
if(Trigger.isInsert && Trigger.isBefore){
handler.OnBeforeInsert(Trigger.new);
}
else if(Trigger.isInsert && Trigger.isAfter){
handler.OnAfterInsert(Trigger.new);
AccountTriggerHandler.OnAfterInsertAsync(Trigger.newMap.keySet());
}
else if(Trigger.isUpdate && Trigger.isBefore){
handler.OnBeforeUpdate(Trigger.old, Trigger.new, Trigger.newMap);
}
else if(Trigger.isUpdate && Trigger.isAfter){
handler.OnAfterUpdate(Trigger.old, Trigger.new, Trigger.newMap);
AccountTriggerHandler.OnAfterUpdateAsync(Trigger.newMap.keySet());
}
else if(Trigger.isDelete && Trigger.isBefore){
handler.OnBeforeDelete(Trigger.old, Trigger.oldMap);
}
else if(Trigger.isDelete && Trigger.isAfter){
handler.OnAfterDelete(Trigger.old, Trigger.oldMap);
AccountTriggerHandler.OnAfterDeleteAsync(Trigger.oldMap.keySet());
}
else if(Trigger.isUnDelete){
handler.OnUndelete(Trigger.new);
}
}


AccountTriggerHandler.cls

public with sharing class AccountTriggerHandler {
private boolean m_isExecuting = false;
private integer BatchSize = 0;
public AccountTriggerHandler(boolean isExecuting, integer size){
m_isExecuting = isExecuting;
BatchSize = size;
}
public void OnBeforeInsert(Account[] newAccounts){
//Example usage
for(Account newAccount : newAccounts){
if(newAccount.AnnualRevenue == null){
newAccount.AnnualRevenue.addError('Missing annual revenue');
}
}
}
public void OnAfterInsert(Account[] newAccounts){
}
@future public static void OnAfterInsertAsync(Set newAccountIDs){
//Example usage
List newAccounts = [select Id, Name from Account where Id IN :newAccountIDs];
}
public void OnBeforeUpdate(Account[] oldAccounts, Account[] updatedAccounts, Map accountMap){
//Example Map usage
Map contacts = new Map( [select Id, FirstName, LastName, Email from Contact where AccountId IN :accountMap.keySet()] );
}
public void OnAfterUpdate(Account[] oldAccounts, Account[] updatedAccounts, Map accountMap){
}
@future public static void OnAfterUpdateAsync(Set updatedAccountIDs){
List updatedAccounts = [select Id, Name from Account where Id IN :updatedAccountIDs];
}
public void OnBeforeDelete(Account[] accountsToDelete, Map accountMap){
}
public void OnAfterDelete(Account[] deletedAccounts, Map accountMap){
}
@future public static void OnAfterDeleteAsync(Set deletedAccountIDs){
}
public void OnUndelete(Account[] restoredAccounts){
}
public boolean IsTriggerContext{
get{ return m_isExecuting;}
}
public boolean IsVisualforcePageContext{
get{ return !IsTriggerContext;}
}
public boolean IsWebServiceContext{
get{ return !IsTriggerContext;}
}
public boolean IsExecuteAnonymousContext{
get{ return !IsTriggerContext;}
} }

トリガーの挙動

トリガーにイベントアクション(before insertなど)を記載するが
このイベントアクションにキックするたびに
トリガーが動作する。
例えばトリガーのイベントアクションに(before insert,after insert)と書けば
新規レコードを作成すると
トリガーは2回走る、before insertとafter insertです。
だからトリガーを実装する際にこの回数を厳しく制御しないとワークルールなどの原因でループに走る可能性が十分あります!
回数制御について次回お話します!
【このカテゴリーの最新記事】
posted by Jude at 09:13 | Comment(0) | TrackBack(0) | トリガー
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7541581
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
いつもお世話になります。ブログ引越しになったので最新のSFDC情報はこちらへ SFU_CRT_BDG_Pltfrm_App_Blder_RGB.jpg SFU_CRT_BDG_Admin_RGB.jpg
プロフィール
Judeさんの画像
Jude
こんにちは、自由が欲しいJudeっす。最近ネットビジネスを始まった。結婚はしていないが、会社の残業が大嫌い、何しても周りの人に迷惑をかけないように、社会に負の影響を与えないように常に意識してる。残業のない国になるため、できるところでコツコツ貢献しておる。、国民のみんなきっともっと幸せと信じている。
プロフィール
<< 2019年01月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
検索
月別アーカイブ
日別アーカイブ
最新コメント
ファン
×

この広告は30日以上新しい記事の更新がないブログに表示されております。