Salesforceでは、レコードに自動的に一意の番号を付与するために「自動採番」というデータ型が用意されています。本記事では、自動採番の基本から応用方法までを詳しく解説します。
Salesforceのデータ型「自動採番」とは?
自動採番は、レコードが作成されるたびに自動的に連番を生成する項目です。
連番とは、現在の自動採番項目の最大値に+1した値を自動でセットしてくれるということです。新しいレコードを作成するたびに、「001」「002」「003」といったように連続した番号が自動的に付与されます。
連番が自動採番されると、そこからデータの作られた時期や、前後のデータといった情報を連想することが出来るので便利です。
「ABC-{000000}」のように、頭に固定の文字を入れて、どのオブジェクトの自動採番なのかわかるようにしたり、
「{YY}{MM}{DD}-{000000}」のように、日付を自動採番に組み込むことも可能となっています。
自動採番では桁数指定がマスト。桁数を使い切った後はどうなる?
自動採番では、番号の桁数を指定できます。しかし、指定した桁数の最大値に達した場合、次に何が起こるのでしょうか。
例えば、A-{0000}の最大値、A-{9999}まで採番されたらどうなるでしょうか。
答えは、A-{10000}になります。そう、桁数が勝手に追加されます。
※参考Help記事:自動採番項目の表示形式で、A-9999 の後はどのようになりますか?
Salesforce内での識別用にだけ使っているぶんにはそれほど影響がないかと思いますが、外部システムとの連携などで使用する場合には桁数が勝手に追加されるとエラーの原因となりますので注意が必要です。
レコード数が多くなりそうなオブジェクトは、初めから大きめの番号を用意して回避しておくとよいでしょう。
Salesforceの自動採番をリセットする方法
自動採番項目は、自動的に現状の番号に+1され続けられ、数式の計算結果と同じように、システム管理者でも直接編集することができない項目です。
しかし自動採番を使っていると稀に採番をリセットしてまた1からスタートしたい場合があります。
例えばYY-{0000}で設定している場合に、今年は「24-3280」まで採番されたが、来年は「25-0001」として、また1番から採番したいなあ、という場合などです。
そんな時には、自動採番のデータ型をテキスト型に変更して保存してから、自動採番に戻します。
- 画面右上の歯車アイコンから「設定」を選びます。
- 「オブジェクトマネージャ」にアクセスし、リセットしたい自動採番項目があるオブジェクトを選択します。
- 左サイドメニューの「項目とリレーション」をクリックし、リセットしたい自動採番項目を選んで、「編集」をクリックします。
- 「データ型の変更」をクリックし、データ型を「テキスト」に変更、「次へ」をクリックします。
- セキュリティ設定は特に変更せず、そのまま「保存」をクリックします。これで、自動採番項目のデータが一時的にテキスト型として保存されます。
- その後、再び同じ手順でデータ型を「自動採番」に戻します。
※参考Help記事:自動採番項目の再開始またはリセット
実際にやってみました。
まず、普通に自動採番項目を作成、レコードを作成しました。
その後、データ型をテキスト型に変更しました。下図の通り右側に鉛筆マークが出て編集できるようになっています。
その後、データ型を自動採番に戻しました。また、テストのために頭の文字列をtest2に変えました。開始番号は0からにしています。
すると、新たにレコードを作った際、頭の文字列がtest2になり、また0から採番されるようになりました。元々自動採番済みの値に関しては頭のtestがtest2になったりすることはありませんでした。
この仕様は、リセットの時も使えますし、一時的に大量にレコードを作るからその間だけ自動採番をストップしたい、という自動採番保留用にも使えそうですね。テキスト型に変換してから、また最大の番号+1を開始番号にして自動採番にデータ型を変更すればよいのです。
スケジュールトリガフローを使って自動採番と同じことをする
特定の条件に合致した場合のみ、自動採番を行いたい場合があります。そんなとき、数式で自動採番を代用することは出来ません。なぜなら数式では他のレコードを集計して最大値を出すことが出来ないからです。自動採番を数式に組み入れて特定の文字列が入っていたらレポートに出す、などはあり得ると思います。
0001の次に必ず0002が来てほしい、という飛んでいる数字の無い完全な連番にするためにはフローの設定が必要です。
自動採番でやっていることというのは、オブジェクト内の連番の最大値を取ってきて+1する、です。
これと同じことをフローで実施するとよいでしょう。レコードトリガフロー、スケジュールトリガフローなどで実現できそうです。
テキスト型で連番用の項目を用意し、そこに対してフローで値を入れます。まずは取得要素で連番を取ってきて、降順で並べ替えます。数式で連番に+1して、割り当て要素で割り当てれば、シンプルに実現できるでしょう。
ただし、レコードトリガフローの場合、全く同じ瞬間にフローが起動されると、同じ番号が2つ発番される可能性があります。その瞬間は両方のレコードから起動したフローがレコードを取得しており、自動採番の最大値が同じな気がするからです。
一方でスケジュールトリガフローの場合はすべて順番に処理されるのでこの懸念は無いですが、即時発番されないというデメリットはあります。ここは要件によりけりですね。
自動採番項目で欠番が生じることがある
Salesforceの自動採番項目は、必ずしも連続した番号になるとは限りません。欠番が発生する代表的な事例を説明します。
- 入力エラーでレコード作成に失敗した場合
入力規則や必須項目が原因で作成が失敗すると、番号が確保された後のため次の番号に飛んでしまいます。 - Apexのテストメソッド実行時
テストメソッドで番号が生成されますが、テスト終了後にレコードは削除され、欠番となります。 - レコードの削除
既に作成されたレコードを削除すると、その番号が欠番として残ります。 - 内部エラーやタイムアウトでロールバックが発生した場合
レコード作成中にエラーが発生しロールバックすると、確保された番号が欠番となります。 - 自動採番のカウンターリセット
自動採番項目のデータ型を変更して戻した場合、カウンターがリセットされ欠番が発生します。
※参考Help記事:自動採番項目で欠番が生じる
2~5に関しては織り込み済みかと思いますが、1番については知っておくとよさそうです。