こんにちは、アンダーソンです。
今回は最近初めて知った、DMLOptionsを試してみたので
まとめておこうと思います。
何度かに分けて書いていこうと思います。
DML Optionsとは
Database.DMLOptionsオブジェクトというものがあり、Database.insertやupdateをする際にさまざまなオプションを選択した上でDML操作を実行できるというものです。
オプションは下記の6つです。
- allowFieldTruncation
- assignmentRuleHeader
- dupicateRuleHeader
- emailHeader
- localeOptions
- optAllOrNone
ではそれぞれについてみていきましょう。
allowFieldTruncation
こちらはAPIVer15以前では何もしなくても項目に対し長すぎる文字列が入った場合は切り捨てていたそうなんですが、現在では普通に入れるとExceptionで返ってきてしまいます。このプロパティをTrueにしておくとAPIVer15以前と同じ動きになるようです。
Test1__c test1 = [SELECT Text__c FROM Test1__c LIMIT 1];
test1.Text__c = '--------------------30文字以上は例外発生するよ';
update test1;
上記のText__cは30文字制限の為、このままUpdateすると下記のようなDmlExceptionが発生します。

これをallowFieldTruncationをTrueにするとUpdateは成功します。
Database.DMLOptions dml = new Database.DMLOptions();
dml.allowFieldTruncation = true;
Test1__c test1 = [SELECT Text__c FROM Test1__c LIMIT 1];
test1.Text__c = '--------------------30文字以上は例外発生するよ';
test1.setOptions(dml);
update test1;

ただこのような形で、後ろの文字は切り捨てられます。
この設定する時はあまりないかもしれませんが、仕様検討の時の選択肢として持っておくのはありかもですね。
assignmentRuleHeader
assignmentRuleHeaderプロパティはケースもしくはリードを作成する時にどの割り当てルールを使用するかを指定することができます。
useDefaultRuleとassignmentRuleIdがあり、useDefaultRuleはその名の通り、デフォルトのルールを使うかどうかを指定でき、assignmentRuleIdは使用するルールを直で指定できます。
assignmentRuleIdを指定する際はデフォルトではない可能性がある為、useDefaultRuleは使えないのでご注意です。
Apexの書き方は先ほどと同じような書き方です。
Database.DMLOptions dml = new Database.DMLOptions();
dml.assignmentRuleHeader.assignmentRuleId = '01QD0000000EqAn';
Lead newLead = new Lead(company='テスト株式会社', lastname='太郎',FirstName='テスト');
newLead.setOptions(dml);
insert newLead;
また、デフォルトを使う際はこのように書きます。
Database.DMLOptions dml = new Database.DMLOptions();
dmo.assignmentRuleHeader.useDefaultRule= true;
Lead newLead = new Lead(company='テスト株式会社', lastname='太郎',FirstName='テスト');
newLead.setOptions(dml);
insert newLead;
Apexでリードの生成やケースを作成する場合にはこのようにしておくと
自動化がうまくすすむと思います。
例えばassignmentRuleIdをカスタム設定にしておいて、UI上から簡単に設定を変更できれば汎用性も上がりそうです。
まとめ
まずはallowFieldTruncationとassignmentRuleHeaderについてまとめてみました。
引き続き他のプロパティもまとめていきたいと思います。
Apexってほんとに奥が深い。。。