Apexでのレコードタイプ取得方法について

自分が知っていたレコードタイプ取得方法が古かったので、備忘のため。

こちらでAccountオブジェクトを例に記載していますが、他のオブジェクトでもやり方は一緒なので、適宜Accountを別オブジェクト名に置き換えるようにしてもらえれば大丈夫です。

スポンサーリンク

SOQLから取得する方法

以前はRecordTypeInfoクラスがなかったので、SOQLを使って取得していました。

List<RecordType> rtList = [
    Select Id, Name, DeveloperName 
    From RecordType
    WHERE SobjectType='Account' 
    AND DeveloperName = ★レコードタイプAPI名];
for (RecordType rt : rtList) {
    rt.Id;    // レコードタイプID
    rt.Name;    // レコードタイプラベル名
    rt.DeveloperName;    // レコードタイプAPI名
}

SOQLはリストで取得していますが、SobjectTypeとDeveloperNameが一致していれば、結果は1件となります。
注意点としては、Nameで条件を引っ掛けがちであるが、DeveloperNameがレコードタイプのAPI名に当たるので、そちらを使用すること。
レコードタイプは DeveloperNameを使用すること

同じオブジェクトで同じラベルにすることはまずないんでしょうが、トランスレーション(翻訳)の影響を受けないDeveloperNameの方が怪我はしません。

DescribeからRecordTypeInfoクラスを使用して取得する方法

SOQLを使わずにレコードタイプを取得する方法です。
Describe情報にレコードタイプ情報も含まれているので、そこから

Schema.DescribeSObjectResult R = Account.SObjectType.getDescribe();
List<Schema.RecordTypeInfo> RT = R.getRecordTypeInfos();
for (Schema.RecordTypeInfo info : RT) {
    info.getRecordTypeId();    // レコードタイプID
    info.getName();    // レコードタイプラベル名
    info.getDeveloperName();    // レコードタイプAPI参照名
}

DeveloperNameで抽出するには、for文の中で判定しないといけないのでちょっと煩わしいところですが、SOQLを実行しないので、SOQLコール数が抑えられます

getRecordTypeInfosByNameというメソッドがあり、Mapで取得してそこからレコードタイプ情報を引っ掛けることも可能ですが、MapのキーはDeveloperNameではなくNameなので個人的には非推奨です。

Schema.DescribeSObjectResult R = Account.SObjectType.getDescribe();
Map<String, Schema.RecordTypeInfo> rtMap = R.getRecordTypeInfosByName();
RecordTypeInfo rtInfo = rtMap.get(★レコードタイプ名);

RecordTypeとRecordTypeInfoの違い

SQOLで使用するRecordTypeオブジェクトとApexのクラスであるRecordTypeInfo
基本的に同じ情報を持っていますが、一方にしかないものもあります。

定義書を見た感じだとこんなところでした。

Recordにしか持っていないもの。

  • ビジネスプロセス(BusinessProcessId)
  • 説明の取得(Description)
  • 名前空間の取得(NamespacePrefix)

RecordTypeInfoでしか取得できないもの。

  • マスタレコードタイプかどうかの確認(isMasterメソッド)
  • ログインしているユーザがデフォルト(isDefaultRecordTypeMappingメソッド)
  • ログインしているユーザが使用可能かどうかの確認(isAvailableメソッド)

ちなみに、isActiveとisAvailableの違いは、レコードタイプ自体が有効(isActive)か、そのユーザがレコードタイプを使用できるか(isAvailable)の違いです。
当然、後者はプロファイルが変われば返す値も変わります。

Apexから説明や名前空間などを取りに行く場面ってそうそうないので、あまり意識することはないかな。

まとめ

それぞれのメリット・デメリットを。

SQOLから取得
メリット

  • API名を指定しての取得ができる

デメリット

  • SOQLコール数が消費される

Describeから取得
メリット

  • SOQLコール数を消費しない

デメリット

  • API名で一本釣りができない(一度ループさせないと検出ができない)

ほぼ裏表の関係ですね。

コメント