エンジニアブログ
Salesforceでapexを使った大量データの作成方法
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を作ってデータローダで対応することに
なりました。