function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
kobackykobacky 

Apexロジックによるレコードの自動採番について

はじめまして。Force.comを使い始めて1週間ほどの者です。
初歩的な質問をしてしまうかもしれませんが、よろしくお願い致します。

 

下記のような機能は実現可能でしょうか?

 

あるカスタムオブジェクト(ObjAとします)に、ユーザー毎に自動採番される項目(ItemObjIDとします)
を作りたいと思っています。
例えばユーザーAとユーザーBがいた場合、
ユーザーAが作成した1つ目のレコード:「UserA001」
ユーザーAが作成した2つ目のレコード:「UserA002」
ユーザーAが作成した1つ目のレコード:「UserB001」
・・といった具合です。

 

「新規作成」ボタンからこのオブジェクトを作成する場合、「ObjAの編集」画面が表示されます。
ここで既にItemObjIDが「UserA001」のレコードと「UserA002」のレコードが存在している場合、
「ItemObjID」の入力値項目にデフォルトで「UserA003」と入力されているようにしたいです。

 

「ObjAの編集」画面が表示される段階で「既に存在するレコードを検索してItemObjIDの
デフォルト値として入力されるべき値が"UserA003"であるということを割り出し、
項目に値を設定する」というApexロジックを差し込めれば実現できるかと思ったのですが、
Apexロジックはこのように使用することが可能な物なのでしょうか?

 

無知のため頓珍漢なことを聞いてしまっているかもしれません。
もし質問の意図がわかりにくいなどあれば、その旨お返事頂ければ幸いです。
どうぞよろしくお願い致します。

Best Answer chosen by Admin (Salesforce Developers) 
n-hayashin-hayashi

「ObjA」の編集画面を表示した時点で、デフォルト値として埋め込むには、以下の方法が考えられます。

 

 ・編集画面自体をVisualforceページとして作成する

 (Visualforceページのコントローラで実現できます


 ・別オブジェクトのカスタム項目で番号を管理し、デフォルト値の数式で設定する

 (ただし、デフォルト値の数式で使えるオブジェクトであり、「ObjA」のトリガでこの番号を管理する等の処理が必要となります)

 

 

個人的には、トリガを使ってレコードの挿入時に自動採番するのが最も簡単な方法だと思います。

(編集画面を表示した段階で、自動採番したものを表示することができませんが、

 自動採番するような項目は、一般ユーザには参照のみ項目とするべきだと思いますので、

 問題ないのではないかと思います)

 


 

All Answers

n-hayashin-hayashi

「ObjA」の編集画面を表示した時点で、デフォルト値として埋め込むには、以下の方法が考えられます。

 

 ・編集画面自体をVisualforceページとして作成する

 (Visualforceページのコントローラで実現できます


 ・別オブジェクトのカスタム項目で番号を管理し、デフォルト値の数式で設定する

 (ただし、デフォルト値の数式で使えるオブジェクトであり、「ObjA」のトリガでこの番号を管理する等の処理が必要となります)

 

 

個人的には、トリガを使ってレコードの挿入時に自動採番するのが最も簡単な方法だと思います。

(編集画面を表示した段階で、自動採番したものを表示することができませんが、

 自動採番するような項目は、一般ユーザには参照のみ項目とするべきだと思いますので、

 問題ないのではないかと思います)

 


 

This was selected as the best answer
kobackykobacky

ご回答頂きましてありがとうございます。

また、お返事が遅くなってしまいまして大変申し訳ありません。

 

確かに、自動採番の要件では、新規追加の編集画面の時点でユーザに採番された番号が

見えてなくても問題ないですね。

トリガを使ってレコードの挿入時に自動採番する方法で、下記のように実現致しました。

 

■AutoNumberChild__cオブジェクトの項目

  ・ItemObjID__c(テキスト型):自動採番された文字列を格納

  ・InternalID__c(数値型):所有者毎の連番を格納

 

■標準オブジェクトのユーザーに追加したカスタム項目

  ・Prefix__c(テキスト型):自動採番の番号の前に付加される、ユーザー固有の文字列

 

trigger AutoNumberTrigger on AutoNumberChild__c (before insert) {
    if(Trigger.isInsert){
        for(AutoNumberChild__c newRecord : Trigger.new){
            //所有者が同じレコードの内部管理用ID最大値を取得
            List<AggregateResult> objRecList = [
                Select
                    max(InternalId__c) maxId
                From
                    AutoNumberChild__c r
                Where
                    r.OwnerId = :newRecord.OwnerId
            ];
            Integer intMaxId = 0;
            if(!objRecList.isEmpty()){
                Object objMaxId = objRecList[0].get('maxId');
                if(objMaxId != null){
                    intMaxId = Integer.valueOf(objMaxId);
                }
            }
            //Prefixの取得
            User user = [Select Prefix__c From User Where Id = :newRecord.OwnerId];
            //値の設定
            newRecord.InternalId__c = (intMaxId + 1);
            newRecord.ItemObjID__c = user.Prefix__c + '-' + (intMaxId + 1);
        }
    }
}

なお、Prefixの取得のところで「newRecord.Owner.Prefix__c」のように辿れるかと思ったのですが、

それができなかったのでUserオブジェクトからSelect文で取得する方法としました。

辿れなかった理由としては、所有者として設定されるのは必ずしも「User」ではなく、

「キュー」であることもあるからだと思っています。

上記のコードだと、もし(insert時の)所有者がキューであったらうまく動かないだろうと思います。

(新規レコード追加時に所有者をにキューを指定するということが可能なのかわかっていないですが。)

 

とりあえず、トリガを使ってカスタムの自動採番を実現できるということがわかりました。

ありがとうございました。