こんにちは、にいるです。
今日は「Limitsクラス」について、色々とメソッドを見ていこうと思います。
・【ヘルプ】Limitsクラス
・【ヘルプ】Databaseクラス
1.Limitsクラスとは
Limitsクラスを使用するとDMLの実行数やSOQLクエリの実行数などを調べて、ガバナ制限を確認することができます。
例えば、下記のコードでDMLの実行回数を確認してみます。
1 2 3 4 5 |
// DMLの実行回数確認 System.debug(Limits.getDMLStatements()); System.debug(Limits.getLimitDMLStatements()); System.debug(Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); |
実行結果は150の制限に対して、何もしていないので0回の実行回数であることが確認できました。
2.DMLの実行と制限回数
次にDMLの実行回数とそれによる操作したレコード数を確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
// DMLで取引先を作成 Account acc1 = new Account(Name = 'savepo'); Account acc2 = new Account(Name = 'com'); List<Account> accList = new List<Account>(); accList.add(acc1); insert accList; // DMLの実行回数確認 System.debug('getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); // DMLで操作されたレコード数の確認 System.debug('getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); |
デバッグの結果は下記になります。
これはDMLを1回発行と1レコードを操作しているので、それぞれ1回ずつの結果になってますね!
もう一回、今度はAccListにacc2も含めてみます。
下記のコードを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// DMLで取引先を作成 Account acc1 = new Account(Name = 'savepo'); Account acc2 = new Account(Name = 'com'); List<Account> accList = new List<Account>(); accList.add(acc1); accList.add(acc2); insert accList; // DMLの実行回数確認 System.debug('getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); // DMLで操作されたレコード数の確認 System.debug('getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); |
結果はDMLを1回発行と2レコードを操作になってますね。
Insertだけでなく他のDML操作も見てみます。
※DeleteもしたいのでInsert時だけ2レコード操作します。
※emptyRecycleBinはゴミ箱からレコードを削除する操作です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// start System.debug('●start●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●start●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // savepoint設置 SavePoint sp = Database.setSavepoint(); System.debug('●setSavePoint実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●setSavePoint実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // DMLで取引先2件作成 Account acc1 = new Account(Name = 'savepo'); Account acc2 = new Account(Name = 'com'); List<Account> accList = new List<Account>(); accList.add(acc1); accList.add(acc2); insert accList; System.debug('●Insert実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●Insert実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // レコードを1件削除 Delete acc1; System.debug('●Delete実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●Delete実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // レコードを1件Select Account acc3 = [Select id from account limit 1]; System.debug('●Select実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●Select実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // レコードを1件更新 Update acc2; System.debug('●Update実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●Update実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // レコードを1件ゴミ箱から削除 Database.emptyRecycleBin(acc1); System.debug('●emptyRecycleBin実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●emptyRecycleBin実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); // ロールバックする Database.rollback(sp); System.debug('●rollback実行後●getDMLStatements / getLimitDMLStatements = ' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements()); System.debug('●rollback実行後●getDMLRows / getLimitDMLRows = ' + Limits.getDMLRows() + '/' + Limits.getLimitDMLRows()); |
実行結果は下記になっています。
Select実行時だけカウントされていないですね!
あとsavepointの作成やロールバック時もカウントされているのが確認できました。
3.まとめ
いかがでしたでしょうか。
Limitsクラスを使用すれば、好きな場所でDMLやSOQLクエリの実行回数を確認できるのでとても便利です。
メソッドも命名規則があり、limitがついていれば上限回数、なければ実行回数と覚えやすいのもいいですね。
ぜひ皆さんも使用してみてください。
他にも色々と標準機能やSalesforce機能について紹介しています。
そのまとめ一覧ページはこちらになりますので、よければ見てみてください。
ではでは!