sObject と DML の使用
学習の目的
この単元を完了すると、次のことができるようになります。
- sObject を定義する。
- sObject と Apex の他のデータ型の違いを説明する。
- DML を使用してレコードをデータベースに挿入する。
一緒にトレイルを進みましょう
エキスパートの説明を見ながらこのステップを実行したい場合は、次の動画をご覧ください。これは Trailhead Live の「Trail Together」(一緒にトレイル) シリーズの一部です。
(この動画は 21:39 の時点から始まります。戻して手順の最初から見直す場合はご注意ください。)
sObject とは?
sObject は、組織の Salesforce オブジェクト (sObject) に対応する Apex のデータ型です。sObject は、1 つの変数に複数の値を保持する複雑なデータ型で、Salesforce オブジェクト (取引先、取引先責任者、商談など) からのデータの 1 つのレコードを保持します。「Apex Basics for Admins (システム管理者のための Apex の基本)」で、変数はコンテナのようなものであると説明しました。大半の変数は一片の情報を保持します。sObject は他のコンテナを保持するコンテナです。sObject コンテナ内のコンテナは、文字列、日付、整数、Boolean などさまざまなデータ型にすることができます。
新規取引先
名前 |
取引先番号 |
電話 |
---|---|---|
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) を使用します。
この例で、myAcct
のプロパティ (Name
、Phone
、AccountNumber
) のデータ型は、お馴染みの文字列と整数です。
項目値の設定
ドット表記を使用して、sObject に値を割り当てます。前のコードサンプルの 2 ~ 4 行目を見てみましょう。sObject をコンテナのコンテナと考えると、これらの行では最大のコンテナ myAcct
を開き、Name
、Phone
、および 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 の Insert
、Update
、Delete
ステートメントを使用します。画期的ですよね? この単元では、Insert
ステートメントを中心に説明します。
クラスを定義する
- 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
- クラス名に
NewAccounts
と入力します。
-
[OK] をクリックします。
- デフォルトのコードを次のコードに置き換えます。
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; } }
-
[File (ファイル)] | [Save (保存)] をクリックします。
新しいレコードを作成して、そのプロパティを設定する NewAccounts
クラスができました。このクラスは、新しい取引先レコードをデータベースに追加する insert
ステートメントも使用します。いよいよコードを実行します!
コードを実行する
-
[Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
- [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
NewAccounts.sObjectsInsert();
-
[Open Log (ログを開く)] チェックボックスをオンにして、[Execute (実行)] をクリックします。
- アプリケーションランチャーで、[取引先] を見つけて開きます。[Acounts (取引先)] リストに [The Tea Factory] が表示されます。([The Tea Factory] が表示されない場合は、ページを更新します)。
-
[The Tea Factory] をクリックします。
-
[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 ファイルをアップロードして、データベースに挿入するのと同様です。
メソッドを記述する
- 開発者コンソールの NewAccounts クラスに戻ります。
- 既存のコードを次のコードに置き換えます。
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; } }
-
[File (ファイル)] | [Save (保存)] をクリックします。
メソッドを実行する。
-
[Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
- [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
NewAccounts.sObjectsInsert(3);
-
[Open Log (ログを開く)] を選択し、[Execute (実行)] をクリックします。ログウィンドウが開きます。
-
[Debug Only (デバッグのみ)] を選択します。
ログの最後のエントリに、コードによって 3 つの取引先が作成され、それぞれの名前と取引先番号が次のとおりであることが示されます。
The Tea Factory 1、356291
The Tea Factory 2、356292
The Tea Factory 3、356293
5 行目で作成された teaFactoryAccounts
リストは、次のようになります。
カウンター変数の値が増分するたびに、リストの次に空いているインデックス (位置) に sObject が作成されます。
Trailhead Playground 組織の [取引先] リストに戻り、[取引先] をクリックします。[取引先] リストに、挿入した 3 つのレストランが表示されます。
ループコードの復習
while
ループコードを検証します。このループでは store
という新しい Account sObject をインスタンス化し、次に、「The Tea Factory」という名前を設定します。取引先レコードを区別する目的で、ループの反復処理ごとに現在のカウンター値を ストア.Name
文字列の末尾に追加します。
プロパティが設定された後、値がカウンター以上というループ条件が満たされるまで、while
ループの反復処理ごとに teaFactoryAccounts.add
は store
sObject を teaFactoryAccounts
リストに追加します。
条件が満たされると、while
ループが終了し、最後の行で teaFactoryAccounts
リストがデータベースに一度にまとめて挿入されます。
まとめて実行されるのはなぜでしょうか? リソースに限りがあり、コードで insert ステートメントを 150 回しか使用できないためです。レコードを 1 つずつ挿入する場合は、計 150 件のレコードを挿入できます。他方、insert ステートメントごとに 10 件のレコードを挿入すれば、計 1,500 件のレコードを挿入できます。一度に複数のオブジェクトを挿入すれば一括処理化 (効率的なコードを記述して反復的なタスクをまとめること) ができます。最初のうちはレコードをわずか 10 件ずつ挿入するかもしれませんが、アプリケーションが拡大するにつれ、一度に 200 件のレコードを挿入するようになるかもしれません。最初から一括処理化を使用しておけば、アプリケーションの拡大に備えることができます。
リソース
- Apex 開発者ガイド: sObject の操作
- Trailhead モジュール: Apex の基本とデータベース