前書き
Salesforceの業務の中に、データ導入(本番初期データ投入、本番データ移行)の場面は多く存在します。今更に聞けない言葉やテクニックを本記事にてご紹介いたします。
前提知識は特に必要ないですが、本記事の中に、Salesforceの主従関係、入力規則、重複ルール、トリガー、ワークフロールール、プロセスビルダー、フローなどの言葉を使っています。これらの機能を簡単に把握しておくことをおすすめします。
Salesforce DataLoaderとは
https://help.salesforce.com/s/articleView?id=sf.when_to_use_the_data_loader.htm&type=5
抜粋:
1押すのテクニック:外部Idの活用
https://www.circlace.com/blog/salesforce/using-external-id
抜粋:
リレーション設定におけるMapping作成方法
外部Idを使用しなければ...
下記、赤字部分は増やされた手順になります。結構不便だと感じされないでしょうか?さらに、DataLoaderを使用する場面は、本番の場合は多く、本番作業時に、慌ててvlookupをあまりお勧めしないですね。本番作業する際に、出来れば、事前に使用するCSVを準備しておく、レビューを済ませておきたい。
⇒ですので、外部IDの活用を強くお勧めします。
(1) 取引先をSalesforceへインポート。
(2) 取引先のIdを入手するため、(1)インポートした取引先をSalesforceよりエクスポート。
(3) 取引先責任者のCSVに(2)のSalesforceIdを追記。(Excelのvlookupなどを使用して加工)
(4) (3)の取引先責任者CSVよりSalesforceへインポート。
テストデータ作成への横展開
/**
* Author : Jitendra Zaa
* Desc : Sample Test class to demonstrate usage of Test.loadData to import related records
* */
@isTest
public class StaticResourceTest {
static testmethod void staticResourceLoad(){
//Load CSV file saved in static resource
List<SObject> lstAcc = Test.loadData(Account.sObjectType,'AccountLoad_Test');
List<SObject> lstCon = Test.loadData(Contact.sObjectType,'ContactLoad_Test');
//Confirm that total number of accounts created are 5
System.assertEquals(lstAcc.size(), 5);
for(Account a : [SELECT Id, Name, (SELECT FirstName,LastName FROM Contacts) FROM Account where Id IN :lstAcc]){
//confirm that every Account has associated child contact
System.assertNotEquals(null, a.contacts);
//confirm that every Account has exactly 2 contacts
System.assertEquals(a.contacts.size(), 2);
}
}
}
知らないとハマりやすい:日付の扱い
https://sf.forum.circlace.com/articles/585167684782526464
抜粋:
Use Bulk Apiとは
https://help.salesforce.com/s/articleView?id=sf.configuring_the_data_loader.htm&type=5
抜粋:
serial modeについて
serial modeとは、レコードを分割し、処理を並列化にすることで処理スピードの高めを図ります。
下図のように、「Use Bulk API」をチェックしないと、活性化にならない。
serial modeは名前通り、(デフォルトでは)チェックしないと並行ジョブになる。チェックを入れると、ジョブは順番で実行されます。
serial modeの考慮事項
別スレッドになってしまった場合は、ロック可能性は高くなります。
回避策:子どもレコードを親でソートする
Api消費の計算
データローダによって消費された API 呼び出しを計算する
https://help.salesforce.com/s/articleView?id=000386578&type=1
抜粋:
たとえば、API 要求の制限が 15,000、バッチサイズが 200 の場合、24 時間ごとに (15,000×200) または 3,000,000 レコードの操作を実行することができます。
データローダで [Use Bulk API] オプションを使用し、バッチサイズが 2,000 の場合、24 時間に (15,000 X 2,000) または 30,000,000 レコードで操作を実行することができます。
Hard Deleteについて
プロファイルや権限セットにて(システム)権限の「Use Bulk Api」を付与する必要。
標準プロファイルの場合は、チェックを付けられないため、プロファイルをコピーしてカスタムプロファイルにしたら、付けられます。実際の業務にカスタムプロファイルをするのにハードル高い場合、権限セットをおすすめです。
エラーと後続レコード
CSV の中にエラーとなるレコードが含まれている場合の後続投入レコードへの影響
https://help.salesforce.com/s/articleView?id=000386170&type=1
抜粋:
例えば以下の状況があったとします。
レコードの全処理件数 [600]
データローダのバッチサイズ [200]
エラーとなるレコード [201件目, 250件目]
APEX トリガが設定されていない場合は 201 件目及び 250 件目レコードのみエラーとなり、後続のレコードに影響はありません。
しかし、データローダの処理時に APEX トリガが実行される場合、バッチサイズの単位で処理が実行されるため、
全処理レコードが [600件] でバッチサイズが [200] の場合、以下のように分割されます。
[1~200件] [201~400件] [401~600件]
上記のような状況で [201件目,250件] にエラーとなるレコードがあり、
トリガの処理が実行される場合には、201 ~ 400件目のデータがすべてロールバックされますので、後続のレコード(同じバッチに含まれるレコード)に影響を与える場合があります。
バッチサイズを1にする場合
価格表エントリみたいに、後続レコードは前のレコードを依存している場合、バッチサイズを意図的に小さいな数字:1を採用する場合もあります。
Insert null valuesについて
[Use Bulk API]のチェックを入れている場合は、このオプションは活性化にならない。
大量データについて
ユーザインターフェース
「レコードの作成時に監査項目を設定」および「無効な所有者のレコードを更新」ユーザ権限を有効化
データローダしか出来ない機能
例:履歴オブジェクト
Salesforce Shield
Nameは暗号化した場合は、外部Idみたいに自動リレーション出来ない。
外部Idは暗号化出来ないため、外部Idは自動リレーション使用可能。推奨