進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

sObject と DML の使用

学習の目的

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

  • sObject を定義する。
  • sObject と Apex の他のデータ型の違いを説明する。
  • DML を使用してレコードをデータベースに挿入する。
エキスパートから学べることをご存知ですか? 次の動画で、このモジュールのトピックの詳しい説明をご覧ください。

sObject とは?

sObject は、組織の Salesforce オブジェクト (sObject) に対応する Apex のデータ型です。sObject は、1 つの変数に複数の値を保持する複雑なデータ型で、Salesforce オブジェクト (取引先、取引先責任者、商談など) からのデータの 1 つのレコードを保持します。「Apex Basics for Admins (システム管理者のための Apex の基本)」で、変数はコンテナのようなものであると説明しました。大半の変数は一片の情報を保持します。sObject は他のコンテナを保持するコンテナです。sObject コンテナ内のコンテナは、文字列、日付、整数、Boolean などさまざまなデータ型にすることができます。 

sObject の四角形。内側に Id、Name、Type、Custom_Field__c と表示された 4 つの箱があります。

新規取引先

名前
取引先番号
電話
The Tea Factory
356281
555-0158
Tina's Teas
623956
555-0129

このテーブルの情報を見てください。データローダを使用している場合は、取引先のこの表形式に慣れていることでしょう。取引先には名前、取引先番号、電話の項目があります。このデータは、レポートまたはリストビューから情報を取得したときに表示されるものです。

組織にあるオブジェクトの項目を、Apex コードでは sObject のプロパティといいます。組織のオブジェクトの各項目にデータ型があるように、sObject の各プロパティにもデータ型があります。たとえば、取引先オブジェクトの [名前] 項目はデータ型が文字列であるため、myAcct sObject の Name プロパティのデータ型も文字列で、myAcct.Name = 'The Tea Factory' となります。

取引先を手動で作成するか (Salesforce ユーザインターフェースを使用)、プログラミングで作成するか (Apex コードを使用) に関係なく、同じ値を同じデータ型で設定します。たとえば、Salesforce ユーザインターフェースで、取引先を作成し、上記の新規取引先テーブルの 1 行目の項目値を設定することができます。この同じ取引先をプログラミングで作成する場合は、Apex コードで Account sObject を次のように使用します。

Account myAcct = new Account();
myAcct.Name = 'The Tea Factory';
myAcct.Phone= '555-0129';
myAcct.AccountNumber = '356281';

組織で使い慣れている sObjectName、ドット表記、同じデフォルト項目 (Name、Phone、AccountNumber) を使用します。

Account myAcct = new Account(); myAcct.Name = 'The Tea Factory'; myAcct.AccountNumber = '356281'。sObject 名は myAcct で、この sObject のプロパティは Id、Name、Phone、AccountNumber です。

この例で、myAcct のプロパティ (NamePhoneAccountNumber) のデータ型は、使い慣れた文字列と整数です。

項目値の設定

ドット表記を使用して、sObject に値を割り当てます。前のコードサンプルの 2 ~ 4 行目を見てみましょう。sObject をコンテナのコンテナと考えると、これらの行では最大のコンテナ myAcct を開き、NamePhone、および AccountNumber コンテナを見つけて値を追加します。

項目値の取得

同様に、sObject から値を取得する場合もドット表記を使用します。

例: String accountName = myAcct.Name;

次のサンプルコードは、myAcct コンテナを開き、コンテナの内部を参照して、Name コンテナを見つけ、値を取得します。この例で返される値は、The Tea Factory です。

sObject を宣言するということは、スプレッドシートに行を追加するようなものです。別の取引先を作成する準備ができたら、その取引先オブジェクトに新しい名前を付けます。次に例を示します。

Account myAcct2 = new Account();
myAcct2.Name = 'Tina’s Teas';
myAcct2.AccountNumber = '623956';
myAcct2.Phone = '555-0129';

Salesforce 組織へのデータの追加

Salesforce 組織にデータを追加する Apex コードを記述する準備ができましたか? クラスの作成方法、メソッドの作成方法、sObject の宣言方法は習得しています。けれども、sObject を Salesforce データベースに追加するにはどうすればよいのでしょうか? 新しいレコードを Salesforce 組織に送信する場合は、データ操作言語 (DML) というものを使用します。 

システム管理者であれば DML をすでにご存じでしょう。データローダなどのデータ操作ツールで使用する、Insert (レコードの作成)、Update (レコードの編集)、Delete (レコードの削除) ステートメントのことです。行の追加や、レコードの挿入や更新に .csv ファイルまたはデータローダを使う代わりに、操作を実行する Apex コードを記述します。Apex コードと、DML の InsertUpdateDelete ステートメントを使用します。画期的ですよね? この単元では、Insert ステートメントを中心に説明します。

クラスを定義する

  1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
  2. クラス名に「NewAccounts」と入力します。
  3. [OK] をクリックします。
  4. デフォルトのコードを次のコードに置き換えます。
    public class NewAccounts {
        public static void sObjectsInsert(){
            Account store = new Account();
            store.Name = 'The Tea Factory';
            store.AccountNumber = '356281';
            store.Phone = '555-0158';
            insert store;
        }
    }
  5. [File (ファイル)] | [Save (保存)] をクリックします。

新しいレコードを作成して、そのプロパティを設定する NewAccounts クラスができました。このクラスは、新しい取引先レコードをデータベースに追加する insert ステートメントも使用します。いよいよコードを実行します!

コードを実行する

  1. [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
  2. [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
    NewAccounts.sObjectsInsert();
  3. [Open Log (ログを開く)] チェックボックスをオンにして、[Execute (実行)] をクリックします。
  4. Salesforce ユーザインターフェースで、アプリケーションランチャーをクリックし、[Acounts (取引先)] を選択します。[Acounts (取引先)] リストに [The Tea Factory] が表示されます([The Tea Factory] が表示されない場合は、ページを更新します)。
    [Accounts (取引先)] ページの [Recently Viewed accounts (最近参照した取引先)] の下に [The Tea Factory] が表示されます。
  5. [The Tea Factory] をクリックします。
  6. [Details (詳細)] をクリックします。[Account Name (取引先名)]、[Phone (電話)]、[Account Number (取引先番号)] 項目に、NewAccounts クラスで sObject のプロパティとして設定した値が示されます。

ループを使用した複数のレコードの作成

取引先を一度に 1 つずつ追加していくのはあまり実用的ではありません。通常は、レコードをインポートまたは更新して、一度に多数の取引先を作成する必要があります。

前の例で 1 つのレコードを追加したのと同じやり方で複数のレコードを追加できますが、次のようにレコードごとにコードを繰り返す必要があります。

Account store1 = new Account();
Account store2 = new Account();
store1.Name = 'The Tea Factory 1';
store1.AccountNumber = '356281';
store1.Phone = '555-0158';
store2.Name = 'The Tea Factory 2';
store2.AccountNumber = '356282';
store2.Phone = '555-4012';
insert store1;
insert store2;

「Apex Basics for Admins (システム管理者のための Apex の基本)」で、ループとリストについて学びました。ここで、学習した概念を適用してみます。while ループとリストを使用すれば、一度に多数のレコードを作成して、すべてのレコードをデータベースに追加できます。データローダを使用する場合に、3 つのレコードが記載された .csv ファイルをアップロードして、データベースに挿入するのと同様です。

メソッドを記述する

  1. 開発者コンソールの NewAccounts クラスに戻ります。
  2. 既存のコードを次のコードに置き換えます。
      public class NewAccounts {
        public static void sObjectsInsert(Integer value){
            Integer counter = 1;
            //create a list to add our accounts
            List<Account> teaFactoryAccounts = new List<Account>();
            
            while(counter <= value){
                //display the current counter value
                System.debug('Counter Value before Incrementing ' + counter);
                
                //create a new account
                Account store = new Account();
                store.Name = 'The Tea Factory ' + counter;
                store.AccountNumber = '35629' + counter;
                teaFactoryAccounts.add(store);
                
                System.debug(teaFactoryAccounts);
                
                //increment the counter
                counter = counter + 1;
                System.debug('Counter Value after incrementing ' + counter);
            }
            
            System.debug('Size of Account List: ' + teaFactoryAccounts.size() );
            System.debug('Elements in Account List: ' + teaFactoryAccounts);
            
            //insert all of the accounts in the list
            insert teaFactoryAccounts;
        }
    }
  3. [File (ファイル)] | [Save (保存)] をクリックします。

メソッドを実行する

  1. [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
  2. [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
    NewAccounts.sObjectsInsert(3);
  3. [Open Log (ログを開く)] を選択し、[Execute (実行)] をクリックします。ログウィンドウが開きます。
  4. [Debug Only (デバッグのみ)] を選択します。

ログの最後のエントリに、コードによって 3 つの取引先が作成され、それぞれの名前と取引先番号が次のとおりであることが示されます。 

The Tea Factory 1、356291

The Tea Factory 2、356292

The Tea Factory 3、356293

5 行目で作成された teaFactoryAccounts リストは、次のようになります。

3 つのスロットに分割されたスペース。各スロットに取引先が 1 つずつ示されます。スロット 1: Name = The Tea Factory 1、AccountNumber = 356291スロット 2: Name = The Tea Factory 2、AccountNumber = 356292スロット 3: Name = The Tea Factory 3、AccountNumber = 356293

カウンタ変数の値が増分するたびに、リストの次に空いているインデックス (位置) に sObject が作成されます。

Trailhead Playground 組織の [取引先] リストに戻り、[取引先] をクリックします。[取引先] リストに、挿入した 3 つのレストランが表示されます。

ループコードの復習

while ループコード (7 ~ 22 行目) を検証します。12 行目で store という新しい Account sObject をインスタンス化します。13 行目で ︲The Tea Factory︲ という名前を設定します。取引先レコードを区別する目的で、ループの反復処理ごとに現在のカウンタ値を store.Name 文字列の末尾に追加します。 

メモ

メモ

本番組織では、現在の店舗数をクエリし、新しい店舗に後続の番号を付けていくものと思われます。

プロパティが設定された後、7 行目のループ条件が満たされるまで、15 行目で while ループの反復処理ごとに store sObject を teaFactoryAccounts リストに追加します。

メモ

メモ

while ループでカウンタを忘れずに増分します。このサンプルコードでカウンタを継続的に増分しなければ (20 行目)、7 行目の条件が満たされることはありません。Salesforce によって設定された制限時間に達するまで、while ループがレコードを追加し続けます。

7 行目の条件が満たされると、while ループが終了し、28 行目で teaFactoryAccounts リストがデータベースに一度にまとめて挿入されます。 

まとめて実行されるのはなぜでしょうか? リソースに限りがあり、コードで insert ステートメントを 150 回しか使用できないためです。レコードを 1 つずつ挿入する場合は、計 150 件のレコードを挿入できます。他方、insert ステートメントごとに 10 件のレコードを挿入すれば、計 1,500 件のレコードを挿入できます。一度に複数のオブジェクトを挿入すれば一括処理化 (効率的なコードを記述して反復的なタスクをまとめること) ができます。最初のうちはレコードをわずか 10 件ずつ挿入するかもしれませんが、アプリケーションが拡大するにつれ、一度に 200 件のレコードを挿入するようになるかもしれません。最初から一括処理化を使用しておけば、アプリケーションの拡大に備えることができます。

リソース