Requirements
・親レコードの更新時に、親レコードに紐づく子レコードの数に応じてValidationを行う
・問題がある場合は、更新を行なったレコードページ上にエラーメッセージを表示した上で、元の更新操作についてはロールバックする
Code Sample
■BadExample
trigger AccountTrigger on Account (before update) {
Map<Id,AggregateResult> contactMap = new Map<Id,AggregateResult>([SELECT AccountId Id,COUNT(Id) ContactCount FROM Contact WHERE AccountId IN: trigger.newMap.keySet() GROUP BY AccountId]);
for(Account acc : Trigger.new){
AggregateResult ar = contactMap.get(acc.Id);
if(
acc.Phone <> trigger.oldMap.get(acc.Id).Phone &&
Integer.ValueOf(ar.get('ContactCount')) < 2
){
acc.addError('testerror');
}
}
}
■GoodExample
trigger AccountTrigger on Account (before update) {
Set<Id> TargetAccountSet = new Set<Id>();
for(Account record : Trigger.new){
if(
record.Phone <> trigger.oldMap.get(record.Id).Phone
){
TargetAccountSet.add(record.Id);
}
}
Map<Id,AggregateResult> contactMap = new Map<Id,AggregateResult>([SELECT AccountId Id,COUNT(Id) ContactCount FROM Contact WHERE AccountId IN: TargetAccountSet GROUP BY AccountId]);
for(Account acc: [Select Id From Account WHERE Id IN: TargetAccountSet]){
AggregateResult ar = contactMap.get(acc.Id);
if(Integer.ValueOf(ar.get('ContactCount')) < 2){
Trigger.newMap.get((Id)acc.get('Id')).addError('testerror');
}
}
}