[Salesforce開発] Apex: SOQLで検索したオブジェクトのレコードを更新する

目次

Apex: SOQLで検索したオブジェクトのレコードを更新する

SFエンジニア

SOQL文でデータを取得する方法はわかったけど、そのデータを更新するにはどうすれば良いかねぇ。

SF宣教師

DML操作でできますよ。以下に説明します。

サンプルコード1:取引先(Account)オブジェクトのレコードをクエリし結果をデバッグ出力

取引先(Account)オブジェクトのレコードをSOQLステートメントでクエリし、その結果をデバッグ出力します。

//Account sObject型の acct を宣言し、SOQLステートメントで取引先名が"Acme1"の取引先をクエリする
Account acct = [SELECT Name FROM Account WHERE Name='Acme1'];
//取得結果をデバッグ出力する
System.debug(acct);
//Account sObject型の acct を宣言し、SOQLステートメントで取引先名が"Acme1"の取引先をクエリする
Account acct = [SELECT Name FROM Account WHERE Name='Acme1'];

Account(取引先)オブジェクト型の変数を宣言し、その変数にSOQLのクエリ結果を格納します。

//取得結果をデバッグ出力する
System.debug(acct);

System.debug()メソッドでその変数をデバッグ出力します。

クエリしたいオブジェクトが取引先責任者であれば、Account の部分が Contact となります。

サンプル2:SOQLでクエリした取引先(Account)オブジェクトの単一レコードを更新

//Account sObject型の acct を宣言し、SOQLステートメントで取引先名が"Acme1"の取引先をクエリする
Account acct = [SELECT Name FROM Account WHERE Name='Acme1'];
//BillingCityに値を設定する
acct.BillingCity='Los Angels';
//update文で、acctのレコードを更新する
update acct;
//BillingCityに値を設定する
acct.BillingCity='Los Angels';

SOQLのクエリ結果を格納したacct変数(=取引先レコードが格納されている)の「請求先住所-市区群(BillingCity)」に “Los Angels” を代入します。

//update文で、acctのレコードを更新する
update acct;

updateステートメントでオブジェクトのレコードを更新します。updateステートメントはDML操作のひとつです。

DML操作
DMLは Data Manipulation Language の略で、データベース内のデータを操作するための操作を指します。主にレコードの作成、更新、削除などを行うための操作を含みます。SalesforceのDMLは、Apexコード内で使用され、Salesforceオブジェクトのデータを操作するために必要なメソッドや構文を提供します。
主なDML操作は以下の通りです:
Insert(挿入): 新しいレコードをデータベースに追加します。insert キーワードを使用し、新しいレコードのリストを指定します。
Update(更新): 既存のレコードのデータを変更します。update キーワードを使用し、変更したいレコードのリストを指定します。
Delete(削除): レコードをデータベースから削除します。delete キーワードを使用し、削除したいレコードのリストを指定します。
Upsert(更新または挿入): 一意の外部IDを使用して、レコードが存在すれば更新し、存在しなければ新しいレコードを追加します。
Apex開発者ガイド: Apex DML操作

サンプル3:SOQLでクエリした取引先(Account)オブジェクトの複数レコードを更新

サンプル2では、単一のレコードを更新しましたが、このサンプルでは、複数のレコードを一括更新します。SOQLで返ってきたクエリ結果をsObject型のリストに格納し、そのリストを使い各レコードを更新します。

//Account sObject型の accountList を宣言し、SOQLステートメントで取引先名が"Acme"で始まる取引先をクエリする
List<Account> accountList = [SELECT Name FROM Account WHERE Name LIKE 'Acme%'];
//取得結果をデバッグ出力する
System.debug('レコード数:' + accountList.size());
for (Account acct : accountList) {
    acct.BillingCity='Los Angels';
    System.debug('レコード:' + acct);
}
//update文で、accountListのレコードを更新する
update accountList;
//Account sObject型の accountList を宣言し、SOQLステートメントで取引先名が"Acme"で始まる取引先をクエリする
List<Account> accountList = [SELECT Name FROM Account WHERE Name LIKE 'Acme%'];

Account(取引先)オブジェクト型のリスト accountList を宣言し、そのリストにSOQLのクエリ結果を格納します。

//取得結果をデバッグ出力する
System.debug('レコード数:' + accountList.size());
for (Account acct : accountList) {
    acct.BillingCity='Los Angels';
    System.debug('レコード:' + acct);
}

accountList リストを for ループで回し、リストのそれぞれの要素、つまりSOQLで返ってきたそれぞれの取引先レコードの「請求先住所-市区群(BillingCity)」に “Los Angels” を代入します。

//update文で、accountListのレコードを更新する
update accountList;

accountList リストを引数としてUpdate ステートメントで一括更新します。
例えば、取引先名が「Acme1」「Acme2」「 Acme3」 という3レコードがあるとして、それら3レコードの請求先住所-市区群(BillingCity)が “Los Angels” に更新されます。System.debugへの出力結果は以下のとおりです。

SF宣教師

うまく行きましたか?
以上になります!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次