Memos About Salesforce

Salesforceにハマってたこと!

SFDC クエリ消費しない too many soql 101この回避方法で絶対役に立つ

こんにちは、管理人の@Salesforce.Zです。

sfdc apex開発では

よくあってしまうのが

「System.LimitException: Too many SOQL queries: 101」

でしょう

これが本当に考慮するべき、かつ大事なところです。

公式サイトのベストプラクティス以外のノウホウを

今回、共有したいと思います。

欲しけりゃくれてやる・・・。

探せ!

この世の全てをそこに置いてきた〜笑

目次

エラーを回避する

エラー原因:コンテキストで合計 100 個までの SOQL クエリを実行することができるガバナ制限に達した

ガバナ制限を引き上げたらり、無効にすることはできません

コードを見直すしかありません

発生可能性のあるところ

これがcase by caseだが、一応可能性のあるところを列挙します、 見直すポイントとして使っていただけたら、幸いです。

  • for ループの本文内でデータ操作言語 (DML) ステートメントを使用しない DML ステートメントは、sObject のリストを一括処理してください  ※大事なのがループになっているか、親子の連動でループ処理になっていないか
  • 登録/更新/削除を行うたびにSOQLを発行していないか  特定のタイミグに特定のSOQLだけを発行する制御で回避できる

    公式サイト以外の知恵で回避方法

    スキーマオブジェクトを使用すること

例えば、レコードタイプは全然クエリを使う必要がないので これを例にします。

今回、取引先を例にして、

営業っていうレコードタイプがある前提

営業レコードタイプの開発名:sales

テスト環境と本番環境のレコードタイプIDが違うので、

たまにIDが必要になってくる

普通のコード

下記のコードを匿名windowで実行する

List<RecordType> rcdList = [SELECT Id, DeveloperName, SobjectType
                            FROM RecordType
                            WHERE SobjectType = 'Account'];

実行結果ログ SOQLのところが1 f:id:jude2016:20180831132354p:plain

スキーマオブジェクトを使用したコード

Id rcdTypeId = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('Sales').getRecordTypeId();

実行結果ログ SOQLのところが0 f:id:jude2016:20180831131750p:plain

まとめ

  • too many soql なら、コードを見直す

  • too many soqlなら、スキーマオブジェクトを使用してみる