Skip to main content

Apex クラスで SOQL クエリを作成する

学習の目的

この単元を完了すると、次のことができるようになります。

  • メソッドで SOQL クエリを作成する。
  • SOQL クエリで返されたデータを操作する。
メモ

メモ

日本語で受講されている方へ
Challenge は日本語の Trailhead Playground で開始し、かっこ内の翻訳を参照しながら進めていってください。Challenge での評価は英語データを対象に行われるため、英語の値のみをコピーして貼り付けるようにしてください。日本語の組織で Challenge が不合格だった場合は、(1) この手順に従って [Locale (地域)] を [United States (米国)] に切り替え、(2) [Language (言語)] を [English (英語)] に切り替えてから、(3) [Check Challenge (Challenge を確認)] ボタンをクリックしてみることをお勧めします。

翻訳版 Trailhead を活用する方法の詳細は、自分の言語の Trailhead バッジを参照してください。

一緒にトレイルを進みましょう

エキスパートの説明を見ながらこのステップを実行したい場合は、次の動画をご覧ください。これは 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];

この構文に注意します。クエリが角括弧 [ ] で囲まれ、ステートメントがセミコロン (;) で終わっています。

このクエリを開発者コンソールで試してみましょう。ここではテストを目的に、取引先責任者のリストをデバッグログに送信して、コードがどのように処理されるのか確認します。

開発者コンソールでコードをテストする

  1. 開発者コンソールで、[Debug (デバッグ)] | [Open Execute Anonymous Window (匿名実行ウィンドウを開く)] をクリックします。
  2. [Execute Anonymous (匿名実行)] ウィンドウで、クエリ結果を新しいリストに代入します。
    List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
  3. 次の行で、listOfContacts リストをデバッグログに送信します。
    system.debug(listOfContacts);
  4. [Open Log (ログを開く)] チェックボックスをオンにします。
  5. [Execute (実行)] をクリックします。
  6. [Execute Log (実行ログ)] ウィンドウの下部にある [Debug Only (デバッグのみ)] チェックボックスをオンにします。
    デバッグログの最初の 2 つの項目は次のようになります。
  7. [2] | DEBUG | (Contact: {FirstName = Rose, LastName = Gonzalez, Id = 0036g000040KuVAAU}, Contact: {FirstName = Sean, LastName = Forbes, Id=0036g0000040KuCAAU})。取引先責任者レコードが順番にカンマ区切りでリストされます。

    クエリで結果が見つからなかった場合は、空のリストが返されます。

    [2]|DEBUG|()

コードの実行処理

SELECT FirstName, LastName FROM Contact LIMIT 2 からの矢印がクラウドの Contact オブジェクトを指しています。「クエリと一致するデータを Apex クラスに送信」という 2 つ目の矢印が取引先責任者リストを指しています。1.FirstName = Rose, LastName = Gonzalez.2.FirstName = Sean, LastName = Forbes.

コードを実行すると、まずクエリが処理されます。

SELECT FirstName, LastName FROM Contact LIMIT 2

クエリがすべての取引先責任者を見つけて、各レコードから姓と名を取得します。次に、取引先責任者レコードから選択されたデータが listOfContacts というリストに追加されます。

最後に、行 2 で listOfContacts の内容が System.debug に表示されます。

Apex で SOQL クエリを実行する

前の単元では、クエリエディターを使用してテーブルにデータを返しました。この単元では、[Execute Anonymous (匿名実行)] ウィンドウを使用してクエリを実行し、結果をデバッグログに送信しました。どちらもうまくいきましたが、実際にはユーザーが開発者コンソールでクエリを実行することはありません。組織のユーザーインターフェースでデータを返す方法が必要です。この手段となるのが Apex のクラスやメソッドです。では、Apex で SOQL クエリを実行し、結果を操作する方法を見ていきましょう。

最初に、Apex クラスで Apex メソッドを作成します。この Apex メソッドはクエリを実行して必要なデータを選択します。

  1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
  2. このクラスに ContactUtility という名前を付け、[OK] をクリックします。
  3. クラスが開き、クラスを宣言してクラスの本体用のスペースを確保するコードが表示されます。

  4. 行 2 に、viewContacts というメソッドを追加します。
    public static void viewContacts(){
    }
  5. 行 3 で、viewContacts メソッドの内側に、クエリを実行して結果を新しいリストに代入するコードを貼り付けます。
    List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
  6. このクラスを保存します。

これで listOfContacts リストに保存するデータが揃いました。次は、for ループを使用してこのリストを反復処理し、出力形式を構成します。

for ループを使用してリストを反復処理する

「システム管理者のためのオブジェクト指向プログラミング」で、for ループを使用してリスト項目を 1 つずつ処理する方法を学習しました。ここでは、for ループを使用して各取引先責任者の姓と名を組み合わせ、取引先責任者のフルネームにします。まず、ループを作成し、次にループ内の各レコードを処理します。

for ループを宣言するには、変数名、そのデータ型、ループが反復処理するリストの名前が必要です。

for ループでは、特定のオブジェクトを直接参照することはありません。代わりに、ループ内のリスト項目を 1 つずつ表す変数を作成します。この変数は、リストの各項目のプレースホルダーの役割を果たします。どのような名前でも構いませんが、簡単なものにします。ここでは con とします。次に、変数のデータ型を Contact、リストの名前を listOfContacts に指定します。すべてをまとめると次のようになります。

for (Contact con : listOfContacts){ //loop body}

for ループを宣言する

  1. viewContacts メソッドで、SOQL クエリの後に次のコードを貼り付けます。
    for (Contact con : listOfContacts){
        //loop body
    }
  2. このクラスを保存します。

これまでに、データベースにクエリを実行し (1)、データを選択して、そのデータをリストに保存し (2)、for ルールを作成しました (3)。

1.「The query, Select FirstName, LastName FROM Contact LIMIT 2」というクエリが listOfContacts リスト (2) をフィードします。3.「for(Contact con : listOfContacts){ //logic goes here}」という for ループが listOfContacts リストの取引先責任者を処理します。

次に、ループ内でリストの項目を処理します。最終的な目的は、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 ループのリスト項目を処理する

  1. viewContacts メソッドで、//loop body を次のコードに置換します。
    String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
    system.debug(fullName);
  2. このクラスを保存します。

コードは次のようになります。

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 コードを実行するには、ドット表記を使用してクラスとメソッドを指定します。

  1. [Execute Annonymous (匿名実行)] ウィンドウを開きます。
  2. [Enter Apex Code (Apex コードを入力)] ウィンドウで、既存のコードを次のコードに置き換えます。
    ContactUtility.viewContacts();
  3. [Open Log (ログが開く)] チェックボックスがオンになっていることを確認します。
  4. [Execute (実行)] をクリックします。
  5. [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 ループ、連結を使用して、取引先責任者データを取得し、データをリストに代入して、リストを反復処理し、求めていた結果を生成することができました!

リソース

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む