Dataloaderの豆知識

## 前書き
Salesforceの業務の中に、データ導入（本番初期データ投入、本番データ移行）の場面は多く存在します。今更に聞けない言葉やテクニックを本記事にてご紹介いたします。

前提知識は特に必要ないですが、本記事の中に、Salesforceの主従関係、入力規則、重複ルール、トリガー、ワークフロールール、プロセスビルダー、フローなどの言葉を使っています。これらの機能を簡単に把握しておくことをおすすめします。

## Salesforce DataLoaderとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/723175b7-5216-7f45-5001-64e9ab4460e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/36cd0db4-5e25-4a24-ed14-c8e75a9340a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/a118cae6-5b91-0280-abeb-d8a36578d5f0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/202993f9-b94c-2e3d-a0f3-0680072498b2.png)

https://help.salesforce.com/s/articleView?id=sf.when_to_use_the_data_loader.htm&type=5
抜粋：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/b5cc5e01-00ef-c598-83eb-90b7a809fed4.png)

## １押すのテクニック：外部Idの活用
https://www.circlace.com/blog/salesforce/using-external-id
抜粋：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/d03b3365-2394-0a17-4f60-463f735b9592.png)

#### リレーション設定におけるMapping作成方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/704a19e4-36a4-72ce-e034-964d71caea7c.png)

#### 外部Idを使用しなければ...
下記、<font color="Crimson">赤字部分</font>は増やされた手順になります。結構不便だと感じされないでしょうか？さらに、DataLoaderを使用する場面は、本番の場合は多く、本番作業時に、慌ててvlookupをあまりお勧めしないですね。本番作業する際に、出来れば、事前に使用するCSVを準備しておく、レビューを済ませておきたい。
⇒ですので、**外部IDの活用**を強くお勧めします。

(1) 取引先をSalesforceへインポート。
<font color="Crimson">(2) 取引先のIdを入手するため、(1)インポートした取引先をSalesforceよりエクスポート。</font>
<font color="Crimson">(3) 取引先責任者のCSVに(2)のSalesforceIdを追記。(Excelのvlookupなどを使用して加工)</font>
(4) (3)の取引先責任者CSVよりSalesforceへインポート。 

#### テストデータ作成への横展開
http://www.jitendrazaa.com/blog/salesforce/using-test-loaddata-to-import-records-with-relationship/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/cba34c61-b506-2272-629a-416373ba0704.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/e23d2523-1031-a264-9ede-03fbd2b5c60e.png)

``` apex
/**
 * 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
抜粋：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/46f7975b-76a5-7389-787f-01d3590947c3.png)


## Use Bulk Apiとは
https://help.salesforce.com/s/articleView?id=sf.configuring_the_data_loader.htm&type=5
抜粋：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/fe7c190b-0939-db95-aec7-595b83be4769.png)

## serial modeについて
serial modeとは、レコードを分割し、処理を並列化にすることで処理スピードの高めを図ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/cdbba364-7ff7-dc6c-b7f5-ca3d7d99bc62.png)



下図のように、「Use Bulk API」をチェックしないと、活性化にならない。
serial modeは名前通り、（デフォルトでは）チェックしないと並行ジョブになる。チェックを入れると、ジョブは順番で実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/24236978-c72b-115e-dc08-4e95b1056126.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/bd78e68d-73ed-1ace-440a-ef6fc2071dc3.png)

#### serial modeの考慮事項
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/01f99e72-5a07-44c0-c5dc-a8e3b0d05161.png)

別スレッドになってしまった場合は、ロック可能性は高くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/94d80b11-f0a4-60a3-650a-80ca25266d11.png)
回避策：子どもレコードを親でソートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/aa809243-3f6b-c553-650f-3e2d770539a2.png)

## 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について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/5fd61902-e567-afc8-9281-1a29750a0712.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/8cf0fd7f-1f93-56a1-80fa-9e45d4f3dabc.png)

プロファイルや権限セットにて（システム）権限の「Use Bulk Api」を付与する必要。
標準プロファイルの場合は、チェックを付けられないため、プロファイルをコピーしてカスタムプロファイルにしたら、付けられます。実際の業務にカスタムプロファイルをするのにハードル高い場合、権限セットをおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/a5cf2496-4df9-47db-67c9-d265fa582e81.png)

## エラーと後続レコード
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]のチェックを入れている場合は、このオプションは活性化にならない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/e495487e-07e0-b33a-992d-f8d3c14ebc66.png)

## 大量データについて
https://base.terrasky.co.jp/articles/Zyi56

## ユーザインターフェース
「レコードの作成時に監査項目を設定」および「無効な所有者のレコードを更新」ユーザ権限を有効化

## データローダしか出来ない機能
例：履歴オブジェクト

## Salesforce Shield
https://help.salesforce.com/s/articleView?id=sf.salesforce_shield.htm&type=5

Nameは暗号化した場合は、外部Idみたいに自動リレーション出来ない。
外部Idは暗号化出来ないため、外部Idは自動リレーション使用可能。推奨