Bulk API 2.0 を使ってレコードを削除する【Postmanから使う】


[Postmanのまとめのまとめに戻る](https://qiita.com/Keiji_otsubo/items/84098dc24465d5787ea6)

少し前にモジュールの解説をしていますが、今回はレコードの削除に限定して具体的な操作を説明します。

+ [Postman Bulk API 2.0 を使用する（Salesforceのモジュールの解説）](https://qiita.com/Keiji_otsubo/items/3fc230a04f25a30aaacc)
+ [Bulk API 2.0 開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/bulk_api_2_0.htm)

# Bulk API 2.0での操作手順について

私は少し勘違いをしていたのですが、Bulk API2.0を操作する手順は以下のステップを全て行うことで完了します。

1. 一括ジョブの作成(オブジェクトを指定してどのような操作をするか指定します。insert,update,deleteなど)
2. ジョブへのデータの追加(実際に使うcsv形式のデータをアップロードします)。この時にjob Idが必要になります。
3. Salesforce サーバへのアップロード完了の通知。この時にもjob Idが必要になります。

job Idは一括ジョブの作成を行うとtest処理の中で変数に自動的にセットされます。

この１~３のステップで処理が開始されます。

その後はJobの監視をして、成功したか、エラーだったかを確かめます。


# Postmanに接続します

今回もPostmanを使って確かめたいと思います。
PostmanからSalesforceにアクセスする方法は、以下を参考にして下さい。

+ [WEB 版でも日本語表示にする](https://qiita.com/Keiji_otsubo/items/1273868619155c23f6bd)
+ [Postman : Salesforceで初めて使う時の処理手順](https://qiita.com/Keiji_otsubo/items/ac8571db2d836248e9f9)
+ [Postman : Salesforceで使う時の処理手順(既に一度接続した環境に対して)](https://qiita.com/Keiji_otsubo/items/6f493f98422551a946c3)
+ [Postman : Salesforceで使う時の処理手順(Salesforceの接続環境を切り替える)](https://qiita.com/Keiji_otsubo/items/ad4dc5062cdecf01b9a0)


言語設定が英語のままでこの資料を作ってしまったので、最後まで英語モードで作っていきます。ごめんなさい。



# 1. 一括ジョブの作成

1. [Collections (コレクション)] で [Bulk v2] フォルダーを開きます。
2. [POST Create job] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/724dd8c9-55c5-1adc-6c0f-7ac5e5d2784e.png)

3\. PostするまえにBodyを変更します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f1842240-7c88-2d4f-d176-2266b7f43fcd.png)


```
{
"operation" : "delete",
"object" : "Account",
"contentType" : "CSV",
"lineEnding" : "CRLF"
}
```

改行はどのOSでcsvファイルを作ったかに依存する。今回私はWindows 11を使っているのでCRLFを指定します。

+ UNIX/Linux/OS X では、LF (改行、「\n」、0x0A) が使用されます。
+ Windows/DOS では、CRLF (行頭復帰および改行、「\r\n」、0x0D0A) が使用されます。

4\. Sendをクリックします。

無事にJobが作成されたようです。

```
{
    "id": "7505i00000P57P9AAJ",
    "operation": "delete",
    "object": "Account",
    "createdById": "0055i00000BXxguAAD",
    "createdDate": "2023-12-21T02:06:27.000+0000",
    "systemModstamp": "2023-12-21T02:06:27.000+0000",
    "state": "Open",
    "concurrencyMode": "Parallel",
    "contentType": "CSV",
    "apiVersion": 59.0,
    "contentUrl": "services/data/v59.0/jobs/ingest/7505i00000P57P9AAJ/batches",
    "lineEnding": "CRLF",
    "columnDelimiter": "COMMA"
}
```

このスクリプトはジョブ ID を __jobID 変数に自動的に追加します。これによって今後の要求に jobID が挿入されるため、コピーして貼り付ける必要がありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/060f851b-1151-11ae-a36f-bc721785eede.png)


私の場合は環境を設定しているので、そちらに__jobID が追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0c18cb6b-e92c-9b98-0324-f21bf257e7d4.png)

データの一括読み込みジョブの管理の画面を確認するとJobがOpenのステータスで作成されていることが分かります。
（申し訳ないですが今回はプレイグランドを使って確かめているので画面が英語のままです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/110820f2-1906-bcc0-9430-83967d7ff274.png)


# 2. ジョブへのデータの追加

Salesforce API コレクションのフォークで、[Bulk v2] フォルダーの [PUT Upload Job Data] をクリックします。HTTP メソッドは PUT です。

5\. [Body(ボディ)] タブをクリックし、ドロップダウンから [Raw (未加工)] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7088c709-0e18-11ce-f56f-bafa5a5ca775.png)

6\. 次のテキストをテキストエディターにコピーすることで余分な書式設定をクリアしてから、そのテキストをテキストファイルからリクエストボディ項目にコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/230f294f-2706-88d9-1b28-7c01d47f7851.png)


 7\. [ヘッダー] をクリックします。[Content Type (コンテンツタイプ)] は [text/csv] になっているかを確認しておきます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9cbb2940-48c0-f43a-34d3-d8373fa0b249.png)

8\. [Save (保存)] をクリックします。
9\. [Send (送信)] をクリックします。

今回はリソースが作成されているので、リターンコードは201で正常終了です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0789262e-e1c4-91d2-f59e-400015cc7e07.png)


# 400エラー　　

ジョブへのデータの追加を２回行うとエラーになりますね。BulkAPI 2.0はJobは１つだけかな？

:::note alert
Found multiple contents for job: <7505i00000P577B>, please 'Close' / 'Abort' / 'Delete' the current Job then create a new Job and make sure you only do 'PUT' once on a given Job."
:::

Jobを削除した後にジョブへのデータの追加を行うと当然エラーですね。

:::note alert
Failed to create batch, since the Job is not Open. Current job state is 'Aborted'
:::


# 3. Salesforce サーバへのアップロード完了の通知

これでデータの送信が完了したため、データを処理する必要があることを Salesforce に通知する必要があります。

1. Salesforce API フォークで、[Bulk v2] の [Query] フォルダーの [PATCH Close or Abort a Job] をクリックします。
2. [Body(ボディ)] タブをクリックします。"state" に「UploadComplete」がすでに入力されています。

3. [Send (送信)] をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dcbef69c-dd7e-bc49-d189-9bf6d31675e5.png)

結果はステータスコード200で正常終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7aa60178-08c0-bc0b-2955-ccbb8f1cf175.png)

データの一括読み込みジョブの管理の画面を確認するとJobがJob Completeと完了されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/de05ba9a-a860-f43d-b1d4-c2cae3b2db2b.png)


Salesforceの画面で確かめると既に消されてアクセスできないのでエラーになります。
確かに削除できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/80bd28d9-9352-1516-6222-a1dfa7f703b9.png)



# ジョブの状況の確認

Postman で [Bulk v2] フォルダーからジョブの状況を確認する手順は次のとおりです。

1. [GET Job Info] を選択します。この種類の要求に使用される HTTP メソッドは GET です。
2. [Send (送信)] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/004c05a0-0ad3-c379-2430-f205956d1d1f.png)


# ジョブ結果の取得

ジョブの状況が JobComplete (または Failed) になると、レコードが正常に処理されたか否かの形で、結果情報を取得できます。

[Bulk v2] フォルダーで正常に処理されたレコードを見てみましょう。

1. [GET Get Job Successful Record Results] リソースをクリックします。HTTP メソッドは GET です。
2. [Send (送信)] をクリックします。表示は次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/936c7e51-ec66-b8ba-7df0-6716dc721057.png)

エラーが無いかも確認してみましょう。今回は無いハズです。

3. [GET Get Job Failed Record Results] リソースをクリックします。HTTP メソッドは GET です。
4. [Send (送信)] をクリックします。表示は次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/771de8d5-79cd-2640-ade3-633ef6df4889.png)


以上でレコードを削除できました。

# 追記：2. ジョブへのデータの追加でcsvファイルを使う手順

ここからは日本語表示の画面です...


ボディタブのところで、バイナリを選択するとファイルをアップロードできます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2cefb75c-1fdc-02aa-7c53-03a8bcb2e26c.png)

ファイルを選択できたので、送信ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/901f7a09-3d99-113c-6cfd-e282540e1faa.png)

CSVファイルをアップロードして処理することも可能です。素晴らしい。やはり慣れたら簡単かもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/73ddfcb5-3d68-c62f-23f9-4d9fbb188de1.png)