親レコードに紐づく子レコードの数に基づくValidation

By | June 20, 2022

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');
    }
  }
}