Memos About Salesforce

Salesforceにハマってたこと!

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<ID, Account> accountMap){

//Example Map usage

Map<ID, Contact> contacts = new Map<ID, Contact>( [select Id, FirstName, LastName, Email from Contact where AccountId IN :accountMap.keySet()] );

}

public void OnAfterUpdate(Account oldAccounts, Account updatedAccounts, Map<ID, Account> 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<ID, Account> accountMap){

}

public void OnAfterDelete(Account deletedAccounts, Map<ID, Account> 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です。

だからトリガーを実装する際にこの回数を厳しく制御しないとワークルールなどの原因でループに走る可能性が十分あります!

回数制御について次回お話します!