seikin123
@seikin123 (吉田 大希)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

salesforceにて、CompositeAPIのサブ要求にsobject Collectionを含めて削除・更新・追加を行った際に、どのレコードが成功したのかを判断する方法をご教示願います。

解決したいこと・発生している問題

salesforceで発行された、IDをローカルDBの対応するレコードに保存したい
また、どのレコードが失敗したのかを判断する方法を知りたい

以下理由

新規追加の場合
salesforceで発行された、IDをローカルDBの対応するレコードに保存し、次回以降更新や削除をスムーズに行うため

更新・削除
どのレコードが成功・失敗したのかを判別し、成功したレコードはフラグをfalseにし判断をしたいため

手順
1.ローカルDBからsalesforceへリクエストを送る
2.成功したリクエストに関しては、salesforce側のレコードのIDがレスポンスで返却される
→(2) で返却された、IDをローカルDBの対応するレコードに保存したい

以下のような、CompositeAPIのサブ要求にsobject Collectionを含めて削除・更新・追加を行おうと思っています。

{
// トランザクション化はしない
  "allOrNone": false,
  "compositeRequest": [
    {
      "method": "DELETE",
      "url": "/services/data/v59.0/composite/sobjects?ids={カスタムオブジェクトID}",
      "referenceId": "deleteRef"
    },
    {
      "method": "PATCH",
      "url": "/services/data/v59.0/composite/sobjects",
      "referenceId": "updateRef",
      "body": {
        "records": [
          {
            "attributes": { "type": "Contact" },
                "Id": "12345asdfg",
                "LastName" : "hoge"
          }
        ]
      }
    },
    {
      "method": "POST",
      "url": "/services/data/v59.0/composite/sobjects",
      "referenceId": "insertRef",
      "body": {
        "records": [
          {
            "attributes": { "type": "Contact" },
            "LastName" : "hoge"
          },
          {
            "attributes": { "type": "Contact" },
            "LastName" : "hoge"
          },
          {
            "attributes": { "type": "Contact" },
            "LastName" : "hoge"
          }
        ]
      }
    }
  ]
}

現状考えられている手段

1.ドキュメントを読んだところ、リクエストとレスポンスの順番は、基本的に同じである。と記載があったので、順番で判断する

2.insertするリクエストの内容で、salesforceへ情報を取得しに行く

2の方法が新規追加を行った場合には整合性を保つことができて間違いがないのではないかと現状は思っているのですが、何かほかに良い方法はありますでしょうか。

わかりにくい内容で申し訳ございません、知見をお貸しください、、

0

1Answer

Comments

  1. 私の認識ではComposite リソースは1つのAPIのコールで複数の操作を行うものと思っています。
    以下で説明されているように取引先と取引先責任者オブジェクトのように親子の関係があるオブジェクトで1回のAPIのコールで2つのオブジェクトを作成する処理のことです。
    取引先責任者には取引先のIdが必要なので、先に取引先を作成して、そのIdを得て取引先責任者を作成します。

    今回の要件ではApex REST APIを使えばいいと思います。
    Postメッソドで必要な項目を渡して、Salesforce側でレコードができればそのレコードのIdが返ってくるのでローカルのDBに登録すればいいと思います。

    失敗したら200番以外のレスポンスコードが返ってくるのでエラーだと分かります。
    あと気になるのはSalesforce側では登録できているけど、ローカル側で失敗した時の処理ですね。重複を判断できる条件があれば、既に登録されているSalesforce側のIdを返すことができれば、再送信処理でも問題なく処理できると思います。

    Apex REST の基本コードサンプル
    https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_rest_code_sample_basic.htm

Your answer might help someone💌