こんにちは、管理人の@Salesforce.Zです。
バッチを使い、請求と入金の充当処理で First error: Too many DML rows: 10001ってエラーになりました。 ぱっと見、なんや、そして、初めてだもん。これを解決する方法を バッチにおいて共有していきたいと思います。ご参考になれば幸いです。
★ バッチ実行エラーの原因 ★ バッチ実行エラーの対策
目次
処理概要
自分の場合、データ移行で、請求データが10,000件以上あり
5,000件入金と充当しようと思って、なにも考えず、この充当バッチを実行させた
結果としては【First error: Too many DML rows: 10001】に遭ってしまった。定時の直前でショックでした(笑)。終われば、帰れるのに
原因
DMLを行うレコードの総数が10000超えると出るエラー
バッチの場合では、executeメソッドの開始と終了の間のレコード総数をカウントするようです。なので、複数オブジェクトのレコードを挿入する場合、その総数をカウントするとなります。
ダメな例1
List<account> accList = new List<account>(); for(Integer cnt = 0; cnt < 21000; cnt++){ account acc = new acount(); acc.Name = 'testName' + String.valueof(cnt+1); accList.add(acc); } insert accList;//21000件データを格納しているエラー
ダメな例2
List<account> accList = new List<account>(); for(Integer cnt = 0; cnt < 10000; cnt++){ account acc = new acount(); acc.Name = 'testName' + String.valueof(cnt+1); accList.add(acc); } insert accList; List<contact> conList = new List<contact>(); for(Integer cnt = 0; cnt < 11000; cnt++){ contact con = new contact(); con .LastName = 'lastName' + String.valueof(cnt+1); con .FirstName = 'firstName' + String.valueof(cnt+1); conList .add(con); } insert conList ;//ここまで、取引先と取引先責任者の合計は20,000件レコードを超、エラーになります。
ダメな例3
バッチのfinishメソッドでDML操作を行う場合
これは例えば、10000以上でレコードをバッチのfinishメソッドでまとめてやると エラーになります。
解決方法1
Database.executeBatch(new バッチクラス名, サイズ);
バッチ実行するメソッドを使うなら、上記の方法で、サイズを200から、100とかに下げて、実行すれば、対応できます。
解決方法2
バッチのfinishメソッドでDML操作をする場合
Excuteメソッドに移動するように検討してください。
終わりに
クエリの発行数制限:101よく会うため、常に意識して、コードを書いているが DML制限:10001はあまり合わないため、対策をいくつか用意しましょう。
いざエラーになった時にすぐソリューションを出せる、仕事も早く完了でき、定時帰宅にもつながるでしょう