2022/03/11

SalesforceのAPIコール「update()」について解説!

 
  

update()とは?

update()とは、Salesforceの組織のデータ内にある一つ以上のデータを更新するのに使われるAPIコールの一つです。 具体的には、取引先や取引責任者など、組織のデータ内にある一つ以上の既存のレコードを更新するのに使われるSalesforceのAPIコールで、SQLのUPDATEステートメントに似ています。 これを利用することで、SOQLの発行回数を減らすことができるため、SOQL発行回数によるガバナ制限の対策にもなります。

更新の基本的な手順

SalesforceのAPIコールである「update()」の、基本的な更新の手順を三つのステップに分けて紹介します。 まず、update()の対象となる各レコードのIDを確認します。 そして、レコードごとにsObjectを作成し、項目に更新するデータを入力、sObject[]配列を作成し、配列に更新するレコードを入力します。 最後に、update()をコールして、sObject[]配列を渡し、SaveResult[]オブジェクトの結果を処理してレコードの更新が成功したかどうかを確認しましょう。

注意点

SalesforceのAPIコールである「update()」ですが、利用する前に注意しておかなければならないことがいくつかあります。 まず一つ目は、更新可能なオブジェクトはすべてではない、ということです。一部のレコードはAPIを使用して更新することができないため、update()コールからレコードを更新するには、更新を試みるオブジェクトが更新可能に設定されている必要があります。 そのオブジェクトが更新できるかどうか確認する方法は、オブジェクトに対し、describeSObjects()コールを実行することで、updateableプロパティを調べることが可能です。 二つ目は、クライアントアプリケーションには、指定されたオブジェクトと、そのオブジェクトの中の個々の項目に対し、update()を実行するための権限が付与された状態でログインする必要がある、ということです。 これがなければupdate()を使用して更新することはできません。 三つ目は、特定のオブジェクトや、そのオブジェクトの中にある特定の項目には、特別な処理や権限が必要となる、ということです。場合によっては、オブジェクトの親オブジェクトへのアクセス権限が必要となることもあります。 四つ目は、必須項目を更新する場合は、値をnullにすることはできず、何かしら入力する必要がある、ということです。しかし、オブジェクトの説明で必須に設定されていない項目は、省略でき、nullに設定することが可能です。 五つ目は、項目値をnullにリセットするには、sObjectのfieldsToNullの配列に項目名を追加し、必須項目(nillableがfalse)をnullに設定することはできない、ということです。 そして、最後の六つ目は、最大オブジェクトの更新数についてです。クライアントアプリケーションは、一回のコールで最大200レコードを変更できますが、これを超える更新要求があれば、操作全体が失敗となります。

ID項目について

名前にIdが含まれている項目については、オブジェクトの主キーか外部キーのいずれかで、クライアントアプリケーションは、主キーを更新することはできません。しかし、外部キーを更新することは可能となっています。 たとえば、「OwnerId」は取引先レコードを所有するユーザーを参照する外部キーとなるため、クライアントアプリケーションはAccountのOwnerIdを更新することができます。これは、describeSObjecs()を使用して、更新が可能かどうかを確認することができます。

更新が自動で行われる項目

APIは、LastModifiedDateとLastModifiedById、SystemModstampなどのある特定の項目を自動的に更新するため、これらの値をupdate()コールで支持することができなくなっています。

項目値と文字列値について

項目値は、英字が不可となっており、項目のデータ型に対して有効な値を整数で入力する必要があります。 また、String項目に値を保存する場合には、APIは先頭と末尾の空白文字を削除するようになっています。例として名前項目の値に「 Salesforce 」と入力されたとすると、データベースには「Salesforce」と保存されます。 過去のバージョンのAPIでは、大きすぎる値は切り捨てられてコールは正常に終了していました。しかし、APIバージョン15.0以降では、文字列を含む項目に値を指定し、値が項目に対して大きすぎるとコールが失敗となりエラーが出ます。

ロールバック

APIバージョン20.0以降で使用可能な、AllOrNoneHeaderを使用すると、すべてのレコードが正常に処理されず、エラーが起きる限り、すべての変更をロールバックすることが可能となっています。

Chatterフィードへの登録

Salesforceの「Chatter」のフィードへ作成するレコードを登録するには、ユーザーは個人設定にある[作成したレコードを自動的にフォローする]というオプションを有効化する必要があります。 自動登録が有効化されていれば、ユーザーは自分が作成したレコードを自動的にフォローして、このレコードへの変更が[ホーム]タブのChatterフィードに表示されるようになります。 レコードの所有者を更新する場合には、新しい所有者となる人がChatterフィードの設定でレコードの自動登録が有効化されていなければ、新しく所有者となる人は自動的にレコードに登録されることはありません。 新しい所有者のレコードの自動登録が有効化されていれば、新旧両方の所有者のニュースフィードでレコードへの変更が表示されるようになります。注意点としては、前の所有者の登録は自動的には解除されない、ということです。

オブジェクト種別が異なる場合

APIバージョン20.0以降では、一回のコールで取引先責任者と取引先を更新できるなど、一度に最大で十種類のオブジェクトのレコードを更新できるようになっています。 レコードは、sObjects入力配列に入力された順序で保存され、オブジェクト種別が異なるレコードは複数のチャンクに分けられます。 一つのチャンクは、sObjects入力配列のサブセットになっており、それぞれのチャンクにはオブジェクト種別の同じレコードが含まれ、データはチャンク単位にコミットされます。 コールごとに最大十個のチャンクを処理することができますが、sObjects配列に含まれるチャンクが十個よりも多い場合は、複数のコールに分けてレコードの処理をする必要があります。

update()と外部キー

外部のID項目を外部キーとして使うことで、初めに親レコードのIDを紹介せずにレコードを更新し、他の既存のレコードに関連付ける操作を、まとめて実行できます。 これを行うためには、指定された親レコードの外部IDの値と一致する外部ID項目のみを持つ親のsObjectのインスタンスに、外部キーを設定する必要があります。

update()を利用してガバナ制限対策を!

今回は、SalesforceのAPIコールの一つである「update()」についてご紹介しました。 「update()」を利用するにはいくつかの注意点がありますが、様々なところで利用できる優秀なAPIコールです。またこれを利用することで、SOQLの発行回数を減らすこともできるため、ガバナ制限対策にもなります。 多くのメリットがある「update()」を利用してみてはいかがでしょうか。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】