プログラマ38の日記

主にプログラムメモです。

Salesforce: ログインユーザが利用可能なレコードタイプの一覧を取得する

レコードタイプの選択を、Visualforceで行いたい時があります。

標準のレコードタイプ選択画面であれば、ログインしているユーザのプロファイルに応じたリストが表示されますが、 そのリストをApexで作成する場合のメモです。

 

[サンプルコード]    ※Sample__cは適宜置き換えてください。

List<RecordTypeInfo> rtlist =  Sample__c.SObjectType.getDescribe().getRecordTypeInfos();

List<SelectOption> rtoptions = new List<SelectOption>();
for( RecordTypeInfo rt : rtlist ){

  //System.debug(' getName() : ' + rt.getName()  + 
  //               '/ getRecordTypeId(): ' + rt.getRecordTypeId()+ 
  //               '/ isActive(): ' + rt.isActive() + 
  //               '/ isAvailable(): ' + rt.isAvailable() + 
  //               '/ isMaster: ' + rt.isMaster());

  if( rt.isMaster() == false && rt.isAvailable() == true ){
    rtoptions.add( new  SelectOption(rt.getRecordTypeId() , rt.getName() ) );
  }
}

//System.debug(rtoptions);

上のコードでプロファイルに応じたリストが取得できます。

ポイントは次です。

  • RecordTypeInfo.getName() は、翻訳が指定されていれば翻訳された後の値となります。
  • RecordTypeInfo.isAvailable()で、プロファイルで利用可能かが判断できます。RecordTypeInfo.isActive()がfalseの場合は、RecordTypeInfo.isAvailable()は常にfalseとなります。
  • RecordTypeInfo.isMaster()がtrueの場合、"マスタ"レコードタイプが取得できますが除外しています。

最後に

RecordTypeオブジェクトでは、RecordTypeInfo.isActive()までしか取得できず、ログインユーザが利用できるレコードタイプを一覧化するには、getRecordTypeInfos()を使う必要があります。

Schema.getGlobalDescribe()を使えば、文字列で指定したオブジェクトの利用可能なレコードタイプ一覧を取得する関数を作成することが可能になります。