Apex @futureアノテーションを使用してアカウントレコードを更新するサンプル
環境
Salesforce Apex
概要
アカウントIDのリストを受け入れ、アカウントに関連付けられた連絡先の数でAccountオブジェクトの
カスタムフィールドを更新する@futureアノテーションを使用するメソッドでApexクラスを作成します
使用例
取引先の取引先連絡者数を集計する必要があるので、COUNT関数を使用します。
AggregateResultオブジェクトに格納して代入します。
Apexクラス
public class AccountProcessor { @future public static void countContacts(List<id> accIds) { List<Account> accList = new List<Account>(); for (AggregateResult ar : [SELECT AccountId a, COUNT(Id) c FROM Contact WHERE AccountId in :accIds GROUP BY AccountId ]) { accList.add( new Account( Id = (Id) ar.get('a'), Number_of_Contacts__c = (Decimal) ar.get('c') )); } update accList; } }
説明
1.タイプNumberの「Number_of_Contacts__c」という名前のフィールドをAccountオブジェクトに作成します。
このフィールドには、アカウントの連絡先の総数が保持されます。
2.アカウントIDのリストを受け入れる「countContacts」メソッドを含む「AccountProcessor」というApexクラスを作成します。
このメソッドは@futureアノテーションを使用する必要があります。
3.メソッドに渡されたアカウントIDごとに、それに関連付けられている連絡先レコードの数をカウントし、
「Number_of_Contacts__c」フィールドをこの値で更新します。
テストクラスの作成
@IsTest public class AccountProcessorTest { public static testmethod void TestAccountProcessorTest() { Account a = new Account(); a.Name = 'Test Account 11'; Insert a; Contact c = New Contact(); c.LastName ='Test Contact 22'; c.AccountId = a.Id; Insert c; List<Id> setAccId = new List<Id>(); setAccId.add(a.id); System.Test.startTest(); AccountProcessor.countContacts(setAccId); System.Test.stopTest(); Account Acc = [SELECT Number_of_Contacts__c FROM Account WHERE id = :a.id LIMIT 1]; System.assertEquals ( Integer.valueOf(Acc.Number_of_Contacts__c) ,1); } }
説明
‘AccountProcessorTest’というApexテストクラスを作成します。
単体テストは、AccountProcessorクラスに含まれるコードのすべての行をカバーする必要があり、100%のコードカバレッジが得られます。