Apex クラスで SOQL クエリを作成する
学習の目的
この単元を完了すると、次のことができるようになります。
- メソッドで SOQL クエリを作成する。
- SOQL クエリで返されたデータを操作する。
一緒にトレイルを進みましょう
エキスパートの説明を見ながらこのステップを実行したい場合は、次の動画をご覧ください。これは Trailhead Live の「Trail Together」(一緒にトレイル) シリーズの一部です。
(巻き戻して最初から見直したい場合、このクリップは 17:32 分から開始されます。)
はじめに
SOQL クエリの基本事項を理解したら、数式項目に関する知識を SOQL クエリに適用できます。
この例のクエリは、SELECT FirstName, LastName FROM Contact
というごくシンプルなものです。
ここで、結果として返されたデータを保存するオブジェクトが必要です。SOQL クエリでは常にデータがリスト形式で返されるため、Apex リストを作成します。「システム管理者のための Apex の基本」で学んだとおり、リストを宣言するには、List
という予約語、データ型 (< >
記号で囲む)、新しいリストの名前が必要です。このクエリの場合、データ型は Contact で、新しいリストに listOfContacts という名前を付けます。リスト宣言は次のようになります。
List<Contact> listofContacts
クエリの結果を新しいリストに代入するには、次のとおり、代入演算子の等号 (=
) をリスト宣言とクエリの間に配置します。
List<Contact> listofContacts = [SELECT FirstName, LastName FROM Contact];
この構文に注意します。クエリが角括弧 [ ]
で囲まれ、ステートメントがセミコロン (;
) で終わっています。
このクエリを開発者コンソールで試してみましょう。ここではテストを目的に、取引先責任者のリストをデバッグログに送信して、コードがどのように処理されるのか確認します。
開発者コンソールでコードをテストする
- 開発者コンソールで、[Debug (デバッグ)] | [Open Execute Anonymous Window (匿名実行ウィンドウを開く)] をクリックします。
- [Execute Anonymous (匿名実行)] ウィンドウで、クエリ結果を新しいリストに代入します。
List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
- 次の行で、listOfContacts リストをデバッグログに送信します。
system.debug(listOfContacts);
- [Open Log (ログを開く)] チェックボックスをオンにします。
- [Execute (実行)] をクリックします。
- [Execute Log (実行ログ)] ウィンドウの下部にある [Debug Only (デバッグのみ)] チェックボックスをオンにします。
デバッグログの最初の 2 つの項目は次のようになります。 -
クエリで結果が見つからなかった場合は、空のリストが返されます。
[2]|DEBUG|()
コードの実行処理
コードを実行すると、まずクエリが処理されます。
SELECT FirstName, LastName FROM Contact LIMIT 2
クエリがすべての取引先責任者を見つけて、各レコードから姓と名を取得します。次に、取引先責任者レコードから選択されたデータが listOfContacts というリストに追加されます。
最後に、行 2 で listOfContacts
の内容が System.debug
に表示されます。
Apex で SOQL クエリを実行する
前の単元では、クエリエディターを使用してテーブルにデータを返しました。この単元では、[Execute Anonymous (匿名実行)] ウィンドウを使用してクエリを実行し、結果をデバッグログに送信しました。どちらもうまくいきましたが、実際にはユーザーが開発者コンソールでクエリを実行することはありません。組織のユーザーインターフェースでデータを返す方法が必要です。この手段となるのが Apex のクラスやメソッドです。では、Apex で SOQL クエリを実行し、結果を操作する方法を見ていきましょう。
最初に、Apex クラスで Apex メソッドを作成します。この Apex メソッドはクエリを実行して必要なデータを選択します。
- 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
- このクラスに
ContactUtility
という名前を付け、[OK] をクリックします。 -
クラスが開き、クラスを宣言してクラスの本体用のスペースを確保するコードが表示されます。
- 行 2 に、
viewContacts
というメソッドを追加します。public static void viewContacts(){ }
- 行 3 で、
viewContacts
メソッドの内側に、クエリを実行して結果を新しいリストに代入するコードを貼り付けます。List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
- このクラスを保存します。
これで listOfContacts
リストに保存するデータが揃いました。次は、for ループを使用してこのリストを反復処理し、出力形式を構成します。
for ループを使用してリストを反復処理する
「システム管理者のためのオブジェクト指向プログラミング」で、for ループを使用してリスト項目を 1 つずつ処理する方法を学習しました。ここでは、for ループを使用して各取引先責任者の姓と名を組み合わせ、取引先責任者のフルネームにします。まず、ループを作成し、次にループ内の各レコードを処理します。
for ループを宣言するには、変数名、そのデータ型、ループが反復処理するリストの名前が必要です。
for ループでは、特定のオブジェクトを直接参照することはありません。代わりに、ループ内のリスト項目を 1 つずつ表す変数を作成します。この変数は、リストの各項目のプレースホルダーの役割を果たします。どのような名前でも構いませんが、簡単なものにします。ここでは con
とします。次に、変数のデータ型を Contact、リストの名前を listOfContacts に指定します。すべてをまとめると次のようになります。
for ループを宣言する
- viewContacts メソッドで、SOQL クエリの後に次のコードを貼り付けます。
for (Contact con : listOfContacts){ //loop body }
- このクラスを保存します。
これまでに、データベースにクエリを実行し (1)、データを選択して、そのデータをリストに保存し (2)、for ルールを作成しました (3)。
次に、ループ内でリストの項目を処理します。最終的な目的は、listOfContacts
の各取引先責任者を次の形式で表示することです。
First Name:<contact's first name>, Last Name:<contact's last name>
リスト項目の項目を参照するには、ドット表記を使用してオブジェクトとその項目を指定します (object.field)。たとえば、listOfContacts リストの Contact オブジェクトの FirstName 項目を参照する場合は、次のとおり、con (オブジェクト変数) と FirstName (項目) の間にピリオド (ドット表記の「ドット」) を配置します。
con.FirstName
このリストには、姓項目と名項目が別々に記載されています。Apex では、連結を使用して項目値 (場合によってはリテラルテキスト) を結合します。(「システム管理者のための Apex の基本」でもいくつかの結合を実施しました。)
復習すると、結合により、項目データが object.field
として表されます。リテラルテキストは単一引用付で囲まれます。必要な場合は、リテラルテキストの先頭と末尾にスペースを含めます。プラス記号 (+) を使用して、項目同士、または項目とリテラルテキストを結合します。
では、この例の for ループの本体を完成させましょう。最初に、listOfContacts リストの項目ごとに、FirstName と LastName を結合して fullname という新しい変数にします。
String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
FirstName と LastName の間にスペースが必要です。出力は次のようになります。
First Name:Angela, Last Name:Carter
次のようにならないようにします。
FirstName:Angela,LastName:Carter
fullName 変数 (データ型: String) の値が代入されたら、この変数を次の行のデバッグステートメントに追加します。
system.debug(fullName);
for ループのリスト項目を処理する
- viewContacts メソッドで、
//loop body
を次のコードに置換します。String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName);
- このクラスを保存します。
コードは次のようになります。
public class ContactUtility { public static void viewContacts(){ List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact]; for (Contact con : listOfContacts){ String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName); } } }
クラス、メソッド、SOQL クエリが揃ったら、コードを実行してどのようになるか確認します。[Execute Anonymous (匿名実行)] ウィンドウで Apex コードを実行するには、ドット表記を使用してクラスとメソッドを指定します。
- [Execute Annonymous (匿名実行)] ウィンドウを開きます。
- [Enter Apex Code (Apex コードを入力)] ウィンドウで、既存のコードを次のコードに置き換えます。
ContactUtility.viewContacts();
- [Open Log (ログが開く)] チェックボックスがオンになっていることを確認します。
- [Execute (実行)] をクリックします。
- [Debug Only (デバッグのみ)] を選択します。
結果の最初の 6 行が次のようになります。
Execution Log (実行ログ) |
|
Event (イベント) |
Details (詳細) |
USER_DEBUG |
[5]|DEBUG|First Name: Rose, Last Name: Gonzalez |
USER_DEBUG |
[5]|DEBUG|First Name: Sean, Last Name: Forbes |
USER_DEBUG |
[5]|DEBUG|First Name: Jack, Last Name: Rogers |
USER_DEBUG |
[5]|DEBUG|First Name: Pat, Last Name: Stumuller |
USER_DEBUG |
[5]|DEBUG|First Name: Andy, Last Name: Young |
USER_DEBUG |
[5]|DEBUG|First Name: Tim, Last Name: Barr |
ご覧ください! SOQL、for ループ、連結を使用して、取引先責任者データを取得し、データをリストに代入して、リストを反復処理し、求めていた結果を生成することができました!