Memos About Salesforce

Salesforceにハマってたこと!

DescribeSObjectResult クラスのgetRecordTypeInfosByDeveloperName()メソッド

こんにちは、管理人の@Salesforce.Zです。

Method does not exist or incorrect signature: void getRecordTypeInfosByDeveloperName() from the type Schema.DescribeSObjectResult

レコードタイプのIDを取得したくて、なぜなら

Salesforceトリガを実装する時にRecordTypeIdは直接アクセスできるが

RecordType.DevelopedNameは直接アクセスできない

レコードタイプ別に処理を行う時に、レコードタイプを知る必要があります。

では、トリガでクエリを発行する?消費してしまうですね

そこで、DescribeSObjectResult クラスが登場する

目次

レコードタイプ

環境による、レコードタイプIDが変わる

トリガを実装する場合、クエリを発行しない限り

レコードタイプIDしか分からないはずです。

では、IDをハードコーディングして判別できるが、環境が変わると IDも変わるので、コードを修正する必要がある。

そこで、今回、発想できたのが

レコードタイプの開発名を使い、レコードタイプのIDを取得する

取得したレコードタイプのIDとトリガのsObject.RecortTypeIdを比較し

判別する考えです。

レコードタイプの開発名は変わらない

レコードタイプの開発名はテスト環境も本番環境も同じです。

この変わらない開発名を使い、随時にレコードタイプのIDを取得することが可能です。そしてクエリを消費しません。

方法としてはDescribeSObjectResult クラスのgetRecordTypeInfosByDeveloperName()メソッドです。

例えば、取引先に営業と開発のレコードタイプがあります。

# レコードタイプの表示ラベル レコードタイプ名(開発名) レコードタイプID
1 営業 SalesRecordType 環境によって異なる
2 開発 DevRecordType 環境によって異なる

このレコードタイプの開発名が変わらない点とDescribeSObjectResult クラスのgetRecordTypeInfosByDeveloperName()メソッドでトリガ内で、簡単にクエリを消費せずにレコードタイプのIDを取れる

サンプルコード

String salesRecrodTypeId = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('レコードタイプの開発名').getRecordTypeId();

if(Trigger.New[0].RecordTypeId == salesRecrodTypeId){
    // 営業レコードタイプの場合の処理等
}

メソッド使えない

エラー:Schema getRecordTypeInfosByDeveloperName() method does not exists.

これが単純にクラスのバージョン問題です。

クラスのバージョンを43以上にしてください。

それで、使えるようになります。

クラスの一覧で対象のクラスを編集モードにすれば、下記の設定が可能です。

変更場所はSalesforce APIのバージョンです。

f:id:jude2016:20190228183120p:plain
クラスバージョン変更イメージ

リファレンス

DescribeSObjectResult クラス

メソッド使用できないエラー