Memos About Salesforce

Salesforceにハマってたこと!

Salesforce バッチ実行エラー:【First error: Too many DML rows: 10001】

f:id:jude2016:20190920155743j:plain

こんにちは、管理人の@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はあまり合わないため、対策をいくつか用意しましょう。

いざエラーになった時にすぐソリューションを出せる、仕事も早く完了でき、定時帰宅にもつながるでしょう