エンジニアブログ

エンジニアブログ

Salesforceでapexを使った大量データの作成方法

578874_265037300262522_1504471900_n.jpg 菊地一直 2014年02月26日
今回ソラノワ+Salesforce環境にケースとケースコメントのテストデータを
大量に用意して欲しいという社内からの依頼があり、その対応を行ったの
ですがその際にはまった箇所を共有したいと思います。
 
Salesforceにテスト用の大量データ作成するには、通常データローダを
使用するか、apexを使ってinsertする方法のどちらかの選択となると
思いますが、依頼されたオブジェクトは主従関係を保持して登録する必要が
あったのでCSVの作成に手間取ると判断し、apexを使い作業することにしました。
 
1.先にイメージを掴むため実行クラスを見て下さい。
  このようなイメージでデータを作成したかった。
/**
 * ケース及び、ケースコメントを自動生成します。
 */
public with sharing class ExecCaseData {
    public void create() {
 
        // 取引先
        Account account = CreateAccount.createIns();
 
        // 取引先責任者
        Contact contact = CreateContact.createIns(account);
 
        for (Integer i = 1; i <= 100; i++) {
            // ケース
            Case c = CreateCase.createIns(account, contact);
            for (Integer j = 1; i <= 5; i++) {
                CaseComment cc = CreateCaseComment.createIns(c);
            }
        }
    }
}
 
2.取引先、取引先責任者クラスについては割愛。
 
3.ケースを作成するクラスを作成します。
/**
 * ケース
 */
public class CreateCase {
    /** ケースを作成してインサートする */
    public static Case createIns( Account a, Contact c ){
        return = createIns( a, c, null );
    }
 
    /** ケースを作成してインサートする */
    public static Case createIns(Account a, Contact c, Id parentId){
        Case ca = create(a, c, parentId) ;
        insert ca ;
        return [SELECT Id FROM Case WHERE Id = :ca.Id];
    }
 
    /** ケースを作成する */
    private static Case create(Account a, Contact c, Id parentId){
         return new Case (
           PotentialLiability__c = 'yes',
           SLAViolation__c = 'yes',
           IsEscalated = true,
           Type = 'Electrical',
           Subject = ‘ソラノワのお問い合わせについて',
           Priority = 'Low',
           Reason = ‘',,
           AccountId = a.id,
           ContactId = c.id,
           Status = '新規',
           Origin = 'Web',
           ParentId = parentId,
           Description = '説明++++++++++++++'
        );
    }
}
 
4.ケースコメントを作成するクラスを作成します。
/**
 * ケースコメント
 */
public class CaseComment {
    /** ケースコメントを作成してインサートする */
    public CaseComment createIns( Id parentId) {
        CaseComment cc = create(parentId);
        insert cc ;
        return [SELECT Id FROM CaseComment WHERE Id = :cc.Id];
    }
 
    /** ケースコメントを作成する */
    public CaseComment create (Id parentId) {
        return new CaseComment (
            ParentId = parentId,
            CommentBody = 'コメント'
        );
    }
}
 
保存しようとすると、
「Error: コンパイルエラー: 行 14、列 16 でInvalid constructor syntax, 
name=value pairs can only be used for SObjects」というエラー
このような形式でのコンストラクタのアクセスは不可らしい。
という訳で以下の様に書き直した。
        CaseComment cc = new CaseComment();
        ParentId = parentId,
        CommentBody = 'コメント' 
        return cc;
 
すると今度は、
「Variable does not exist: CommentBody」というエラー
色々試行錯誤するも、どうやらapexからCaseCommentを更新する方法は
トリガーなら可能っぽいが、apexでは不可っぽいという結論となり
残念ながらケースコメントはCSVを作ってデータローダで対応することに
なりました。