Databaseクラスをちょっと深掘り

ApexからのDML操作、普通にinsertやupdateを使用しているのではないでしょうか?
今回はDatabaseクラスに着目して違った形のDML操作を記載したいと思います。

スポンサーリンク

Databaseクラスとは

データ操作を行うメソッドが多く含まれているクラスになります。
詳しくはこちら

まずは以下の例文から。

List<Account> accList = new List<Account>();
accList.add(new Account(name = 'Hoge1', YearStarted = '2016'));
accList.add(new Account(name = 'Hoge2', YearStarted = '2017'));
accList.add(new Account(name = 'Hoge3', YearStarted = '2018'));
insert accList;

ちなみに、AccountのYearStartedは開始年でテキスト4文字の項目です。
よくある、リストでまとめてinsertするコードです。

実は、このinsertコマンド、Database.insert(accList, true);と同等の意味を持ちます。
おそらくみなさんは、省略したinsertなんちゃらの方を使い慣れていると思います。

では、次のコードはどうでしょう。
3番目にあえて桁数エラーが起こるような書き方にしました。

List<Account> accList = new List<Account>();
accList.add(new Account(name = 'Hoge1', YearStarted = '2016'));
accList.add(new Account(name = 'Hoge2', YearStarted = '2017'));
accList.add(new Account(name = 'Hoge3', YearStarted = '201801'));
insert accList;

この場合は、insertに失敗しますが、正常であるはずの1,2件も一緒に登録されません
正常なものは登録したい場合は、以下のようにDatabase.insertの第2引数をfalseに指定することで正常なものは登録可能になります

第2引数のBooleanの意味は、
true→登録できないレコードがあったら全てオジャンにして、エラーを出す
false→エラーを吐き出さず、登録できるレコードは全て登録する

List<Account> accList = new List<Account>();
accList.add(new Account(name = 'Hoge1', YearStarted = '2016'));
accList.add(new Account(name = 'Hoge2', YearStarted = '2017'));
accList.add(new Account(name = 'Hoge3', YearStarted = '201801'));
Database.insert(accList, false);

この通り、正常なものだけ登録されていますね。
エラーで止まってしまうことがありません。
Database.insertの第二引数をfalseにすると正常レコードが登録

ちなみに、3件全部エラーのケースでもエラーは発生しませんでした。
また、Database.insertの戻り値はDatabaseSavePointなので、途中結果を記録する場合は活用してください。
今回の例はinsertでしたが、updateやdeleteなどでも同じように第2引数が指定できます。

今日はこれだけなのでまとめはなし!

コメント