Apexで値を設定してレコードを更新しようとしたら「データ値が大きすぎる」というようなエラーに出くわしました。
今回はこのエラーの対処法についてメモしておこうと思います。
「データ値が大きすぎる」エラー
Apexで次のようなコードを実行し、Field1__c[文字数25]に30文字の文字列を設定してみます。
Account acc = [Select Field1__c From Account Limit 1];
acc.Field1__c = 'この文字列は全部で30文字あります!!!!!!!!!!!!!';
Update acc;
すると次のようなエラーが表示されます。

項目に設定できる最大文字数を超える文字列を設定しようしたために発生したものですね。
画面からの入力であれば、自動的に切り捨てられて25文字以内に収まるのですが、Apexからだとエラーになってしまうようです。
解決策
解決方法としては、DML Optionsの利用が最も手っ取り早い方法です。
DML Optionsには「allowFieldTruncation」というプロパティがあり、これをTrueにすることで項目の最大文字数を超える文字列については自動で切り捨てられるようになります。
以下のコードでは、設定を試みる30文字の文字列のうち、Field1__cの最大文字数である25文字が左から抽出され設定されます。
Database.DMLOptions dml = new Database.DMLOptions();
dml.allowFieldTruncation = true;
Account acc = [Select Field1__c From Account Limit 1];
acc.Field1__c = 'この文字列は全部で30文字あります!!!!!!!!!!!!!';
acc.setOptions(dml);
Update acc;
これは便利!
beforeトリガでの使用の注意
ただ、DML Optionsにも制限があり、DML操作を含まないbeforeトリガなどではその効果を発揮することができません。
例えば、先ほどの「allowFieldTruncation」プロパティですが、beforeトリガで使用しても文字列が自動で切り捨てられずエラーとなってしまいます。
その場合は、以下のように「substring(startIndex, endIndex)」を使用して文字を抽出するようにします。
Account acc = [Select Field1__c From Account Limit 1];
String str = 'この文字列は全部で30文字あります!!!!!!!!!!!!!';
str = str.substring(0, 25);
acc.Field1__c = str;
Update acc;
おわりに
今回は、Apexの処理による「データ値が大きすぎる」というエラーの解決法についてでした。
バージョン 15.0 より前の API に対して保存された Apex では、文字列に値を指定し、その値が大きすぎる場合、値は切り捨てられたそうですが、それ以降は「allowFieldTruncation」をTrueに指定する必要があるようです。
画面から手動で入力した場合は、項目の最大文字数に合わせて自動的に文字列が切り捨てられます。
終わりです。
コメント