次のコード スニペットの結果は何でしょうか? public word doWork(Account acct) { for (Integer i = 0; i <= 2007 i++) { insert acct; }
正解:D
ThedoWorkmethod inserts an account for every iteration of theforloop, which runs fromi = 0toi <= 200, inclusive. This results in 201 iterations, and hence 201 accounts are inserted into the org. Explanation of Code Behavior: The loop conditioni <= 200runs 201 times (0 to 200). Theinsert acct;statement is executed 201 times. Apex Developer Guide - Loop Constructs
最新のコメント (最新のコメントはトップにあります。)
このコードスニペットの実行結果は、**例外(エラー)が発生し、処理が失敗する** が正解となります。
提供された選択肢(A〜D)の中には正しい答えが含まれていないか、問題文の選択肢が省略・誤訳されている可能性があります。Salesforce Platform Developer I 試験において、このパターンのコードは **「ガバナ制限の超過エラー」** を指摘させるための典型的な「アンチパターン(やってはいけない書き方)」として出題されます。
なぜエラーになるのか、2つの理由を解説します。
### 解説:なぜエラーになるのか?
このコードには、Apex開発における致命的な問題が2つあります。
#### 1\. ガバナ制限(DML発行回数)の超過
Salesforceでは、1回のトランザクション(処理)の中で発行できるDMLステートメント(`insert`, `update` などの命令)の回数に **150回** という厳格な制限があります。
* **コードの動作:** `for` ループが `i=0` から `i<=200` まで回るため、合計 **201回** の `insert` 命令が実行されようとします。
* **結果:** ループが **151回目** に達した瞬間に、ガバナ制限違反となり `System.LimitException: Too many DML statements: 151` という例外が発生します。例外が発生すると、それまでの処理はすべてロールバック(取り消し)されるため、**レコードは1件も保存されません**。
#### 2\. 同一インスタンスの重複Insert
仮にガバナ制限がなかったとしても、このコードは2回目のループで失敗します。
* **コードの動作:** 引数で渡された `acct`(1つのAccountオブジェクト)を `insert` しています。
* **1回目のループ:** `insert acct;` が成功すると、この `acct` 変数には **Salesforce ID** が割り当てられます。
* **2回目のループ:** すでにIDを持っている `acct` を再度 `insert` しようとします。Salesforceでは「IDを持つレコード」を新規作成(insert)することはできないため、`System.DmlException` エラーが発生します。
-----
### 正しい書き方(Bulk化)
試験対策として、このような処理を行う場合の「正しい書き方」も覚えておきましょう。
DML操作は必ず **「ループの外」** で、リストを使って **「一括実行」** する必要があります。
```apex
public void doWork() {
// 1. 空のリストを作成
List<Account> accountsToInsert = new List<Account>();
// 2. ...
正:0、、