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%のコードカバレッジが得られます。

IT

Posted by arkgame